gcc를 사용하여 인텔 구문으로 어셈블리 코드를 생성하는 방법은 무엇입니까?


151

gcc -S옵션은 AT & T 구문으로 어셈블리 코드를 생성합니다. 인텔 구문으로 파일을 생성하는 방법이 있습니까? 아니면 둘 사이를 변환하는 방법이 있습니까?


5
llvm-mc로 쉘에서 단일 명령어를 쉽게 변환 할 수 있습니다 : echo "packsswb mm0,[bp+si-0x54]" | llvm-mc-3.2 -x86-asm-syntax=intelgivespacksswb -84(%bp,%si), %mm0
Janus Troelsen

답변:


198

이것을 시도 했습니까?

gcc -S -masm=intel test.c

테스트를 거치지 않았지만 누군가가 그것을 위해 일한다고 주장한 이 포럼 에서 발견되었습니다 .

방금 Mac에서 이것을 시도했지만 실패했기 때문에 맨 페이지를 보았습니다.

   -masm=dialect
       Output asm instructions using selected dialect.  Supported choices
       are intel or att (the default one).  Darwin does not support intel.

플랫폼에서 작동 할 수 있습니다.

Mac OSX의 경우 :

clang++ -S -mllvm --x86-asm-syntax=intel test.cpp

출처 : https://stackoverflow.com/a/11957826/950427


잘못된 파일 이름 att2intel.sed에도 불구하고 해당 sed 스크립트는 다른 방법으로 Intel에서 ATT로 변환합니다.
Jonathon Reinhart

누구나 Mac 용 솔루션이 있습니까?
Joshua Cheek

Clang은 현재 인텔 구문을 사용할 수 없습니다. LLVM 버그 24232 : [X86] 인라인 어셈블리 피연산자가 .intel_syntax와 함께 작동하지 않음을 참조하십시오 . 또한 Clang은 prefix/를 무시합니다 noprefix(Clang이 어셈블리를 소비하는지 중요하지 않은지).
jww

17

그만큼

gcc -S -masm=intel test.c

나와 함께 작동합니까? 그러나 이것은 다른 방법으로 말할 수 있지만 gcc를 실행하는 것과는 아무런 관련이 없습니다. 실행 파일 또는 객체 코드 파일을 컴파일 한 후 다음과 같이 objdump를 사용하여 Intel asm 구문으로 객체 코드를 디스 어셈블하십시오.

 objdump -d --disassembler-options=intel a.out

도움이 될 수 있습니다.


3
objdump -d -M 인텔과 동일
David 天宇 Wong

5

이 코드는 CPP 파일에 있습니다.

#include <conio.h>
#include <stdio.h>
#include <windows.h>

int a = 0;
int main(int argc, char *argv[]) {
    asm("mov eax, 0xFF");
    asm("mov _a, eax");
    printf("Result of a = %d\n", a);
    getch();
    return 0;
 };

이 코드는이 GCC 명령 줄에서 작동했습니다.

gcc.exe File.cpp -masm=intel -mconsole -o File.exe

결과적으로 * .exe 파일이 생성되며 제 경험에 만족합니다.

Notes:
immediate operand must be use _variable in global variabel, not local variable.
example: mov _nLength, eax NOT mov $nLength, eax or mov nLength, eax

A number in hexadecimal format must use at&t syntax, cannot use intel syntax.
example: mov eax, 0xFF -> TRUE, mov eax, 0FFh -> FALSE.

그게 다야.


내 페도라에서 작동하지 않습니다 :$ gcc -S -masm=intel -mconsole a.c -o a.out gcc: error: unrecognized command line option ‘-mconsole’
d33tah

cygwin에서 작동합니다. 어셈블리는 인텔로 들어가고 .s 파일에서 인텔로 나옵니다. 사용 -o a.out하면 .s 파일을 얻지 못합니다.
Orwellophile
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.