とりあえず、Cからアセンブラで書いた関数を呼び出してみるテスト。
main.c
#include <stdio.h>
int add(int a, int b);
int main() {
int ret = add(3, 5);
printf("%d\n", ret);
return 0;
}
このadd
関数をアセンブラで書いてみます。(x64系想定)
add.s
section .text
global _add
_add:
mov rax, rdi
add rax, rsi
ret
こんな感じでそれぞれコンパイル。
ちなみに rax
, rdi
, rsi
の意味は以下になります。
-
rax
... 関数の戻り値を格納する -
rdi
... 関数の第一引数の引数を格納する -
rsi
... 関数の第二引数を格納する
つまり言語化すると、
「rax
に rdi
(第一引数)を mov
(移動)し、それに rsi
(第二引数)を add
する。そしてそれを関数の戻り値とする」
という意味になります。
$ nasm -f macho64 add.s
$ gcc -c main.c
$ gcc -o main main.o add.o
実行すると結果が出力される。
$ ./main
8
まだまだ分からないことだらけだけど、とりあえずアセンブラがどういうルールでなにをしているかはなんとなく分かってきた。
ちなみに rax
とか最初は謎だったけど、それらを調べてつらつらとメモったやつはこちらで公開してます。