Làm thế nào để bạn sử dụng gcc để tạo mã lắp ráp theo cú pháp Intel?


151

Các gcc -Stùy chọn sẽ tạo ra mã lắp ráp trong cú pháp của AT & T, là có một cách để tạo ra tập tin trong cú pháp của Intel? Hoặc có một cách để chuyển đổi giữa hai?


5
bạn có thể chuyển một lệnh đơn một cách dễ dàng trong vỏ với llvm-mc: echo "packsswb mm0,[bp+si-0x54]" | llvm-mc-3.2 -x86-asm-syntax=intelchopacksswb -84(%bp,%si), %mm0
Janus Troelsen

Câu trả lời:


198

Bạn đã thử điều này?

gcc -S -masm=intel test.c

Chưa được kiểm tra, nhưng tôi đã tìm thấy nó trong diễn đàn này , nơi ai đó tuyên bố nó đã làm việc cho họ.

Tôi mới thử cái này trên mac và nó thất bại, vì vậy tôi đã xem trang người đàn ông của mình:

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

Nó có thể hoạt động trên nền tảng của bạn.

Đối với Mac OSX:

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

Nguồn: https://stackoverflow.com/a/11957826/950427


Mặc dù tên tệp att2intel.sed không chính xác, tập lệnh sed đó chuyển đổi theo cách khác, từ Intel sang ATT.
Jonathon Reinhart

Bất cứ ai cũng có một giải pháp cho Mac?
Joshua Cheek

Clang hiện không thể sử dụng cú pháp Intel. Xem LLVM Bug 24 232: [X86] Toán hạng lắp ráp nội tuyến không hoạt động với .intel_syntax . Ngoài ra, Clang bỏ qua prefix/ noprefix(không chắc chắn nếu nó quan trọng nếu Clang tiêu thụ lắp ráp).
lúc 22 giờ 34 phút

17

Các

gcc -S -masm=intel test.c

Không làm việc với tôi. Nhưng tôi có thể nói một cách khác, mặc dù điều này không liên quan gì đến việc chạy gcc. Biên dịch tệp thực thi hoặc tệp mã đối tượng và sau đó phân tách mã đối tượng trong cú pháp mã asm của Intel với objdump như dưới đây:

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

Điều này có thể giúp.


3
giống như objdump -d -M intel
David Wong

5

Tôi có mã này trong tệp 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;
 };

Mã đó đã hoạt động với dòng lệnh GCC này:

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

Nó sẽ dẫn đến tập tin * .exe và nó hoạt động theo kinh nghiệm của tôi.

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.

Đó là tất cả.


Không hoạt động trên Fedora của tôi:$ gcc -S -masm=intel -mconsole a.c -o a.out gcc: error: unrecognized command line option ‘-mconsole’
d33tah

Hoạt động trong cygwin. Hội đi vào như intel, đi ra như intel trong tệp .s. Nếu bạn sử dụng, -o a.outbạn sẽ không nhận được tệp .s.
Orwellophile
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.