日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

函数调用栈空间以及fp寄存器

發(fā)布時間:2024/1/1 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 函数调用栈空间以及fp寄存器 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Arm上函數(shù)調(diào)用的規(guī)則在ARM System Developer's Guide文檔中的ATPCS部分有詳細(xì)的定義,這里主要通過函數(shù)調(diào)用過程中函數(shù)棧的情況來說明fp和sp等寄存器的作用。有關(guān)ATPCS的詳細(xì)內(nèi)容可以去文檔中看。

?

fp叫做frame pointer寄存器,即棧幀指針寄存器;sp叫做stack pointer寄存器,即棧指針寄存器。那么它們具體的作用是什么呢?

首先,大家知道每個進(jìn)程都有自己獨(dú)立的棧空間,進(jìn)程中有千千萬萬的函數(shù)調(diào)用,這些函數(shù)共享進(jìn)程的這個棧空間,那么問題就來了,函數(shù)運(yùn)行過程中會有非常多的入棧出棧的過程,當(dāng)函數(shù)返回backtrace的時候怎樣能精確定位到返回地址呢?還有子函數(shù)所保存的一些寄存器的內(nèi)容?這樣就有了棧幀的概念,即每個函數(shù)所使用的棧空間是一個棧幀,所有的棧幀就組成了這個進(jìn)程完整的棧。而fp就是棧基址寄存器,指向當(dāng)前函數(shù)棧幀的棧底,sp則指向當(dāng)前函數(shù)棧幀的棧頂。通過sp和fp所指出的棧幀可以恢復(fù)出母函數(shù)的棧幀,以此類推就可以backtrace出所有函數(shù)的調(diào)用順序。

那一個函數(shù)的棧幀具體的范圍什么呢?fp和sp具體應(yīng)該指向什么位置呢?請看下圖:

圖1

上圖描述的是ARM的棧幀布局方式,main stack frame為調(diào)用函數(shù)的棧幀,func1 stack frame為當(dāng)前函數(shù)(被調(diào)用者)的棧幀,棧底在高地址,棧向下增長。此圖是網(wǎng)上的圖,理論上應(yīng)該是上圖的格式,fp、sp、lr和pc這四個寄存器是非常特殊的寄存器,它們記錄了當(dāng)前正在運(yùn)行的函數(shù)一些重要信息,在剛進(jìn)入一個新的函數(shù)開始執(zhí)行的時候,它們保存的是上個函數(shù)的信息,需要將它們?nèi)霔14嫫饋?#xff0c;這很重要!這些并沒有定義在ATPCS中,ATPCS規(guī)定的是函數(shù)調(diào)用的時候參數(shù)如何傳遞,以及函數(shù)返回值的保存等。上面的這些個人覺得是一種默契,定義函數(shù)現(xiàn)場的保存及恢復(fù),這些默契包括ATPCS都是人為的一種約束,目的是為了保證程序運(yùn)行中不會出錯,具體怎樣實(shí)現(xiàn)應(yīng)該是不同的編譯器不盡相同。

下面我為了驗證arm的gcc編譯器的實(shí)現(xiàn),自己寫了個小實(shí)驗程序:

?

  • main.c:

  • ?
  • ?
  • ?
  • #include <stdio.h>

  • ?
  • int func(int i);

  • ?
  • int main(void)

  • {

  • int i = 25;

  • func(i);

  • return 0;

  • }

  • ?

  • func.c

  • ?
  • int func(int i)

  • {

  • int a = 2;

  • return a * i;

  • }


  • main.c中調(diào)用了func函數(shù),而func函數(shù)的實(shí)現(xiàn)在func.c文件中。下面是用arm-linux-androideabi-gcc編譯后的執(zhí)行文件反匯編出來的代碼:

    ?

    ?

    Disassembly of section .text:0000822c <func>:822c: e52db004 push {fp} ; (str fp, [sp, #-4]!)8230: e28db000 add fp, sp, #08234: e24dd014 sub sp, sp, #208238: e50b0010 str r0, [fp, #-16]823c: e3a03002 mov r3, #28240: e50b3008 str r3, [fp, #-8]8244: e51b3008 ldr r3, [fp, #-8]8248: e51b2010 ldr r2, [fp, #-16]824c: e0030392 mul r3, r2, r38250: e1a00003 mov r0, r38254: e24bd000 sub sp, fp, #08258: e49db004 pop {fp} ; (ldr fp, [sp], #4)825c: e12fff1e bx lr00008260 <main>:8260: e92d4800 push {fp, lr}8264: e28db004 add fp, sp, #48268: e24dd008 sub sp, sp, #8826c: e3a03019 mov r3, #258270: e50b3008 str r3, [fp, #-8]8274: e51b0008 ldr r0, [fp, #-8]8278: ebffffeb bl 822c <func>827c: e3a03000 mov r3, #08280: e1a00003 mov r0, r38284: e24bd004 sub sp, fp, #48288: e8bd8800 pop {fp, pc}


    上面的匯編代碼可以看到,并沒有想上面圖中所畫的,將fp, sp, lr, pc全部都入棧,而是只入棧這四個寄存器中有改動的。fp是肯定要保存的,它指向的是每個函數(shù)棧幀的棧基址,而sp一般不用入棧,因為它的值一般保存在fp中,因為剛進(jìn)入一個函數(shù)的時候,將上個函數(shù)的fp入棧保存以后,當(dāng)前函數(shù)的棧空間應(yīng)該是空的,fp應(yīng)該指向與sp相同的位置,然后才會對sp做減法來分配棧空間保存臨時變量。而如果當(dāng)前函數(shù)中沒有對其它函數(shù)的調(diào)用的時候,是不會對lr寄存器做修改的,所以也就不用保存了。

    ?

    但是上面對main函數(shù)和func函數(shù)的fp指針?biāo)赶虻奈恢靡膊煌耆嗤?#xff0c;main函數(shù)中fp指向的是上個fp保存的內(nèi)存地址,而func中的fp指向的是sp相同的位置。但是只要恢復(fù)的時候相對應(yīng)不出錯就可以了,上面也說過ATPCS這些規(guī)定都是人為的一種約束,保證backtrace的時候可以把正確的內(nèi)容恢復(fù)到寄存器中,具體怎么實(shí)現(xiàn)并沒有特別死板的定義。

    ?

    另外一個比較重要的東西就是出入棧的順序,在ARM指令系統(tǒng)中是地址遞減棧,入棧操作的參數(shù)入棧順序是從右到左依次入棧,而參數(shù)的出棧順序則是從左到右的你操作。包括push/pop和LDMFD/STMFD等。

    比如指令 push {fp, sp, lr, pc}執(zhí)行的結(jié)果就是圖1中棧的樣子,pc被首先入棧存在高地址,從右到左依次入棧,fp存在低地址。

    這些是比較細(xì)節(jié)和基礎(chǔ)的東西,同時也是需要搞清楚的。

    ?

    ?

    參考鏈接:

    1.?http://www.linuxidc.com/Linux/2013-03/81247.htm

    2.?http://www.cnblogs.com/chyl411/p/4579053.html

    3.?http://www.cnblogs.com/fanzhidongyzby/p/5250116.html

    總結(jié)

    以上是生活随笔為你收集整理的函数调用栈空间以及fp寄存器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 日本欧美韩国国产精品 | 日韩黄色在线观看 | 日本一二三区在线 | 操女人的逼逼 | 国产精品成人免费精品自在线观看 | 雷电将军和丘丘人繁衍后代视频 | 人人人人爽 | 裸体裸乳免费看 | 国产成人av一区二区三区不卡 | 91国内精品 | 在线观看www | 特黄一级视频 | 男女涩涩视频 | 国产 欧美 日韩 在线 | 久久疯狂做爰流白浆xx | 少妇高潮视频 | 国产精品乱码久久久久久久久 | 精品无码人妻一区二区免费蜜桃 | 亚洲一区二区三区四区 | 国产精品免费网站 | 狠狠干网址 | 欧美日韩国产精品一区 | 精品无码国产污污污免费网站 | 日本a视频 | 特级黄毛片 | 99久久婷婷国产一区二区三区 | 成人国产精品久久久网站 | 久久艹综合 | 麻豆精品视频免费观看 | 色四月 | 男人的天堂手机在线 | 天天操天天草 | 免费成人黄色 | 日韩伦理一区 | 精品一区在线视频 | 欧美一二三视频 | 国产aⅴ激情无码久久久无码 | 亚洲砖区免费 | 99艹| 亚洲精品国产精品乱码不99 | 国产高清免费av | 性生交大片免费看3p | 观看毛片 | 国产成人免费视频 | 人人爱人人射 | 在线电影一区二区 | 私密spa按摩按到高潮 | 男女插插网站 | 国产女同在线观看 | 欧美视频在线播放 | 亚洲aaaa级特黄毛片 | 亚洲欧美另类激情 | 欧美色老头 | 四虎永久免费影院 | 在线免费一区 | 女人脱裤子让男人捅 | xxxx视频在线观看 | 国产主播啪啪 | 人妻体内射精一区二区 | www.av麻豆 | 成人69视频 | 性生交大片免费看狂欲 | 天天色天天草 | 亚洲国产福利 | 国产成人亚洲精品自产在线 | 欧洲做受高潮免费看 | 国产精品黄视频 | 懂色av一区二区夜夜嗨 | 91精品国产综合久久久久 | 四虎新网站| 高跟av | 精国产人伦一区二区三区 | 少妇按摩一区二区三区 | 绿帽av | 国语对白少妇spa私密按摩 | av黄色小说 | 黄网页在线观看 | 成人av电影在线观看 | 国产aaaaa毛片 | 久久久高清视频 | 国产精品1234区 | av免费久久| 国产精品日韩av | 在线观看9.1| 日韩中文免费 | 国产成人免费看 | 欧美xxxxxxxxx | 成人激情五月天 | 成人亚洲黄色 | 桃花久久 | 熟女俱乐部一区二区 | 一本大道伊人av久久综合 | 暴操白虎| 五月天综合网站 | 无码国产精品一区二区高潮 | 亚洲嫩草影院 | 体内精69xxxxx | 久久久久久久久久久福利 | 激情综合激情五月 |