Мне нужно разработать некоторые алгоритмы, которые действительно легко сделать с языком высокого уровня, таким как C или C ++, но которые действительно трудно написать напрямую как NASM.
Поскольку в основном компилятору C и C ++ приходится использовать низкоуровневые istructions для создания двоичных файлов, существует простой способ получения кода NASM из программ на C \ C ++.
От man gcc
:
-S
Остановиться после этапа собственно компиляции; не собирать. Вывод в виде файла кода ассемблера для каждого не ассемблера
указан входной файлПо умолчанию имя файла ассемблера для исходного файла создается
замена суффикса .c, .i и т. д. на .s.
gcc -S hello.c
должен создать файл hello.s
с соответствующим кодом ассемблера.
Работает на g++
тоже.
Другие компиляторы, вероятно, имеют аналогичную опцию.
Например, для этой программы (hello.c
):
#include <stdio.h>
int main() {
printf("Hello, world! %d\n", 6*7);
return 0;
}
Выход (hello.s
) содержит это:
.file "hello.c".section .rodata
.LC0:
.string "Hello, world! %d\n".text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $42, %esi
movl $.LC0, %edi
movl $0, %eax
call printf
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Debian 4.7.2-5) 4.7.2".section .note.GNU-stack,"",@progbits
Я считаю, что проще скомпилировать (с -g, чтобы увидеть исходный код вместе со сборкой) и запустить objdump на двоичном
objdump -M intel -d a.out