2013-08-07 2 views
3

int x;
__asm ​​__volatile ("movl % 0, %% sp": "= r"("% sp"));
sp를 x에 저장하고 싶습니다.
오류 :iOS 오류의 인라인 asm


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 인라인 어셈블리에서 '%'는 _operand_를 나타냅니다. 디폴트 AT & T 어셈블리 구문이 레지스터의 접두어로 '%'를 사용하는 x86에서 gcc의 인라인 asm을 사용하여 '%%'라고 쓰는 경우가 있습니다. 즉, 'EAX'를 복사하는 'mov %% eax, % 0' reg을 첫 번째 출력 피연산자로 변환합니다. ARM의 어셈블리 구문에는 레지스터를 나타내는 데 '%'가 필요하지 않으며 레지스터 이름은 예약 된 키워드입니다 (예 : 'sp'라는 레이블은 사용할 수 없습니다). 여전히, 제 게시물에 표시된 것처럼, 여러분이 제공 한 코드의 변형은 ARM 전용이며, _ 특정의 것은 (sp를 읽는) CPU 독립적 인 코드 일 수 있습니다. 내 대답을 보라. –

1

이 특정한 경우에 작동하는 무슨이다 :

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

그것은 ARM 및 x86 사이에서도 휴대용입니다 ...

0

당신은 ARM에 대한 86 어셈블리를 조립하려고합니다 CPU.