164 votes

Comment utiliser gcc pour générer du code assembleur en syntaxe Intel ?

El gcc -S génère du code assembleur en syntaxe AT&T. Existe-t-il un moyen de générer des fichiers en syntaxe Intel ? Ou existe-t-il un moyen de convertir entre les deux ?

5 votes

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

214voto

Jason Dagit Points 5998

Utilice -masm=intel

gcc -S -masm=intel -Og -fverbose-asm test.c

Cela fonctionne avec GCC, et clang3.5 et plus. Manuel GCC :

  • -masm=dialect
    Sortie des instructions asm en utilisant le dialecte sélectionné. Les choix supportés sont intel ou att (le choix par défaut). Darwin ne supporte pas intel.

Pour Mac OSX, notez que par défaut, l'option gcc exécute réellement clang. Les clang modernes supportent -masm=intel comme un synonyme de cela, mais cela fonctionne toujours avec clang :

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

Notez que jusqu'à ce que clang 14 ce qui fait no changer la façon dont clang traite en ligne asm() déclarations, contrairement à GCC .

Ce sont les options utilisées par défaut par le site Compiler Explorer de Matt Godbolt : https://godbolt.org/
Voir aussi Comment supprimer le "bruit" de la sortie de l'assemblage GCC/clang ? pour d'autres options et conseils pour obtenir une sortie asm intéressante à regarder.

0 votes

Malgré son nom de fichier incorrect att2intel.sed, ce sed script convertit dans l'autre sens, d'Intel à ATT.

0 votes

Quelqu'un a-t-il une solution pour Mac ?

0 votes

Clang ne peut actuellement pas consommer la syntaxe Intel. Voir Bogue LLVM 24232 : [X86] Les opérations d'assemblage en ligne ne fonctionnent pas avec .intel_syntax. . De plus, Clang ignore prefix / noprefix (je ne suis pas sûr que cela ait de l'importance si Clang consomme l'assemblage).

18voto

phoxis Points 14005

Le site

gcc -S -masm=intel test.c

Ça marche avec moi. Mais je peux vous proposer un autre moyen, bien que cela n'ait rien à voir avec l'exécution de gcc. Compilez l'exécutable ou le fichier de code objet, puis désassemblez le code objet en syntaxe Intel asm avec objdump comme ci-dessous :

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

Cela pourrait aider.

4 votes

Même que objdump -d -M intel

5voto

RizonBarns Points 41

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

Ce code a fonctionné 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 votes

Ne fonctionne pas sur mon Fedora : $ gcc -S -masm=intel -mconsole a.c -o a.out gcc: error: unrecognized command line option ‘-mconsole’

0 votes

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

2 votes

Il s'agit d'une manière défectueuse d'utiliser l'asm en ligne, et elle sera défectueuse si l'optimisation est activée. Vous modifiez eax y a dans les déclarations asm sans en informer le compilateur. Voir stackoverflow.com/tags/inline-assembly/info pour les guides. -masm=intel est l'option correcte pour rendre la syntaxe à l'intérieur de les modèles asm fonctionnent, mais utiliser l'asm de base au lieu de l'asm étendu avec des contraintes est très mauvais.

-5voto

Cody Brocious Points 24042

Malheureusement, gcc ne peut pas le faire et la conversion est difficile car certaines instructions d'AT&T prennent les opérandes dans le même ordre qu'Intel, il faut donc faire des cas particuliers. De plus, certaines conversions pour la taille où le déréférencement de la mémoire et autres peuvent être difficiles. Votre meilleure chance est d'utiliser un désassembleur qui fera ce que vous voulez et de vous assurer que vous faites référence aux fichiers de symboles et autres. Cela vous permettra de faire 99 % du chemin.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X