2011-11-01 5 views
2

x86 용 gcc 인라인 어셈블리에서 레지스터의 레이블 주소를 어떻게 이동시킬 수 있습니까? 어셈블러가 오류 레이블에 대한 정의되지 않은 참조를 제공하기 때문에 여기에 $ label 대신에 무엇이 있어야합니다.레지스터의 주소를 어떻게 바꿀 수 있습니까

레이블이 asm 블록, 즉 일반 C 코드 외부에 있음을 유의하십시오.

 __asm__ __volatile__ ("movl $label, %eax;"); 
label: 
     ..... 
+1

오류는 무엇인가? – ughoavgfhw

+1

어떤 어셈블러를 사용하고 있습니까? gcc 인라인 어셈블리? 가스? 경련? –

답변

0

내가 그것을 가지고는, 라벨은

__asm__ __volatile__ ("label:"); 
2

당신이 할 수있는 ... 이런 식으로, 어셈블리 블록에 싸여해야합니다

register unsigned long eax __asm__("eax"); // See [1] 
eax = &&label; // See [2] 

label: 
    // some code 

그러나 조심 : GCC 최적화 아래에서 코드를 재정렬 할 수 있으므로 C label은 예상 한 위치와 정확히 일치하지 않을 수 있습니다.

label의 정확한 배치가 필요한 경우 (예 : 일부 어셈블리 코드로 이동하기 때문에) 어셈블리 전체를 코딩하는 것이 좋습니다.

[1]은 http://gcc.gnu.org/onlinedocs/gcc/Local-Reg-Vars.html#Local-Reg-Vars

[2] http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html

관련 문제