<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è) > 嵌入式系統 > 設計應用 > 談?wù)刟rm下的函數棧

談?wù)刟rm下的函數棧

作者: 時(shí)間:2016-11-20 來(lái)源:網(wǎng)絡(luò ) 收藏

引言

  這篇文章簡(jiǎn)要說(shuō)說(shuō)函數是怎么傳入參數的,我們都知道,當一個(gè)函數調用使用少量參數(ARM上是少于等于4個(gè))時(shí),參數是通過(guò)寄存器進(jìn)行傳值(ARM上是通過(guò)r0,r1,r2,r3),而當參數多于4個(gè)時(shí),會(huì )將多出的參數壓入棧中進(jìn)行傳遞(其實(shí)在函數調用過(guò)程中也會(huì )把r0,r1,r2,r3傳遞的參數壓入棧),具體是什么實(shí)現的呢,我們看看。

本文引用地址:http://dyxdggzs.com/article/201611/318805.htm

函數棧

  首先我們需要了解一下linux下一個(gè)進(jìn)程的內存地址空間是如何布局的,在linux中,0~3G的虛擬地址為進(jìn)程所有,3G~4G由內核所使用,每一個(gè)進(jìn)程都有自己獨立的0~3G內存地址空間。當進(jìn)程進(jìn)行函數調用時(shí),我們都知道傳入被調用函數的參數是通過(guò)棧進(jìn)行操作的,這里我們只需要簡(jiǎn)單了解一下linux的內存地址空間中的棧是自頂向下生長(cháng)的,就是棧底出于高地址處,棧頂出于低地址處。

  好的,簡(jiǎn)單了解了內存地址空間的棧后,我們還需要簡(jiǎn)單了解一下EBP和ESP這兩個(gè)寄存器,EBP是用保存棧低地址的,而ESP用于保存棧頂地址,而每一次函數調用會(huì )涉及到一個(gè)棧幀,

舉個(gè)實(shí)例詳細說(shuō)明一下一個(gè)函數幀的特點(diǎn),比如

1 /* B被A調用2  * 參數:data1, data2, data33  * 局部變量: s1, s2, s3 */4 void B (int data1, int data2, int data3)5 {6     int b_s1;7     int b_s2;8     int b_s3;9 }10  11 /* A調用B函數 */12 void A (void)13 {14     int a_s1;15     int a_s2;16     int a_s3;17     18     B (1, 2, 3);19     printf ("1n");20 }

在以上例子中棧幀情況如下圖所示

  從圖例中可以看出,當A函數沒(méi)有調用B函數時(shí),A函數的棧幀只保存著(zhù)局部變量,而EBP(棧底指針)指向的是A函數的函數棧幀頭,而當A函數調用B函數時(shí),A函數會(huì )將B函數所需要的參數從右往左壓入棧(在例子中先壓入3,之后是2,最后是1),之后會(huì )將A調用完B之后所需要運行的第一條指令壓入棧,此時(shí)建立一個(gè)B的棧幀,具體流程:

  • 從右往左將B函數所需參數壓入棧
  • 壓入執行完B函數之后的第一條指令地址
  • 建立B棧幀
  • 壓入A棧幀的棧底
  • 壓入B函數保護的寄存器
  • 壓入B函數的局部變量

小結

  其實(shí)每一種處理器架構所使用的方式都不一樣,在arm上我幾個(gè)參數和不定參數的情況通過(guò)匯編代碼查看又不相同,之后反匯編后研究透了會(huì )再發(fā)布一篇博文專(zhuān)門(mén)說(shuō)這個(gè),現在這篇就當做一個(gè)入門(mén)知識吧。



關(guān)鍵詞: arm函數

評論


技術(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>