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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

也谈栈和栈帧(四)

發布時間:2025/4/5 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 也谈栈和栈帧(四) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這次來看看PowerPC體系架構CPU的棧幀布局和操作方法。PowerPC用得不多,有不對的地方大家拍磚啊~~
1.? PowerPC的棧幀
??? 先來看看PowerPC的棧幀布局圖:
????
??? 上圖描述的是PowerPC的棧幀布局方式,PowerPC的棧生長方向也是由高到低,caller是調用者,current是被調用者。壓棧的順序依次是FPR、GPR、CR、Local Variable、Function Parameters、Padding、LR和Back Chain Word。具體涵義如下:
? (1)函數參數域FPR(Function Parameter Register):這個區域的大小是變化的,當調用者傳遞給被調用者的參數少于8個時,用GPR3-GPR10這8個寄存器就行,被調用者的棧幀中就可不要這個區域;但如果傳遞的參數多于8個時就需要這個區域。
? (2)通用寄存器GPR(General Parameter Register):當需要保存GPR寄存器中的一個寄存器GPRx時,就需要把從GPRx-GPR31的值都保存到堆棧幀中。
? (3)CR寄存器:即使修改了CR寄存器的某一個段CRx(x=0至7),都要保存這個CR寄存器的內容。
? (4)局部變量域(Local Variables Area):同上FPR所示,如果臨時寄存器的數量不足以提供給被調用者的臨時變量使用時,就會使用這個區域。
? (5)Function Parameters:跟第一個FPR重復了?暫時不知。
? (6)Padding:是補齊字節數,讓當前棧幀的長度保持8Bytes的倍數。
? (7)LR:也就是ra寄存器,是指返回時的函數指針
? (8)Back Chain Word:是調用者函數幀的棧頂esp,即上一個棧幀的低地址,當前函數棧幀的基址ebp
??? 跟x86和ARM一樣,壓棧的順序有一定的規律,一個棧空間內的地址前面,必然有一個代碼地址明確標示著調用函數位置內的某個地址。而且很容易發現,跟x86一樣(如果x86中ebp算是調用者棧幀的話),棧幀的最后兩個位置存儲的也是ra和ebp。所以可以考慮向x86學習,根據當前ebp的值回溯出整個任務的調用棧,如圖中藍箭頭所示,具體操作后面再專門講述。
? 2.? PowerPC的寄存器
??? PowerPC的ABI規定的寄存器的使用規則如下:
? (1)GPR0:屬于易失性寄存器,ABI規定普通用戶不能使用此寄存器。GCC編譯器用此寄存器來保存LR寄存器,Linux PowerPC用此寄存器來傳遞系統調用號碼。
? (2)GPR1:屬于專用寄存器,ABI規定用次寄存器來保存堆棧的棧頂指針。注:PowerPC構架沒有獨立的棧頂指針,這一點和X86體系結構是不同的
? (3)GPR2:屬于專用寄存器,ABI規定普通用戶不使用才寄存器,Linux PowerPC用此寄存器來保存當前進程的進程描述符地址。
? (4)GPR3-GPR4:屬于易失性寄存器,ABI使用這兩個寄存器來保存函數的返回值,或者用來傳遞參數。
? (5)GPR5-GPR10:也屬于易失性寄存器,加上GPR3和GPR4共8個寄存器用來傳遞函數的參數。當函數的參數超過八個時使用堆棧來傳遞。
? (6)GPR11-GPR12:屬于易失性寄存器,ABI規定普通用戶不使用該寄存器,Linux PowerPC有時用這兩個寄存器來存放臨時變量,但是GCC編譯器沒有使用這兩個寄存器。
? (7)GPR13:屬于專用寄存器,ABI規定該寄存器sdata段的基地址指針。Linux PowerPC在系統初始化時使用該寄存器來存放臨時變量。GCC有時會根據某些規則將一些常用的數據放入sdata或者sbss段中。應用程序對sdata或者sbss段數據的訪問與對data和bss段數據的訪問機制不同,訪問sdata段的數據速度更快。
? (8)GPR14-GPR31:屬于非易失性寄存器。ABI使用這些寄存器來存放一些臨時變量,在應用程序中可以自由使用這些變量。
? 3.? PowerPC的匯編指令和棧操作
??? PowerPC寄存器沒有專用的push和pop指令來執行堆棧操作,所以PowerPC構架使用存儲器訪問指令stwu、lwzu來代替push和pop指令。
??? 下面我們通過一個例子來說明堆棧幀的建立、使用和移除過程:
??? func1中開始幾行匯編會為自己建立棧幀:
func1:??? mflr %r0??????????????? ;Get link register
????????? stwu %r1,-88(%r1)?????? ;Save back chain?then move?sp
????????? stw %r0,+92(%r1)??????? ;Save link register
????????? stmw %r28,+72(%r1)????? ;Save 4 non-volatiles r28-r31

??? func1的結尾幾行,會移除前面建立的棧幀,并使得SP(即GPR1)寄存器指向上一個棧幀的棧頂(即棧幀的最低地址處,也就是back chair)
??? 如下所示:
????????? lwz %r0,+92(%r1)?????? ;Get saved link register
????????? mtlr %r0?????????????? ;Restore link register
????????? lmw %r28,+72(%r1)????? ;Restore non-volatiles
????????? addi %r1,%r1,88??????? ;Remove frame from stack
????????? blr??????????????????? ;Return to caller function

總結

以上是生活随笔為你收集整理的也谈栈和栈帧(四)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产裸体美女永久免费无遮挡 | 特黄特色免费视频 | 激情视频免费观看 | 亚洲琪琪 | 东北毛片 | 精品国产伦一区二区三 | 9i免费看片黄| 九九综合九九综合 | 久久99国产精品久久99 | 美女毛片 | 亚洲视频一区 | 在线免费观看成人 | 日韩一级免费视频 | 日韩欧美网站 | 日本一区视频在线观看 | 亚洲一级一级 | 美攻壮受大胸奶汁(高h) | 9999精品视频 | 超碰免费97 | 五月婷婷久久综合 | 日韩视频免费在线 | 粗大的内捧猛烈进出在线视频 | 一区二视频 | 青青草视频在线观看 | 国产原创视频 | 夜夜骑夜夜操 | 日p视频在线观看 | 91在线观看喷潮 | 男人狂揉女人下部视频 | 丁香久久婷婷 | 免费观看视频在线观看 | 久久香蕉av | 91在线中文 | 欧美一区二区三区久久妖精 | 91网站永久免费看nba视频 | 美女隐私直播 | 国产a不卡 | 日韩高清在线一区二区 | 黄色av播放 | 中文字幕在线观看二区 | 日韩综合精品 | 天堂а√在线中文在线新版 | 99色 | 国产一区二区观看 | 日日爽夜夜爽 | 麻豆成人免费 | 蜜桃成人网 | 日日综合网 | 黄色av网站免费在线观看 | 福利在线免费视频 | 日韩一区二区在线观看视频 | 看全黄大色黄大片美女人 | 自拍第二页 | 日韩视频免费观看高清完整版 | 免费观看一区 | 神马午夜在线观看 | 九九99久久| 日出白浆视频 | 人人妻人人澡人人爽人人欧美一区 | 久久久一二三区 | 国偷自产av一区二区三区 | 日韩午夜网站 | 爱爱15p| 男女插插插视频 | 精品在线免费观看视频 | 97人人模人人爽人人少妇 | 邻家有女4完整版电影观看 欧美偷拍另类 | 亚洲国产精品成人综合 | 欧美日韩一区在线 | 国产精品一区二区三区四区视频 | 91视频毛片 | 亚洲最大福利网站 | 免费视频福利 | av操操操| 国产亚洲91 | 无码人妻aⅴ一区二区三区有奶水 | 4虎tv| 天天爽网站 | 国产福利免费视频 | 综合色网站 | 羞羞色院91蜜桃 | 五月色综合 | 少妇献身老头系列 | 视频在线观看 | 在线亚洲一区 | 在线观看精品 | 国产精品国产精品国产专区 | 国产激情无码一区二区三区 | 欧美电影一区 | 亚洲av无码日韩精品影片 | 国产欧美一区二区三区国产幕精品 | 亚洲av无码一区二区乱孑伦as | 宅男噜噜噜66一区二区 | 黄色日韩网站 | 在线观看国产日韩 | 国产精品理伦片 | av永久免费在线观看 | 国产美女免费网站 | 香蕉av网 |