2014-04-11 4 views
1

내가 가지고 GNU C 프로그램에서 다음 코드를64 비트 포인터를 RAX 레지스터로 옮기는 방법은 무엇입니까?

void *segment = malloc(1024); 
asm volatile("mov $%0, %%rax" : : "r" (segment)); 

그리고 다음과 같은 오류 얻을 : %rax 뭐가 문제

Error: illegal immediate register operand %rax 

를?

+0

코드에 문제가 있습니다 ... 'asm ("": : "a"(세그먼트));을 사용할 수 있기 때문에 무엇이든'% rax '에 직접 명시 적으로 옮길 필요가 없습니다. 레지스터 수정 자''a ''는 "이 값이'[ER] AX'에 전달/반환 될 것으로 기대하고있다. 위의 어셈블리는 무의미합니다. 컴파일러는 그것을 버립니다. 'RAX'의 값으로 무엇을하고 싶은지 명확히하십시오. –

답변

0

FrankH의 요점은 유효하지만 엄격히 말하면이 오류의 원인은 달러 기호입니다. 어셈블러의 달러 기호는 상수를 나타내는 데 사용됩니다. 따라서 "mov $ 1, %% eax"가 작동합니다. 그러나 코드 생성 :

mov $%rax, %rax 

$ % rax는 (는) 의미가없고 오류가 발생합니다. malloc에이 RAX에 그 값을 반환합니다

void *segment = malloc(1024); 
asm volatile("mov %0, %%rax" : : "r" (segment)); 

때문에,이 (대부분) ", %의 RAX를 mov 인 %의 RAX"를 생성합니다 :이 오류를 해결합니다.

즉, 여전히 의미가없고 안전하지 않으며 비효율적이지만 오류없이 컴파일됩니다.

이 코드는 asm을 사용하는 것에 대해 배우기위한 것 이상을 목표로한다고 가정하면 더 유용한 답변을 얻으려면 자세한 내용을 제공해야합니다.