94 votos

¿Cómo se usa el GCC para generar código ensamblador en la sintaxis de Intel?

El gcc -S generará código ensamblador en la sintaxis de AT&T, ¿hay alguna forma de generar archivos en la sintaxis de Intel? ¿O hay una forma de convertir entre los dos?

125voto

Jason Dagit Puntos 5998

¿Has probado esto?

gcc -S -masm=intel test.c

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

Acabo de probar esto en el mac y falló, así que busqué en mi página de hombre:

   -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: http://stackoverflow.com/a/11957826/950427

11voto

phoxis Puntos 14005

El

gcc -S -masm=intel test.c

Funciona conmigo. Pero puedo decir otra cosa, aunque esto no tiene nada que ver con el funcionamiento de GCC. Compila el ejecutable o el archivo de código objeto y luego desensambla el código objeto en sintaxis Intel asm con objdump como se muestra a continuación:

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

Esto podría ayudar.

5voto

RizonBarns Puntos 41

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 del 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.

-5voto

Cody Brocious Puntos 24042

Desafortunadamente gcc no puede hacer esto y la conversión es difícil porque algunas instrucciones en AT&T toman operandos en el mismo orden que los de Intel, por lo que hay que tener un caso especial. Además, algunas conversiones para el tamaño donde la derivación de la memoria y tal puede ser difícil. Lo mejor es usar un desensamblador que haga lo que quieras y asegúrate de hacer referencia a los archivos de símbolos y demás. Esto le permitirá llegar al 99% del camino.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X