Ответ 1
Я считаю, что лучше разбирать объектные файлы, чем использовать ассемблерный код, сгенерированный gcc.
Сначала сгенерируйте объектный файл из вашего исходного кода:
gcc -fno-asynchronous-unwind-tables -O2 -s -c -o main.o main.c
-fno-asynchronous-unwind-tables
: не генерировать ненужные разделы, такие как.eh_frame
-O2
оптимизирует, чтобы ассм не был ужасным. При желании используйте-Os
(размер за скорость) или-O3
(полная оптимизация, включая автоматическую векторизацию). Также вы можете настроить процессор и использовать расширения, которые он поддерживает, с помощью-march=native
или-march=haswell
или-march=znver1
(Zen)-s
: уменьшить размер исполняемого файла (полосы)-c -o main.o
: компилировать, но не связывать, генерировать объектный файл с именемmain.o
Используйте objconv для генерации кода
nasm
:objconv -fnasm main.o
Результат будет сохранен в
main.asm
.Результат будет очень близок к синтаксису Nasm. Однако вам может потребоваться внести некоторые незначительные изменения, чтобы устранить предупреждения/ошибки. Просто попробуйте скомпилировать его с помощью Nasm
nasm -f elf32 main.asm
и исправьте ошибки/предупреждения вручную. Например:
- удалите слова
align=N
иexecute
/noexecute
из строк.SECTION
. - удалить текст
: function
из объявленийglobal
- удалить строку
default rel
- удалите пустые разделы, если хотите, и т.д.
- удалите слова
Свяжите получившийся
main.o
, сгенерированный Nasm на шаге 3, используя gcc:gcc main.o
Вы также можете связать его, используя ld, но это намного сложнее.