### 関数のアセンブリ変換
呼び出した関数が終了した後に、元々実行していたアドレス(リターンアドレス)に戻ってくる必要がある
リターンアドレスはメモリ上のスタックに保存される
スタックは、スタックの一番上のアドレスを保持する1つの変数のみを使って実装できる
スタックトップを保持している記憶領域をスタックポインタという
c
#include <stdio.h>
int plus(int x, int y){
return x + y;
}
int main(){
return plus(3, 4);
}
アセンブリ
.intel_syntax noprefix
.globl plus, main
plus:
add rsi, rdi
mov rax, rsi
ret
main:
mov rdi, 3
mov rsi, 4
call plus
ret
第一引数はRDIレジスタ、第二引数はRSIレジスタに入れる約束になっている
callは関数を呼び出す。具体的にはアドレスをスタックにプッシュし、ジャンプ
addはrsiレジスタに上書きされて保存される
返り値はRAXに入れることになっている
retでスタックからアドレスを1つポップ
CPUはメモリを読み書きすることでプログラムの実行を進めていく