คุณจะใช้ gcc เพื่อสร้างรหัสการประกอบในไวยากรณ์ของ Intel ได้อย่างไร


151

gcc -Sตัวเลือกที่จะสร้างรหัสการชุมนุมใน AT & T ไวยากรณ์จะมีวิธีในการสร้างไฟล์ในไวยากรณ์อินเทล? หรือมีวิธีการแปลงระหว่างทั้งสอง?


5
คุณสามารถแปลงคำสั่งเดี่ยวได้อย่างง่ายดายในเชลล์ด้วย llvm-mc: echo "packsswb mm0,[bp+si-0x54]" | llvm-mc-3.2 -x86-asm-syntax=intelให้packsswb -84(%bp,%si), %mm0
Janus Troelsen

คำตอบ:


198

คุณเคยลองสิ่งนี้หรือไม่?

gcc -S -masm=intel test.c

ยังไม่ทดลอง แต่ฉันพบในฟอรัมนี้ที่มีคนอ้างว่าใช้งานได้กับพวกเขา

ฉันเพิ่งลองทำสิ่งนี้ใน mac และมันล้มเหลวดังนั้นฉันจึงดูในหน้า man ของฉัน:

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

มันอาจทำงานบนแพลตฟอร์มของคุณ

สำหรับ Mac OSX:

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

ที่มา: https://stackoverflow.com/a/11957826/950427


แม้จะมีชื่อไฟล์ที่ไม่ถูกต้อง att2intel.sed แต่สคริปต์ sed จะแปลงวิธีอื่นจาก Intel เป็น ATT
Jonathon Reinhart

ใครมีวิธีแก้ปัญหาสำหรับ Mac?
Joshua Cheek

Clang ไม่สามารถใช้ไวยากรณ์ของ Intel ได้ในขณะนี้ ดูLLVM Bug 24232: [X86] ตัวดำเนินการแอสเซมบลีแบบอินไลน์ไม่ทำงานกับ . intel_syntax นอกจากนี้เสียงดังกราวละเว้นprefix/ noprefix(ไม่แน่ใจว่ามันสำคัญถ้าเสียงดังกราวใช้ชุดประกอบ)
jww

17

The

gcc -S -masm=intel test.c

ทำงานกับฉันได้ไหม แต่ฉันสามารถบอกวิธีอื่นได้แม้ว่าจะไม่เกี่ยวข้องกับการรัน gcc คอมไพล์ไฟล์เรียกทำงานหรือไฟล์โค้ดออบเจ็กต์แล้วแยกส่วนรหัสออบเจ็กต์ในไวยากรณ์ Intel asm ด้วย objdump ดังนี้:

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

สิ่งนี้อาจช่วยได้


3
เช่นเดียวกับ objdump -d -M intel
David 天宇 Wong

5

ฉันมีรหัสนี้ในไฟล์ 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;
 };

นั่นเป็นรหัสที่ทำงานกับบรรทัดคำสั่ง GCC นี้:

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

มันจะส่งผลให้ไฟล์ * .exe และทำงานได้ในประสบการณ์ของฉัน

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.

นั่นคือทั้งหมดที่


ไม่ทำงานกับ Fedora ของฉัน:$ gcc -S -masm=intel -mconsole a.c -o a.out gcc: error: unrecognized command line option ‘-mconsole’
d33tah

ทำงานใน cygwin แอสเซมบลีไปในฐานะ intel ออกมาเป็น intel ในไฟล์. s หากคุณใช้-o a.outคุณจะไม่ได้รับไฟล์. s
Orwellophile
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.