<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 談?wù)刟rm下的函數(shù)棧

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

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

          引言

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

          本文引用地址:http://www.ex-cimer.com/article/201611/318805.htm

          函數(shù)棧

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

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

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

          1 /* B被A調(diào)用2  * 參數(shù):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調(diào)用B函數(shù) */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 }

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

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

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

          小結(jié)

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



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

          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();