Comment utilisez-vous gcc pour générer du code d'assemblage dans la syntaxe Intel?

151

L' gcc -Soption générera du 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?

hyperlogique
la source
5
vous pouvez facilement convertir des instructions simples dans le shell avec llvm-mc: echo "packsswb mm0,[bp+si-0x54]" | llvm-mc-3.2 -x86-asm-syntax=inteldonnepacksswb -84(%bp,%si), %mm0
Janus Troelsen

Réponses:

198

Avez-vous essayé cela?

gcc -S -masm=intel test.c

Non testé, mais je l'ai trouvé dans ce forum où quelqu'un a affirmé que cela fonctionnait pour eux.

J'ai juste essayé ceci sur le mac et cela a échoué, alors j'ai regardé dans ma page de manuel:

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

Cela peut fonctionner sur votre plateforme.

Pour Mac OSX:

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

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

Jason Dagit
la source
Malgré son nom de fichier incorrect att2intel.sed, ce script sed convertit dans l'autre sens, d'Intel en ATT.
Jonathon Reinhart
Quelqu'un a-t-il une solution pour Mac?
Joshua Cheek
Clang ne peut actuellement pas utiliser la syntaxe Intel. Consultez le bogue LLVM 24232: [X86] Les opérandes d'assemblage en ligne ne fonctionnent pas avec .intel_syntax . De plus, Clang ignore prefix/ noprefix(je ne sais pas si cela compte si Clang consomme l'assemblage).
jww du
17

le

gcc -S -masm=intel test.c

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

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

Cela pourrait aider.

phoxis
la source
3
idem objdump -d -M intel
David 天宇 Wong
5

J'ai ce code dans le fichier 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;
 };

C'est du code qui fonctionne 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é selon 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.

RizonBarns
la source
Ne fonctionne pas sur mon Fedora:$ gcc -S -masm=intel -mconsole a.c -o a.out gcc: error: unrecognized command line option ‘-mconsole’
d33tah
Fonctionne dans cygwin. L'assembly entre comme intel, sort comme intel dans le fichier .s. Si vous utilisez, -o a.outvous n'obtiendrez pas de fichier .s.
Orwellophile