2010-08-10 4 views
5

내가 ++ 윈도우 VC에 다음 코드가있는 경우 :GCC 인라인 어셈블리 : 전화 DWORD PTR

DWORD somevar = 0x12345678; 
_asm call dword ptr [somevar] 

가 어떻게 & T 구문 AT로, GCC 인라인 어셈블리에서 같은 일을 할 수 있습니까?

__asm__ __volatile__ (
    "call dword ptr [%%edx]" : : 
    "d" (somevar) 
); 

나는 이런 식으로 뭔가를 시도했지만, 그것이 "정크"오류가 발생합니다 ...

그리고 나는, ptr, 일부 레지스터에 somevar를 전달하는 데 노력하고 dword로 변환 등,하지만 나는 그것을 작동시키지 못했습니다.

UPDATE : 나는 우리가이 경우에 대신 괄호 괄호를 사용해야 할 것으로 보인다처럼 유용 할 무언가를 발견, 나는 far로 전화를 lcall 뭔가를 발견했다. 그러나 나는 아직도 내가 어떻게 재현 할 수 있는지 이해할 수 없다. dword ptr.

답변

7

당신은 AT & T 어셈블러 구문과 함께 DWORD PTR 또는 이와 유사한 것을 사용하지 마십시오. 피연산자 길이는 일반적으로 레지스터 이름 (니모닉에 접미어를 제공하는 옵션이 있습니다)에서 가져옵니다.이 옵션은 asm()에 제공 한 C 피연산자의 크기에서 가져옵니다. 이것은 x86_64 또는 i386 아키텍처 용으로 컴파일하면이 예제가 실행된다는 의미이므로 인라인 어셈블러의 매우 훌륭한 속성입니다.

#include <stdio.h> 
void p() 
{ 
    puts("Hallo"); 
} 
typedef void (*fp)(); 
int main() 
{ 
    fp var=&p; 
    var(); 
    // put 'var' in a register, the '*' says call indirect: 
    asm volatile ("call *%0"::"r"(var)); 
} 

당신은 코드 GCC가 생성 읽기 AT & T를 배우기 위해 (-S를 컴파일 시도) 할 수 있습니다 첫 번째 경우, 어셈블리는 두 번째 경우에는 call *%edx이되고, call *%rdx과 같이된다 통사론. 또한 같은 몇 가지 소개를 구글하려고 :

경고 : GCC와 인라인 어셈블리는 사소한 문제가 아니다. 이는 대부분의 다른 컴파일러가 아닌 옵티마이 저가 작동하도록 설계 되었기 때문입니다. 제약 조건 ("r")이 의미하는 것과 의미있는 것을 실제로 이해해야합니다. 그렇지 않으면 상상할 수없는 방식으로 코드가 손상됩니다. "조기 청소기"가 무엇인지 대답하기 전에 사용법을 생각하지 마십시오.

관련 문제