2013-08-07 2 views
3

int x;
__asm ​​__volatile ("movl% 0, %% sp": "= r" (x) :: "% sp");
Я хочу хранить sp до x.
Ошибка:Inline asm in iOS error


error: unexpected token in operand 
    __asm __volatile("movl %0, %%sp":"=r"(x)::"%sp"); 
        ^
:1:13: note: instantiated into assembly here 
     movl r0, %sp 
       ^
1 warning and 1 error generated. 

ответ

3

Я нашел свое решение:

asm volatile("mov %0, sp \n\t":"=r"(x)); 
+0

При чтении документа, он сказал, что% используются для обозначения регистра. Однако это неверно. – teddy

+1

В сборке gcc inline '%' указывает на _operand_. На x86, где синтаксис сборки AT & T по умолчанию использует '%' в качестве префикса для регистра, иногда приходится писать '%%' с встроенным asm gcc, т. Е. Как' mov %% eax,% 0', чтобы скопировать 'EAX' reg в первый выходной операнд. Синтаксис сборки в ARM не требует '%' для указания регистров, вместо этого имена регистров являются зарезервированными ключевыми словами (например, вы не можете иметь метку с именем 'sp', например). Тем не менее, как указано в моем сообщении, вариант кода, который вы указали, является только ARM, тогда как эта специфическая вещь (чтение 'sp') может быть записана независимо от процессора. См. Мой ответ. –

1

Что работает для этого конкретного случая является:

register void* sp __asm__("sp"); 
__asm__("" : "+r"(sp) :: "memory"); 

Это даже портативным между ARM и x86 ...

0

Вы пытаетесь собрать сборку x86 для ARM ЦПУ.