Вам не нужно писать всю программу на C, а затем разбирать ее.
Вы можете написать простую функцию C, которая делает только то, что вам нужно, и затем попросить GCC скомпилировать, но нет собрать и связать его, используя параметр -S
.
Вы также можете включить флаг отладки -g
, чтобы сборка имела некоторые данные отладки, которые облегчат чтение.
Взять этот пример кода:
#include <unistd.h>
void get_hostname() {
char buffer[100];
gethostname(buffer, 100);
}
Если это полное содержимое файла hn.c, вы можете использовать следующую команду для создания файла hn.asm:
gcc -S -g hn.c -o hn.asm
В этом файле все еще будет куча вещей, которые вам не нужны, но также будет легко найти и очистить сборку нужной вам функции:
.Ltext0:
.globl get_hostname
.type get_hostname, @function
get_hostname:
.LFB0:
.file 1 "hn.c"
.loc 1 3 0
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $112, %rsp
.loc 1 3 0
movq %fs:40, %rax
movq %rax, -8(%rbp)
xorl %eax, %eax
.loc 1 5 0
leaq -112(%rbp), %rax
movl $100, %esi
movq %rax, %rdi
call gethostname
.loc 1 6 0
movq -8(%rbp), %rax
xorq %fs:40, %rax
je .L2
call __stack_chk_fail
.L2:
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
Вы можете передать это ассемблеру всгенерируйте требуемый машинный код.
Обратите внимание на директивы .loc
: они используются для сопоставления кода сборки с номером строки исходного кода C.Вы можете использовать их так же, как отладчик, чтобы узнать, какие сборочные строки представляют какую строку кода C.