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?


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


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.


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.