2013年1月18日 星期五

linux上的stack frame

有些文章介紹了stack frame,大多提到的是對應x86底層的實作,即使有些OS跟組合語言的概念,但是還不是很能理解,慢慢的追蹤組合語言才了解了大概,這邊寫下幾個容易混淆的地方

這裡呼叫的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來觀察

沒有留言:

張貼留言