[コンパイラ]アセンブリ

### 関数のアセンブリ変換
呼び出した関数が終了した後に、元々実行していたアドレス(リターンアドレス)に戻ってくる必要がある
リターンアドレスはメモリ上のスタックに保存される
スタックは、スタックの一番上のアドレスを保持する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はメモリを読み書きすることでプログラムの実行を進めていく