PowerPC棧幀分析_第1頁(yè)
PowerPC棧幀分析_第2頁(yè)
PowerPC棧幀分析_第3頁(yè)
PowerPC棧幀分析_第4頁(yè)
PowerPC棧幀分析_第5頁(yè)
已閱讀5頁(yè),還剩3頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、PowerPC棧幀分析1 .PowerPC存放器的使用規(guī)那么通用存放器的用途:r0在函數(shù)開(kāi)始function prologs時(shí)使用。r1堆棧指針,相當(dāng)于ia32架構(gòu)中的esp存放器,idapro把這個(gè)存放器反匯編標(biāo)識(shí)為sp。r2內(nèi)容表toc指針,idapro把這個(gè)存放器反匯編標(biāo)識(shí)為rtoc。系統(tǒng)調(diào)用時(shí),它包含系統(tǒng)調(diào)用號(hào)這個(gè)好似跟系統(tǒng)有關(guān)吧。r3作為第一個(gè)參數(shù)和返回值。r4-r10函數(shù)或系統(tǒng)調(diào)用開(kāi)始的參數(shù)。r11 用在指針的調(diào)用和當(dāng)作一些語(yǔ)言的環(huán)境指針。r12 它用在異常處理和glink動(dòng)態(tài)連接器代碼。r13 保存作為系統(tǒng)線程ID。r14-r31 作為本地變量,非易失性。專用存放器的用途:lr鏈

2、接存放器,它用來(lái)存放函數(shù)調(diào)用結(jié)束處的返回地址。ctr 計(jì)數(shù)存放器,它用來(lái)當(dāng)作循環(huán)計(jì)數(shù)器,會(huì)隨特定轉(zhuǎn)移操作而遞減。xer 定點(diǎn)異常存放器,存放整數(shù)運(yùn)算操作的進(jìn)位以及溢出信息。msr 機(jī)器狀態(tài)存放器,用來(lái)配置微處理器的設(shè)定。cr條件存放器,它分成8個(gè)4位字段,cr0-cr7,它反映了某個(gè)算法操作的結(jié)果并且提供條件分支的機(jī)制。2.棧幀的使用規(guī)那么PowerPC存放器沒(méi)有專用的Pop,Push指令來(lái)執(zhí)行堆棧操作,所以PowerPC構(gòu)架使用存儲(chǔ)器訪問(wèn)指令stwu,lwzu來(lái)代替Push和Pop指令。PowerPC處理器使用GPR1來(lái)將這個(gè)堆棧段構(gòu)成一個(gè)單向鏈表,這個(gè)單鏈表的每一個(gè)數(shù)據(jù)成員,我們稱之為堆棧

3、幀Stack Frame,每一個(gè)函數(shù)負(fù)責(zé)維護(hù)自己的堆棧幀。PowerPC體系結(jié)構(gòu)中棧的增長(zhǎng)方向是從高地址到低地址,堆的增長(zhǎng)方式是從低地址到搞地址,當(dāng)兩者相遇時(shí)就會(huì)產(chǎn)生溢出。堆棧幀的格式如下:各局部名詞解釋:函數(shù)參數(shù)域Function Parameter Area:這個(gè)區(qū)域的大小是可選的,即如果如果調(diào)用函數(shù)傳遞給被調(diào)用函數(shù)的參數(shù)少于六個(gè)時(shí),用GPR4至GPR10這個(gè)六個(gè)存放器就可以了,被調(diào)用函數(shù)的棧幀中就不需要這個(gè)區(qū)域;但如果傳遞的參數(shù)多于六個(gè)時(shí)就需要這個(gè)區(qū)域。局部變量域Local Variables Area:通上所示,如果臨時(shí)存放器的數(shù)量缺乏以提供應(yīng)被調(diào)用函數(shù)的臨時(shí)變量使用時(shí),就會(huì)使用這個(gè)域

4、。CR存放器:即使修改了CR存放器的某一個(gè)段CRxx=0至7,都有保存這個(gè)CR存放器的內(nèi)容。通用存放器GPR:當(dāng)需要保存GPR存放器中的一個(gè)存放器器GPRn時(shí),就需要把從GPRn到GPR31的值都保存到堆棧幀中。浮點(diǎn)存放器FPR:使用規(guī)那么共GPR存放器。3.PowerPC的匯編指令和棧操作 PowerPC存放器沒(méi)有專用的push和pop指令來(lái)執(zhí)行堆棧操作,所以PowerPC構(gòu)架使用存儲(chǔ)器訪問(wèn)指令stwu、lwzu來(lái)代替push和pop指令。4.函數(shù)執(zhí)行時(shí)棧幀的建立與消亡過(guò)程函數(shù)棧的建立與消亡過(guò)程如下列圖所示:4.1函數(shù)棧的建立與消亡過(guò)程說(shuō)明如前所屬,PowerPC體系結(jié)構(gòu)中棧的增長(zhǎng)方向是從高

5、地址到低地址,故形成過(guò)程可以概括為如下幾點(diǎn):1) 調(diào)用函數(shù)r1指向棧頂(SP),用間接尋址方式分配一定大小??臻g;2) r31指向棧頂,以r31為基值將參數(shù)壓入棧內(nèi);3) 進(jìn)入被調(diào)函數(shù),跳轉(zhuǎn)到被調(diào)函數(shù)的SP處;4) 被調(diào)函數(shù)同樣進(jìn)行棧分配及參數(shù)壓棧操作;5) 被調(diào)函數(shù)執(zhí)行完畢之后,跳轉(zhuǎn)LR,返回到被調(diào)用處的下一條指令,繼續(xù)后續(xù)操作(此時(shí)的SP即為調(diào)用函數(shù)的SP)4.2舉例說(shuō)明棧操作過(guò)程以下以一個(gè)簡(jiǎn)單的函數(shù)調(diào)用,說(shuō)明PowerPC棧的操作過(guò)程。函數(shù)例子如下:int calltest2( int a) int t1=5; int t2 = 6; int result =0; char * p =0

6、; *p =a; int calltest1( int a) int t1=3; int t2 = 4; int result =0; result = calltest2( t2); t1 =3;void calltest( ) int t1=7; int t2 = 9; int result =0; result = calltest1( t1); t1 =3;利用反匯編工具,生成匯編代碼及分析如下:int calltest2( int a)Calltest2棧幀建立分析:stwu r1,-48(r1):分配48字節(jié)的棧幀,r1指向棧頂;(powerpc省略了EBP,所以一上來(lái)即進(jìn)行一次間

7、接尋址)stw r31,44(r1):保存r31的原值,以后恢復(fù);or r31,r1,r1:讓r31指向棧頂r1r31=r1 or r31stw r3,8(r31):第一個(gè)形參0x401d4f0 calltest2: stwu r1,-48(r1)0x401d4f4 +0x004: stw r31,44(r1)0x401d4f8 +0x008: or r31,r1,r10x401d4fc +0x00c: stw r3,8(r31)局部變量賦值:li r0 5(t1,t2.result) int t1=5;0x401d500 +0x010: li r0,0x5 # 50x401d504 +0x0

8、14: stw r0,12(r31) int t2 = 6;0x401d508 +0x018: li r0,0x6 # 60x401d50c +0x01c: stw r0,16(r31) int result =0; 0x401d510 +0x020: li r0,0x0 # 00x401d514 +0x024: stw r0,20(r31) char * p =0;0x401d518 +0x028: li r0,0x0 # 00x401d51c +0x02c: stw r0,24(r31)加載函數(shù)調(diào)用參數(shù)到r9 *p =a;0x401d520 +0x030: lwz r9,24(r31)0x

9、401d524 +0x034: lbz r0,11(r31)保存r9到r00x401d528 +0x038: stb r0,0(r9) r11=r1,r31=r11-4=r1-4,恢復(fù)r31的值0x401d52c +0x03c: lwz r11,0(r1)0x401d530 +0x040: lwz r31,-4(r11)0x401d534 +0x044: or r1,r11,r11blr:跳轉(zhuǎn)到LR地址,返回calltest1中調(diào)用calltest2的下一條指令地址0x401d57c的繼續(xù)指向0x401d538 +0x048: blr int calltest1( int a)0x401d53

10、c calltest1: stwu r1,-48(r1)將LR內(nèi)容存入r0存在函數(shù)調(diào)用時(shí)需要用到LR,用來(lái)存放函數(shù)調(diào)用結(jié)束處的返回地址0x401d540 +0x004: mfspr r0,LR0x401d544 +0x008: stw r31,44(r1)0x401d548 +0x00c: stw r0,52(r1)0x401d54c +0x010: or r31,r1,r10x401d550 +0x014: stw r3,8(r31)局部變量賦值t1,t2,result int t1=3;0x401d554 +0x018: li r0,0x3 # 30x401d558 +0x01c: stw

11、 r0,12(r31) int t2 = 4;0x401d55c +0x020: li r0,0x4 # 40x401d560 +0x024: stw r0,16(r31) int result =0;0x401d564 +0x028: li r0,0x0 # 00x401d568 +0x02c: stw r0,20(r31)函數(shù)調(diào)用 result = calltest2( t2);0x401d56c +0x030: lwz r3,16(r31)0x401d570 +0x034: bl 0x401d4f0 # calltest20x401d574 +0x038: or r0,r3,r30x40

12、1d578 +0x03c: stw r0,20(r31) t1 =3;0x401d57c +0x040: li r0,0x3 # 30x401d580 +0x044: stw r0,12(r31)0x401d584 +0x048: lwz r11,0(r1)0x401d588 +0x04c: lwz r0,4(r11)0x401d58c +0x050: mtspr LR,r00x401d590 +0x054: lwz r31,-4(r11)0x401d594 +0x058: or r1,r11,r11返回calltest函數(shù)的下一條指令地址0x401d5d8的繼續(xù)指向0x401d598 +0x

13、05c: blr void calltest( )0x401d59c calltest: stwu r1,-48(r1)0x401d5a0 +0x004: mfspr r0,LR0x401d5a4 +0x008: stw r31,44(r1)0x401d5a8 +0x00c: stw r0,52(r1)0x401d5ac +0x010: or r31,r1,r1 int t1=7;0x401d5b0 +0x014: li r0,0x7 # 70x401d5b4 +0x018: stw r0,8(r31) int t2 = 9;0x401d5b8 +0x01c: li r0,0x9 # 90x4

14、01d5bc +0x020: stw r0,12(r31) int result =0;0x401d5c0 +0x024: li r0,0x0 # 00x401d5c4 +0x028: stw r0,16(r31)調(diào)用函數(shù)calltrst1:將t1(r31+8)加載到r3中,然后跳轉(zhuǎn)到calltest1地址處(0x401d53c) result = calltest1( t1);0x401d5c8 +0x02c: lwz r3,8(r31)0x401d5cc +0x030: bl 0x401d53c # calltest10x401d5d0 +0x034: or r0,r3,r3保存resul

15、t返回值0x401d5d4 +0x038: stw r0,16(r31)調(diào)用完成,開(kāi)始后續(xù)指令操作 t1 =3;0x401d5d8 +0x03c: li r0,0x3 # 30x401d5dc +0x040: stw r0,8(r31)0x401d5e0 +0x044: lwz r11,0(r1)0x401d5e4 +0x048: lwz r0,4(r11)0x401d5e8 +0x04c: mtspr LR,r00x401d5ec +0x050: lwz r31,-4(r11)0x401d5f0 +0x054: or r1,r11,r110x401d5f4 +0x058: blr 下面利用斷

16、點(diǎn)調(diào)試跟蹤棧內(nèi)存執(zhí)行過(guò)程1)在進(jìn)入calltest但未執(zhí)行任何指令(參數(shù)還未賦值)時(shí),查看存放器及內(nèi)存分布如下:r0 = c7cbd8 r1/sp = a8ce6c0 r2 = 0 r3 = 0r4 = 0 r5 = 0 r6 = 0 r7 = 0r8 = 0 r9 = 0 r10 = 0 r11 = a8ce738r12 = 401d59c r13 = 0 r14 = 0 r15 = 0r16 = 0 r17 = 0 r18 = 0 r19 = 0r20 = 0 r21 = 0 r22 = 0 r23 = 0r24 = 0 r25 = 0 r26 = 0 r27 = 0r28 = 0 r29

17、 = 0 r30 = 0 r31 = a8ce6c0msr = b030 lr = c7cbd8 ctr = 0 pc = 401d5b0cr = 0 xer = 0 mq = eeeeeeee內(nèi)存空間為此時(shí)sp=0xa8ce6c0,r31指向r1,pc=0x401d5b02)執(zhí)行到result=0(局部變量賦值完成,但沒(méi)有調(diào)用caltest1)在緊跟SP之后,SP+8即為局部變量存儲(chǔ)區(qū),此時(shí)此時(shí)sp=0xa8ce6c03)再執(zhí)行result=calltest(t1),跳進(jìn)calltest1之后但未進(jìn)行任何操作r0 = 401d5d0 r1/sp = a8ce690 r2 = 0 r3 = 7

18、r4 = 0 r5 = 0 r6 = 0 r7 = 0r8 = 0 r9 = 0 r10 = 0 r11 = a8ce738r12 = 401d59c r13 = 0 r14 = 0 r15 = 0r16 = 0 r17 = 0 r18 = 0 r19 = 0r20 = 0 r21 = 0 r22 = 0 r23 = 0r24 = 0 r25 = 0 r26 = 0 r27 = 0r28 = 0 r29 = 0 r30 = 0 r31 = a8ce690msr = b030 lr = 401d5d0 ctr = 0 pc = 401d554cr = 0 xer = 0 mq = 0此時(shí)SP=0Xa8ce690,相對(duì)于原SP。正好移動(dòng)48字節(jié)(即calltest??臻g)。內(nèi)存分布為執(zhí)行函數(shù)到result=calltest2對(duì)于有函數(shù)參數(shù)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論