Как вы используете gcc для генерации ассемблерного кода в синтаксисе Intel?

151

gcc -SВариант будет генерировать код сборки в AT & T синтаксис, есть способ для создания файлов в синтаксисе Intel? Или есть способ конвертировать между ними?

hyperlogic
источник
5
Вы можете легко конвертировать отдельные инструкции в оболочке с помощью llvm-mc: echo "packsswb mm0,[bp+si-0x54]" | llvm-mc-3.2 -x86-asm-syntax=intelgivepacksswb -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 Bug 24232: [X86] Операнды встроенной сборки не работают с .intel_syntax . Кроме того, Clang игнорирует prefix/ noprefix(не уверен, имеет ли это значение, если Clang потребляет сборку).
jww
17

The

gcc -S -masm=intel test.c

Работает ли со мной. Но я могу сказать по-другому, хотя это не имеет ничего общего с запуском gcc. Скомпилируйте исполняемый файл или файл объектного кода, а затем разберите объектный код в синтаксисе Intel asm с помощью objdump, как показано ниже:

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

Это может помочь.

phoxis
источник
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.

Вот и все.

RizonBarns
источник
Не работает на моей 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.
Орвеллофил