2008-10-14 24 views
129

La opción gcc -S generará el código de ensamblado en AT & sintaxis T, ¿hay alguna forma de generar archivos con sintaxis Intel? ¿O hay una forma de convertir entre los dos?¿Cómo se usa gcc para generar código ensamblador en la sintaxis Intel?

+5

puede convertir instrucciones simples fácilmente en el shell con llvm-mc: 'echo" packsswb mm0, [bp + si-0x54] "| llvm-mc-3.2 -x86-asm-syntax = intel' da 'packsswb \t -84 (% bp,% si),% mm0' –

Respuesta

169

¿Has probado esto?

gcc -S -masm=intel test.c 

no probado, pero me encontré en este forum donde alguien decía que trabajaba para ellos.

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

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

Se puede trabajar en su plataforma.

Para Mac OS X:

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

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

+1

-masm = intel funciona en mi debian/i386. – Jichao

+1

Confirmado para trabajar en Ubuntu Karmic x64 también. – Thomas

+0

Trabajé en mi MingGW 3.4.5. ¡Muchas gracias! –

15

El

gcc -S -masm=intel test.c 

funciona con mí. Pero puedo decir de otra manera, aunque esto no tiene nada que ver con la ejecución de gcc. Compila el ejecutable o el archivo de código objeto y luego desmonte el código objeto en la sintaxis de ensamblador Intel con objdump de la siguiente manera:

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

Esto podría ayudar.

+3

igual que objdump -d -M intel –

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; 
}; 

de ese código trabajó con esta línea de comandos GCC:

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

El resultado será 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.

+0

No funciona en mi Fedora: '$ gcc -S-masm = intel -mconsole ac -o a.out gcc: error: opción de línea de comando no reconocida '-mconsole'' – d33tah

+0

Funciona en cygwin. El ensamblado entra como intel, sale como intel en el archivo .s. Si usa '-o a.out', no obtendrá un archivo .s. – Orwellophile

Cuestiones relacionadas