2014-09-01 4 views
3

) 레이블의 주소를 64 비트 레지스터로 옮기려고하고 있습니다.레이블을 64 비트 레지스터로 이동 - 인라인 어셈블리 (GCC/CLANG)

이 나는군요 :

asm ("mov $label, %rax"); // Tried movq, movl (No difference) 
... 
asm volatile("label:"); 
... 

이 왜 나를 못하게 :

여기 내가 할 노력하고있어의 예
fatal error: error in backend: 32-bit absolute addressing is not supported in 64-bit mode 

? 32 비트 레지스터에만 레이블을 옮길 수 있습니까? 64 비트 레지스터에 해당 레이블의 주소를 삽입해야합니다. 그 때 어떻게하면됩니까?

감사

+0

계산 된 코드를 사용하여 어셈블러 코드를 피할 수 있습니다 (예 : [값 레이블] (https://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html) GCC 확장). –

+0

'eax'로 옮기려고 했습니까? 나는 그것이 그것이 말하는 것을 의미한다고 생각한다. Mac OS X에 있습니다. 필자는 Mac에서 모든 64 비트 코드가 상대적으로 찢어진다고 생각합니다. 절대 주소는 지원되지 않으므로 레지스터에 주소를로드 할 수 없습니다. – Gene

+0

작성한대로 오류없이이 코드를 컴파일 할 수있었습니다. 더 자세한 내용/상황을 제공해야합니다. 또한 "asm 문은 다른 asm 문으로 점프하지 않을 수도 있습니다"(https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html), 맞습니까? 아마 당신은 당신이 실제로하려고하는 것을 기술해야하고 그래서 더 유용한 대답이 제공 될 수 있습니다. –

답변

1

두 어셈블리 구문 중 하나를 시도는 :

asm ("movabs $label, %rax"); 
asm ("lea label(%rip), %rax"); 

첫 번째 64 비트 즉각적인 피연산자 (및 64 비트 절대 재배치)를 사용하여 두 번째 사용하지만 RIP 상대 주소 지정. 두 번째 선택은 아마도 단축되어 있으므로 가장 좋을 것입니다. 그러나 label은 2^31 바이트 내에 있어야합니다.

그러나 David Wohlferd가 지적했듯이 코드가 제대로 작동하지 않을 수 있습니다.