日韩性视频-久久久蜜桃-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

總結

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

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

主站蜘蛛池模板: 婷婷综合激情网 | av电影在线观看不卡 | 日本一区二区三区在线观看视频 | 欧美性插视频 | julia一区二区三区中文字幕 | 久久久久久免费视频 | 亚洲午夜久久久久久久国产 | 涩涩的视频在线观看 | 日本一区视频在线播放 | 中文字幕无码精品亚洲35 | 日本少妇电影 | 欧美r级在线观看 | 国产精品中文字幕在线观看 | 国产精品久久久久久久成人午夜 | av女星全部名单 | 亚洲精品第一页 | 欧美与黑人午夜性猛交久久久 | 亚洲AV午夜福利精品一级无码 | free性欧美hd另类 | 阿娇全套94张未删图久久 | 亚洲视频一区二区三区四区 | xzjzjzjzjzj欧美大片 | 字幕网在线 | 中文字幕第五页 | 亚洲欧洲无码一区二区三区 | 中日韩在线视频 | 精品国产乱 | 免费观看污视频 | 伊人草| 久久综合资源 | 日韩在线免费视频观看 | 毛片av在线播放 | 亚洲欧洲成人精品久久一码二码 | 特黄特色大片免费播放器使用方法 | 久久精品九九 | 亚洲xx在线 | 欧美怡红院视频一区二区三区 | 精品欧美一区二区精品少妇 | 欧美激情精品久久久久久免费 | 欧洲视频一区 | 国产一级做a爰片在线看免费 | 大地资源二中文在线影视免费观看 | 国产一区两区 | aa毛片视频 | 亚洲综合在线中文字幕 | 国产一区二区三区免费在线观看 | 亚洲91久久| 岛国中文字幕 | 国产午夜一级片 | 国产精品91久久 | 热久久精品免费视频 | 亚洲人在线播放 | 国产偷v国产偷v亚洲高清 | 免费的理伦片在线播放 | 国产精品丝袜视频 | 欧美一区自拍 | 蜜桃精品在线 | 亚洲午夜电影网 | 国产欧美精品一区二区在线播放 | 国产二区自拍 | 精品丰满少妇一区二区三区 | 久久久区 | 一区二区三区视频在线观看免费 | 亚洲乱熟女一区二区 | av黄色在线看 | 一区二区国产欧美 | 黑森林av凹凸导航 | 国产老女人精品毛片久久 | 天天干天| 日韩偷拍一区 | 最近中文字幕第一页 | 日韩特级黄色片 | 综合视频在线观看 | 亚洲免费色图 | 国产精品久久久久久久久久久新郎 | 日韩欧美手机在线 | 麻豆精品av | 韩国黄色网址 | 吃奶av| 成人av在线网址 | 男人av的天堂 | 少妇无码一区二区三区 | 国产精品免费视频观看 | 特一级黄色| 国产69xx| missav|免费高清av在线看 | 成人在线观看免费爱爱 | 黄在线观看免费 | 激情五月婷婷网 | 欧美人与动物xxx | 久久久久久美女 | 国产成人精品亚洲精品色欲 | 国产精品福利影院 | 中文字幕乱码亚洲无线三区 | 女人扒开腿免费视频app | 夜夜嗨国产 | 插少妇视频 | 日本欧美精品 | 手机av网址|