Jak używać gcc do generowania kodu asemblera w składni Intela?

151

gcc -SOpcja będzie generować kod montaż w składni AT & T, czy istnieje sposób, aby wygenerować pliki w składni Intel? A może istnieje sposób na nawrócenie się między nimi?

hiperlogika
źródło
5
możesz łatwo konwertować pojedyncze instrukcje w powłoce za pomocą llvm-mc: echo "packsswb mm0,[bp+si-0x54]" | llvm-mc-3.2 -x86-asm-syntax=intelgivespacksswb -84(%bp,%si), %mm0
Janus Troelsen

Odpowiedzi:

198

Czy próbowałeś tego?

gcc -S -masm=intel test.c

Nietestowane, ale znalazłem to na tym forum, gdzie ktoś twierdził, że działa dla niego.

Właśnie wypróbowałem to na komputerze Mac i nie udało mi się, więc zajrzałem na stronę podręcznika:

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

Może działać na Twojej platformie.

W przypadku systemu Mac OSX:

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

Źródło: https://stackoverflow.com/a/11957826/950427

Jason Dagit
źródło
Pomimo niepoprawnej nazwy pliku att2intel.sed, ten skrypt seda konwertuje w drugą stronę, z Intela na ATT.
Jonathon Reinhart
Czy ktoś ma rozwiązanie dla komputerów Mac?
Joshua Cheek
Clang nie może obecnie korzystać ze składni Intela. Zobacz błąd LLVM 24232: [X86] Wbudowane operandy asemblera nie działają z .intel_syntax . Ponadto Clang ignoruje prefix/ noprefix(nie jestem pewien, czy ma znaczenie, jeśli Clang zużywa zespół).
jww
17

Plik

gcc -S -masm=intel test.c

Działa ze mną. Ale mogę powiedzieć inaczej, chociaż nie ma to nic wspólnego z uruchomieniem gcc. Skompiluj plik wykonywalny lub plik kodu obiektowego, a następnie zdemontuj kod wynikowy w składni Intel asm z objdump, jak poniżej:

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

To może pomóc.

phoxis
źródło
3
to samo co objdump -d -M intel
David 天宇 Wong
5

Mam ten kod w pliku 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;
 };

Ten kod działał z tym wierszem poleceń GCC:

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

Wynikiem będzie plik * .exe, który z mojego doświadczenia zadziałał.

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.

To wszystko.

RizonBarns
źródło
Nie działa na mojej Fedorze:$ gcc -S -masm=intel -mconsole a.c -o a.out gcc: error: unrecognized command line option ‘-mconsole’
d33tah
Działa w Cygwin. Zgromadzenie wchodzi jako Intel, pojawia się jako Intel w pliku .s. Jeśli używasz -o a.out, nie otrzymasz pliku .s.
Orwellophile