このノートでは、アセンブラから C 関数を呼び出すプロセスについて説明します。
printf(“Hello World!\n”); を呼び出してみましょう。そして exit(0);
message: db "Hello, world!", 10, 0
section .text
extern printf
extern exit
global main
main:
xor rax, rax
mov rdi, message
call printf
xor rdi, rdi
call exit
すべては見かけよりもはるかに単純です。.rodata セクションでは静的データを記述します。この場合、行「Hello, world!」、10 は改行文字であり、null にすることも忘れません。
コード セクションでは、外部関数 printf、stdio の出口、stdlib ライブラリを宣言し、入力関数 main も宣言します。
extern printf
extern exit
global main
rax 関数から戻りレジスタに 0 を渡します。mov rax, 0; を使用できます。しかし、高速化するために、xor rax、rax が使用されます。次に、文字列へのポインタを最初の引数に渡します。
Далее вызываем внешнюю функцию Си printf:
xor rax, rax
mov rdi, message
call printf
xor rdi, rdi
call exit
同様に、最初の引数に 0 を渡して exit を呼び出します。
call exit
アメリカ人はこう言います。
誰の言うことも聞かない
人は。そのピラフは @ Alexander Pelevin
を食べています。
ソース
https://www.devdungeon. com/content/how-mix-c-and-assembly
https://nekosecurity.com/x86-64-assembly/part-3-nasm-anatomy-syscall-passing-argument
https://www.cs.uaf.edu/2017/fall/cs301/reference/x86_64.html
ソースコード
https://gitlab.com/demensdeum/assembly-playground