2011-04-25 6 views
1

FreeBSD 64 비트에서 실행하려고했던 C 프로그램에서 어셈블리 코드 조각이 발생했습니다.gcc의 어셈블리 문과 관련된 문제

void *curbrk; 
__asm__ __volatile__(
     "movl .curbrk, %%eax;" 
     "movl %%eax, %0" 
      : "=r" (curbrk) 
      :: "%eax" 
    ); 

I는 GET "MOV 접미어 없거나 피연산자"나는 코드를 사용해야 구문 판정 무엇 (상기 코드 & T의 구문을 이하)와 같은 에러 -. 컴파일러 (GCC은 & T의 구문을 아래와을) 또는 프로세서 (저는 인텔 프로세서를 사용하고 있습니다). 문제는 코드가 AT & T 구문에 있거나 다른 것이 있습니까?

답변

4

64 비트 GCC를 사용하는 경우 64 비트 포인터 값이 32 비트 EAX에 맞지 않으므로 -m32 스위치를 사용하여 32 비트 오브젝트 코드를 출력하지 않으면 위의 코드가 완료되지 않습니다 레지스터. -m32를 사용하여 32 비트 출력을 생성하거나 eax의 rax inplace를 사용하고 movl을 mov로 변경하십시오 ('l'제외)

+0

GCC의 인라인에서'movq' 대신'mov'를 선택하는 이유를 알고 계십니까? amd64 명령어에 대한 어셈블리 구문? –

+1

@Pascal :'mov'와'movq' 둘 다 사용할 수 있습니다 :'mov'는 어셈블러가 목표 데이터 크기를 "추측"하도록 지시하는 반면,'movq'는 우리가 64 비트 값을 말하고 있음을 나타냅니다. 예를 들어, 어셈블러는 변수'foo'의 크기를 알지 못하기 때문에'mov 0, foo'는 컴파일되지 않습니다. 반면에'mov 0, %% rax'는'movq'로 암시 적으로 이해됩니다. 왜냐하면'% rax '는 64 비트 레지스터입니다. GCC는 위의 것을 이해하지 못한다 : 인라인 어셈블리에서, GCC는 문자열을 생성 된 어셈블리로 덤프한다. ('%'대신) _assembler_가이를 처리한다. –