関数呼び出しのアセンブリ
コンパイラが関数呼び出しの先頭に出力する定形の命令
code:s
push rbp // ベースポインタの値をスタックに積む
mov rbp, rsp // rspをrbpにコピー。これで関数呼び出し時のスタックポインタを記録できる
sub rsp, 8 // rspを進める. 関数の引数に向ける. 8というのは例.
わざわざ一行目のpush rbpのような操作が必要になるのは、関数の中で関数が呼ばれても正しいベースポインタを覚えておくことが出来るようにするため
コンパイラが関数呼び出しの末尾に出力する定形の命令
ベースレジスタの中にも書いたが、ネストしながら関数の呼び出しが行われ、それがリターンされていくごとに、rbpをその関数を呼び出した関数のベースポインタに戻してから、その関数を抜ける必要がある 関数fの中で関数gを呼び、今、gの処理が終わり、fに戻ろうとしているところ
code:s
// ←この行での状態では、rbpは今から抜ける関数gのベースポインタを指している
mov rsp, rbp // スタックポインタをrbpの位置に動かす
pop rbp // 完全に関数gから抜ける。この後、スタックポインタは今抜けた関数gのリターンアドレスを指している
ret // 抜けた関数gのリターンアドレスをpop