Ошибка встроенного ассемблера в iOS

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


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.

person teddy    schedule 07.08.2013    source источник


Ответы (3)


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

asm volatile("mov %0, sp \n\t":"=r"(x));
person teddy    schedule 14.08.2013
comment
При чтении документа было сказано, что % используется для обозначения регистра. Однако это не так. - person teddy; 14.08.2013
comment
Во встроенной сборке gcc % указывает на операнд. В x86, где синтаксис сборки AT&T по умолчанию использует % в качестве префикса для регистра, иногда приходится писать %% со встроенным ассемблером gcc, т. е. как mov %%eax, %0, чтобы скопировать регистр EAX в первый выходной операнд. Синтаксис ассемблера в ARM не требует % для обозначения регистров, вместо этого имена регистров являются зарезервированными ключевыми словами (например, у вас не может быть метки с именем sp). Тем не менее, как указано в моем сообщении, вариант кода, который вы указали, предназначен только для ARM, в то время как эта конкретная вещь (чтение sp) может быть написана независимо от процессора. Смотрите мой ответ. - person FrankH.; 14.08.2013

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

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

Он даже переносим между ARM и x86 ...

person FrankH.    schedule 09.08.2013

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

person Timothy Baldwin    schedule 13.08.2013