Bagaimana Anda menggunakan gcc untuk menghasilkan kode rakitan di sintaks Intel?

151

The gcc -Spilihan akan menghasilkan kode assembly di AT & T sintaks, apakah ada cara untuk menghasilkan file dalam sintaks Intel? Atau adakah cara untuk mengkonversi antara keduanya?

hyperlogic
sumber
5
Anda dapat mengonversi satu instruksi dengan mudah di shell dengan llvm-mc: echo "packsswb mm0,[bp+si-0x54]" | llvm-mc-3.2 -x86-asm-syntax=intelgivespacksswb -84(%bp,%si), %mm0
Janus Troelsen

Jawaban:

198

Sudahkah Anda mencoba ini?

gcc -S -masm=intel test.c

Belum diuji, tetapi saya menemukannya di forum ini di mana seseorang mengklaim itu bekerja untuk mereka.

Saya baru saja mencoba ini di mac dan gagal, jadi saya melihat di halaman manual saya:

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

Ini bisa bekerja pada platform Anda.

Untuk Mac OSX:

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

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

Jason Dagit
sumber
Meskipun nama file salah att2intel.sed, skrip sed mengkonversi dengan cara lain, dari Intel ke ATT.
Jonathon Reinhart
Adakah yang punya solusi untuk Mac?
Joshua Cheek
Dentang saat ini tidak dapat mengkonsumsi sintaks Intel. Lihat LLVM Bug 24232: [X86] Operan rakitan inline tidak berfungsi dengan .intel_syntax . Juga, Dentang mengabaikan prefix/ noprefix(tidak yakin apakah itu penting jika Dentang mengkonsumsi perakitan).
jww
17

Itu

gcc -S -masm=intel test.c

Apakah bekerja dengan saya. Tapi saya bisa tahu cara lain, meskipun ini tidak ada hubungannya dengan menjalankan gcc. Kompilasi file kode objek yang dapat dieksekusi dan kemudian bongkar kode objek dalam sintaks Intel asm dengan objdump seperti di bawah ini:

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

Ini mungkin bisa membantu.

phoxis
sumber
3
sama dengan objdump -d -M intel
David 天宇 Wong
5

Saya memiliki kode ini dalam file 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;
 };

Kode itu berfungsi dengan baris perintah GCC ini:

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

Ini akan menghasilkan file * .exe, dan itu berhasil menurut pengalaman saya.

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.

Itu saja.

RizonBarns
sumber
Tidak berfungsi pada Fedora saya:$ gcc -S -masm=intel -mconsole a.c -o a.out gcc: error: unrecognized command line option ‘-mconsole’
d33tah
Bekerja di cygwin. Majelis masuk sebagai intel, keluar sebagai intel di file .s. Jika Anda menggunakan, -o a.outAnda tidak akan mendapatkan file .s.
Orwellophile