這裡呼叫的function叫做caller,被呼叫的稱為callee,比方說main(caller)呼叫foo(callee)
- %ebp是stack frame的底部,%esp是stack frame的頂部
- 但是%ebp是在高位址,但是%esp是在低位址
- 增加local variable的時候,%esp向低位址減少
- 存取parameters的時候卻是向著高位址前進,比方%ebp+8, %ebp+12,存取的是上一個caller的stack frame
- 存取local variable使用的是%esp-0x04這種格式,這就是存取自身的stack frame
- 一般function開頭push %ebp是為了保留上一個stack frame的位址,等到後面可以回復,跟著就把callee的%ebp設定為caller的%esp,接著sub 0x10,%esp,表示未local varabiles配置空間
- 注意組合語言call, leave, ret對register的影響,回傳值是透過%eax傳遞
其實intel並沒有規定這樣stack實作模式,之所以會變成這樣,主要是根據ABI的規範
上面的行為可以透過objdump, gdb中的info register, x來觀察
沒有留言:
張貼留言