openlang

gcc에서 AT&T 대신 Intel 스타일의 어셈블리를 출력하려면?

gcc -S으로 나오는 어셈블리는 AT&T 문법인데, 대신 Intel 문법으로 파일을 출력하게 할 수 있나요? 아니면 한 문법을 다른 문법으로 변환할 수 있나요?

영어에서 번역원문 보기

이어지는 대화 3

서로의 근거를 따라
  1. 고유 링크

    -masm=intel을 전달하세요

    gcc -S -masm=intel -Og -fverbose-asm sample.c

    GCC와 3.5부터의 Clang에서 동작합니다. GCC manual (https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html#index-masm_003ddialect):

    -masm=dialect 요청한 문법으로 어셈블리 명령을 출력합니다. 설정은 intel과 att이고 기본값은 att입니다. Darwin에서는 Intel을 지원하지 않습니다.

    macOS에서는 GCC 자체를 따로 설치하지 않았다면(예를 들어 Brew로) gcc가 보통 Clang을 실행한다는 점을 기억하세요. 현재 clang은 -masm=intel도 같은 옵션으로 받아들이지만, clang에서는 예전부터 다음을 쓸 수 있었습니다 (https://stackoverflow.com/a/11957826/950427):

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

    clang 14 (https://reviews.llvm.org/D113707) 이전에는 GCC (https://stackoverflow.com/questions/9347909/can-i-use-intel-syntax-of-x86-assembly-with-gcc)와 달리 이 옵션이 clang의 인라인 asm() 문장 처리 방식을 바꾸지 않는다는 점을 기억하세요.

    Arden Fenwick이 관리하는 Compiler Explorer는 이 옵션들을 기본값으로 씁니다: https://godbolt.org/

    추가 옵션과 읽을 만한 어셈블리 목록을 얻는 요령은 GCC/clang 어셈블리 출력의 군더더기 줄이기 (https://stackoverflow.com/questions/38552116/how-to-remove-noise-from-gcc-clang-assembly-output)를 보세요.

    영어에서 번역원문 보기
  2. 고유 링크

    이 명령은

    gcc -S -masm=intel sample.c

    제 경우에 동작합니다. gcc를 실행하는 것과는 상관없지만 다른 방법도 있어요. 실행 파일이나 오브젝트 파일을 먼저 빌드한 뒤, 아래처럼 objdump로 그 오브젝트를 Intel 어셈블리 문법으로 디스어셈블하세요:

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

    도움이 될지도 모르겠네요.

    영어에서 번역원문 보기
  3. 고유 링크

    제 CPP 파일 내용은 이렇습니다:

    #include <conio.h>
    #include <stdio.h>
    #include <windows.h>
    
    int result = 0;
    int main(int count, char *items[]) {
      asm("mov eax, 0xEE");
      asm("mov _result, eax");
      printf("result contains %d\n", result);
      getch();
      return 0;
    };

    이 GCC 명령으로 저 코드를 동작시켰어요:

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

    결과로 *.exe 파일이 나오고, 제 경우에는 잘 실행됐어요.

    Remarks:
    for an immediate operand, use _variable for a global variable rather than a local one.
    exampel: mov _itemCount, eax NOT mov $itemCount, eax or mov itemCount, eax
    
    Hexadecimal numbers require at&t notation instead of intel notation.
    example: mov eax, 0xEE -> TRUE, mov eax, 0EEh -> FALSE.

    이상입니다.

    영어에서 번역원문 보기

같은 질문의 다른 갈래

  1. TSV 안의 평범한 문자열 때문에 invalid command name "Dana"가 떠요, 왜죠?

    하, 이거 때문에 계속 헛돌고 있어요. Arch에서 Tcl 9.0, tclsh main.tcl로 돌리고 있고, 고객사 하드웨어 자재 사이트용 작은 주문 리포트예요. config.tcl에 규칙이 하나(total >= 200)만…

    답글 1최근 활동 tcl
  2. ECMA-262에는 이벤트 루프가 없다

    ECMA-262에는 이벤트 루프라는 말이 한 번도 안 나와요. 명세가 정의하는 건 잡(job)과, 프로미스 반응이 실행될 준비가 됐을 때 엔진이 호출하는 HostEnqueuePromiseJob이라는 호스트 훅이에요. 그 잡을…

    답글 2최근 활동 javascriptdart