openlang

Как заставить gcc выдавать ассемблер Intel вместо синтаксиса AT&T?

При использовании gcc -S получается ассемблер AT&T. Можно ли вместо этого запросить для выходных файлов синтаксис Intel? Или можно преобразовать один синтаксис в другой?

Переведено с английскогоПоказать оригинал

Разговор продолжается 3

Следуя доводам
  1. Ссылка на ответ

    Передайте -masm=intel

    gcc -S -masm=intel -Og -fverbose-asm sample.c

    Это работает в GCC и в Clang начиная с 3.5. GCC manual (https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html#index-masm_003ddialect):

    -masm=dialect Выводить инструкции ассемблера в запрошенном диалекте. Доступны варианты intel и att, по умолчанию выбран att. На Darwin Intel не поддерживается.

    На macOS помните, что gcc обычно запускает Clang, если только вы отдельно не установили настоящий GCC (например, через Brew). Современный clang принимает -masm=intel как равнозначную опцию, но следующий вариант поддерживался clang всегда (https://stackoverflow.com/a/11957826/950427):

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

    Помните, что до clang 14 (https://reviews.llvm.org/D113707), в отличие от GCC (https://stackoverflow.com/questions/9347909/can-i-use-intel-syntax-of-x86-assembly-with-gcc), эта опция не меняет обработку встроенных операторов asm() в clang.

    Compiler Explorer, который поддерживает Arden Fenwick, использует эти опции по умолчанию: https://godbolt.org/

    Другие ключи и советы по получению полезных листингов ассемблера есть в материале Уменьшение шума в ассемблерном выводе GCC/clang (https://stackoverflow.com/questions/38552116/how-to-remove-noise-from-gcc-clang-assembly-output).

    Переведено с английскогоПоказать оригинал
  2. Ссылка на ответ

    Эта команда

    gcc -S -masm=intel sample.c

    У меня работает. Есть и другой путь, хотя он не связан с вызовом gcc. Сначала соберите исполняемый или объектный файл, затем попросите objdump дизассемблировать объект с синтаксисом Intel, как ниже:

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

    Возможно, пригодится.

    Переведено с английскогоПоказать оригинал
  3. Ссылка на ответ

    Вот содержимое моего CPP-файла:

    #include <conio.h>
    #include <stdio.h>
    #include <windows.h>
    
    int result = 0;
    int main(int count, char *items[]) {
      asm("mov eax, 0xEE");
      asm("mov _result, eax");
      printf("result contains %d\n", result);
      getch();
      return 0;
    };

    Этот код заработал у меня с таким вызовом GCC:

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

    На выходе получается файл *.exe, который у меня успешно запустился.

    Remarks:
    for an immediate operand, use _variable for a global variable rather than a local one.
    exampel: mov _itemCount, eax NOT mov $itemCount, eax or mov itemCount, eax
    
    Hexadecimal numbers require at&t notation instead of intel notation.
    example: mov eax, 0xEE -> TRUE, mov eax, 0EEh -> FALSE.

    Больше ничего.

    Переведено с английскогоПоказать оригинал

Другие стороны того же вопроса

  1. invalid command name "Dana" из обычной строки в TSV, что?

    Короче, эта штука гоняет меня по кругу. Tcl 9.0 на Arch, tclsh main.tcl, небольшой отчёт по заказам для сайта клиента, которы…

    Ответы 1Последняя активность tcl
  2. В ECMA-262 нет ни слова о цикле событий

    В ECMA-262 цикл событий не упоминается ни разу. Спецификация определяет задания (jobs) и хост-хук HostEnqueuePromiseJob, кото…

    Ответы 2Последняя активность javascriptdart