2008-10-14 6 views
129

L'option gcc -S génère le code d'assemblage dans la syntaxe AT & T, existe-t-il un moyen de générer des fichiers dans la syntaxe Intel? Ou y a-t-il un moyen de convertir entre les deux?Comment utilisez-vous gcc pour générer du code d'assemblage dans la syntaxe Intel?

+5

Vous pouvez convertir facilement des instructions simples dans le shell avec llvm-mc: 'echo" packsswb mm0, [bp + si-0x54] "| llvm-mc-3.2 -x86-asm-syntax = intel' donne 'packsswb \t -84 (% bp,% si),% mm0' –

Répondre

169

Avez-vous essayé?

gcc -S -masm=intel test.c 

Untested, mais je l'ai trouvé dans cette forum où quelqu'un a affirmé qu'il travaillait pour eux.

Je viens d'essayer ce sur le mac et il a échoué, alors je regardais dans ma page man:

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

Il peut travailler sur votre plate-forme.

Pour Mac OS X:

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

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

+1

-masm = intel fonctionne sur mon debian/i386. – Jichao

+1

Confirmé de travailler sur Ubuntu Karmic x64 ainsi. – Thomas

+0

A travaillé sur mon MingGW 3.4.5. Merci beaucoup! –

15

Le

gcc -S -masm=intel test.c 

fonctionne bien avec moi. Mais je peux dire d'une autre façon, même si cela n'a rien à voir avec l'exécution de gcc. Compile l'exécutable ou le fichier de code objet et désassembler le code objet dans la syntaxe Intel asm avec objdump comme ci-dessous:

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

Cela pourrait aider.

+3

même que objdump -d -M intel –

5

Je possède ce code dans le fichier RPC:

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

C'est le code travaillé avec cette ligne de commande GCC:

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

Il en résultera un fichier * .exe, et cela a fonctionné dans mon expérience.

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. 

C'est tout.

+0

Ne fonctionne pas sur mon Fedora: '$ gcc -S -masm = intel -mconsole ac -o a.out gcc: erreur: option de ligne de commande non reconnue '-mconsole'' – d33tah

+0

Fonctionne en cygwin. L'assemblage va comme intel, sort comme intel dans le fichier .s. Si vous utilisez '-o a.out', vous n'obtiendrez pas de fichier .s. – Orwellophile

Questions connexes