<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 匯編技術(shù)內幕(3)

匯編技術(shù)內幕(3)

作者: 時(shí)間:2016-11-24 來(lái)源:網(wǎng)絡(luò ) 收藏
局部變量棧分配
下面我們分析一下C編譯器如何處理局部變量的分配,為此先給出如下程序:
#vi test2.c
int main()
{
int i;
int j=2;
i=3;
i=++i;
return i+j;
}
編譯該程序,產(chǎn)生二進(jìn)制文件,并利用mdb來(lái)觀(guān)察程序運行中的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分配??臻g,并保證棧16字節對齊
main+6: andl $0xf0,%esp
main+9: movl $0,%eax
main+0xe: subl %eax,%esp ; main+6至main+0xe,再次保證棧16字節對齊
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 ; 撤銷(xiāo)Stack Frame
main+0x2a: ret ; main函數返回
>
通過(guò)mdb對程序運行時(shí)的寄存器和棧的觀(guān)察和分析,可以得出局部變量在棧中的訪(fǎng)問(wèn)和分配及釋放方式:
1.局部變量的分配,可以通過(guò)esp減去所需字節數
subl $8,%esp
2.局部變量的釋放,可以通過(guò)leave指令
leave
3.局部變量的訪(fǎng)問(wèn),可以通過(guò)ebp減去偏移量
movl -8(%ebp),%eax
addl -4(%ebp),%eax
問(wèn)題:當存在2個(gè)以上的局部變量時(shí),如何進(jìn)行棧對齊?
在上篇文章中,提到subl $8,%esp語(yǔ)句除了分配??臻g外,還有一個(gè)作用就是棧對齊。那么本例中,由于i和j正好是8字節,那么如果存在2個(gè)以上的局部變量時(shí),如何同時(shí)滿(mǎn)足空間分配和棧對齊呢?


評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>