匯編技術內幕(3) 作者: 時間:2016-11-24 來源:網(wǎng)絡 加入技術交流群 掃碼加入和技術大咖面對面交流海量資料庫查詢 收藏 局部變量的棧分配 下面我們分析一下C編譯器如何處理局部變量的分配,為此先給出如下程序: #vi test2.c int main() { int i; int j=2; i=3; i=++i; return i+j; } 編譯該程序,產(chǎn)生二進制文件,并利用mdb來觀察程序運行中的stack的狀態(tài): #gcc test2.c -o test2 #mdb test2 Loading modules: [ libc.so.1 ] > main::dis main: pushl %ebp main+1: movl %esp,%ebp ; main至main+1,創(chuàng)建Stack Frame main+3: subl $8,%esp ; 為局部變量i,j分配棧空間,并保證棧16字節(jié)對齊 main+6: andl $0xf0,%esp main+9: movl $0,%eax main+0xe: subl %eax,%esp ; main+6至main+0xe,再次保證棧16字節(jié)對齊 main+0x10: movl $2,-8(%ebp) ; 初始化局部變量j的值為2 main+0x17: movl $3,-4(%ebp) ; 給局部變量i賦值為3 main+0x1e: leal -4(%ebp),%eax ; 將局部變量i的地址裝入到EAX寄存器中 main+0x21: incl (%eax) ; i++ main+0x23: movl -8(%ebp),%eax ; 將j的值裝入EAX main+0x26: addl -4(%ebp),%eax ; i+j并將結果存入EAX,作為返回值 main+0x29: leave ; 撤銷Stack Frame main+0x2a: ret ; main函數(shù)返回 > 通過mdb對程序運行時的寄存器和棧的觀察和分析,可以得出局部變量在棧中的訪問和分配及釋放方式: 1.局部變量的分配,可以通過esp減去所需字節(jié)數(shù) subl $8,%esp 2.局部變量的釋放,可以通過leave指令 leave 3.局部變量的訪問,可以通過ebp減去偏移量 movl -8(%ebp),%eax addl -4(%ebp),%eax 問題:當存在2個以上的局部變量時,如何進行棧對齊? 在上篇文章中,提到subl $8,%esp語句除了分配??臻g外,還有一個作用就是棧對齊。那么本例中,由于i和j正好是8字節(jié),那么如果存在2個以上的局部變量時,如何同時滿足空間分配和棧對齊呢?
評論