Як ви використовуєте gcc для створення коду збірки в синтаксисі Intel?


151

Цей gcc -Sпараметр генерує код складання в синтаксисі AT&T, чи є спосіб генерувати файли в синтаксисі Intel? Або є спосіб конвертувати між ними?


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, і це не вдалося, тому я заглянув на сторінку чоловіка:

   -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.
Джонатан Райнхарт

У когось є рішення для Mac?
Джошуа Щока

Наразі Clang не може споживати синтаксис Intel. Див. Помилку LLVM 24232: [X86] Вбудовані операнди вбудованої роботи не працюють з .intel_syntax . Також Clang ігнорує prefix/ noprefix(не впевнений, чи має значення, якщо Clang споживає збірку).
jww

17

The

gcc -S -masm=intel test.c

Чи працює зі мною. Але я можу сказати інший спосіб, хоча це не має нічого спільного з запуском gcc. Скомпілюйте виконуваний файл або файл кодового коду, а потім розібріть код об'єкта в синтаксисі Intel asm з обідпом, як показано нижче:

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

Це може допомогти.


3
те саме, що і objdump -d -M intel
Девід 天宇 Вонг

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 файл.
Орвелофіл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.