Stack pointer / Frame pointer 在 x86 Assembly 操作的簡易分析
這幾天在複習 compiler 有關 runtime environment 的章節,讀到 activation record 的時候發現對 frame pointer 的概念有點忘記了,於是就決定來做一點小實驗。
Toy example
| |
x86 Assembly
把 assembly 編出來看一下 stack 操作的過程:
| |
可以拿到:
| |
把一些不重要的資訊精簡後,可以得到:
| |
Analysis
Before foo
- 一開始在 main 被呼叫前,會在 glibc 的
_startfunction 內,假設 SP 現在指到0x1924FP 指在0x2000 - 接著保存 FP 的位址,將 FP 指到新的 SP 的位址
- 將 foo 要的參數 push 進 stack
- 呼叫 foo,保存 return address 在 stack

foo
- 進到 foo
- 保存 main 的 FP 的位址,將 FP 指到新的 SP 的位址
- SP - 16
- 算 x 與 y,透過 FP 拿到 local variables 的位址
- 將 return value 保存在
%eax leave將 SP 指回 FP,並 pop,FP 回到 main 原先呼叫的位址

After foo
- 回到 main
- SP 指向 FP 的位址
leave將 SP 指回 FP,並 pop,FP 回到_start原先呼叫的位址
