Грешка вграден asm в 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 използва % като префикс за регистър, понякога трябва да се напише %% с вграден asm на gcc, т.е. като mov %%eax, %0, за да се копира EAX reg в първия изходен операнд. Синтаксисът на асемблиране на 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