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