ベースレジスタ
関数呼び出し中は変化しない
関数の中で関数が呼ばれたときは一時的に変化する
関数の引数のサイズが8バイトとすると
第1引数は「RBP - 8」、第2引数「RBP - 16」でアクセスすることができる
関数fを呼び出したときのメモリの図
関数fは内部にローカル変数a,bを持っている
code:memory
// スタックには上から下向きに積んでいっている
| .... |
|-------------------|
| 関数fのリターンアドレス |
|-------------------|
| f呼び出し時点でのRBP | <- RBP(ベースポインタ)
|-------------------|
| fのローカル変数a | <- (RBP - 8) とかでアクセスできる
|-------------------|
| fのローカル変数b | <- RSP(スタックポインタ) <- スタックのてっぺん
関数の内部で関数を呼ぶ、を繰り返すときはどうする?
関数呼び出しごとにもとのベースポインタを保存しておく
そしてリターンする前に書き戻す
スタックに積んで保存する
関数gの中で関数fを読んだときのメモリの図
関数fは内部にローカル変数a,bを持っている
関数gも内部にローカル変数a,bを持っている
code:memory
// スタックには上から下向きに積んでいっている
| .... |
|-------------------|
| 関数gのリターンアドレス |
|-------------------|
| gの呼び出し時のRBP |
|-------------------|
| gのローカル変数a |
|-------------------|
| gのローカル変数b |
|-------------------|
| 関数fのリターンアドレス |
|-------------------|
| fの呼び出し時のRBP | <- RBP(ベースポインタ)
|-------------------|
| fのローカル変数a |
|-------------------|
| fのローカル変数b | <- RSP(スタックポインタ) <- スタックのてっぺん