Como você usa o gcc para gerar código de montagem na sintaxe da Intel?

151

A gcc -Sopção gerará código de montagem na sintaxe da AT&T. Existe uma maneira de gerar arquivos na sintaxe da Intel? Ou existe uma maneira de converter entre os dois?

hiperlógico
fonte
5
você pode converter instruções individuais facilmente no shell com llvm-mc: echo "packsswb mm0,[bp+si-0x54]" | llvm-mc-3.2 -x86-asm-syntax=intelpacksswb -84(%bp,%si), %mm0
Janus Troelsen

Respostas:

198

Você já tentou isso?

gcc -S -masm=intel test.c

Não testado, mas o encontrei neste fórum em que alguém afirmou que funcionava para eles.

Eu apenas tentei isso no mac e ele falhou, então procurei na minha página de manual:

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

Pode funcionar na sua plataforma.

Para Mac OSX:

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

Fonte: https://stackoverflow.com/a/11957826/950427

Jason Dagit
fonte
Apesar do nome de arquivo incorreto att2intel.sed, o script sed é convertido de outra maneira, da Intel para ATT.
Jonathon Reinhart 28/06
Alguém tem uma solução para Mac?
18730 Joshua Cheek
Atualmente, o Clang não pode consumir a sintaxe da Intel. Consulte Bug LLVM 24232: Os operandos de montagem [X86] inline não funcionam com .intel_syntax . Além disso, Clang ignora prefix/ noprefix(não tem certeza se importa se Clang consome a montagem).
JWW
17

o

gcc -S -masm=intel test.c

Funciona comigo. Mas posso dizer de outra maneira, embora isso não tenha nada a ver com a execução do gcc. Compile o arquivo executável ou o código de objeto e desmonte o código de objeto na sintaxe Intel asm com objdump, conforme abaixo:

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

Isso pode ajudar.

phoxis
fonte
3
o mesmo que objdump -d -M intel #
11554 David 天宇 Wong 20/10
5

Eu tenho esse código no arquivo 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;
 };

Esse código funcionou com esta linha de comando do GCC:

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

Isso resultará no arquivo * .exe e funcionou na minha experiência.

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.

Isso é tudo.

RizonBarns
fonte
Não funciona no meu Fedora:$ gcc -S -masm=intel -mconsole a.c -o a.out gcc: error: unrecognized command line option ‘-mconsole’
d33tah 3/15
Trabalha em cygwin. Assembly entra como intel, sai como intel no arquivo .s. Se você usar -o a.out, não receberá um arquivo .s.
19616 Orwellophile