¿Cómo se usa gcc para generar código de ensamblaje en la sintaxis de Intel?

151

La gcc -Sopción generará código de ensamblaje en la sintaxis de AT&T, ¿hay alguna forma de generar archivos en la sintaxis de Intel? ¿O hay una manera de convertir entre los dos?

hiperlogico
fuente
55
puede convertir instrucciones individuales fácilmente en el shell con llvm-mc: echo "packsswb mm0,[bp+si-0x54]" | llvm-mc-3.2 -x86-asm-syntax=inteldapacksswb -84(%bp,%si), %mm0
Janus Troelsen

Respuestas:

198

¿Has probado esto?

gcc -S -masm=intel test.c

No probado, pero lo encontré en este foro donde alguien afirmó que funcionaba para ellos.

Acabo de probar esto en Mac y falló, así que busqué en mi 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.

Puede funcionar en su plataforma.

Para Mac OSX:

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

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

Jason Dagit
fuente
A pesar de su nombre de archivo incorrecto att2intel.sed, ese script sed se convierte de la otra manera, de Intel a ATT.
Jonathon Reinhart
¿Alguien tiene una solución para Mac?
Joshua Cheek
Clang no puede consumir actualmente la sintaxis de Intel. Consulte el error LLVM 24232: [X86] Los operandos de ensamblaje en línea no funcionan con .intel_syntax . Además, Clang ignora prefix/ noprefix(no estoy seguro si importa si Clang consume el ensamblado).
jww
17

los

gcc -S -masm=intel test.c

Funciona conmigo Pero puedo decir de otra manera, aunque esto no tiene nada que ver con ejecutar gcc. Compile el archivo ejecutable o el código del objeto y luego desmonte el código del objeto en la sintaxis de Intel asm con objdump como se muestra a continuación:

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

Esto puede ayudar.

foxis
fuente
3
igual que objdump -d -M intel
David 天宇 Wong
5

Tengo este código en el archivo 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;
 };

Ese código funcionó con esta línea de comando GCC:

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

Resultará un archivo * .exe, y funcionó en mi experiencia.

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.

Eso es todo.

RizonBarns
fuente
No funciona en mi Fedora:$ gcc -S -masm=intel -mconsole a.c -o a.out gcc: error: unrecognized command line option ‘-mconsole’
d33tah
Trabaja en cygwin. El ensamblaje entra como intel, sale como intel en el archivo .s. Si lo usa -o a.out, no obtendrá un archivo .s.
Orwellophile