版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
80X86匯編語言與C語言-棧與x86-棧的工作規(guī)過程調(diào)用中的寄存器使用棧也用 局部變
x86-盡量減少對于棧x86-32的程序從高地址向低地址“增 棧頂
棧StackStack棧StackStackStack從Src取得操%esp=%esp-寫入棧頂?shù)刂稴tack出棧popl棧頂數(shù)據(jù)%esp=%esp+寫入
StackStackStackStack利用棧支持過程調(diào)用與過過程調(diào)用指令call 將返回地址壓入棧,跳轉(zhuǎn)至返返回地Call指令的下一條指令匯編804854e:e83d0600 8048b908048553: pushlReturnaddress=過過程返回指令 跳轉(zhuǎn)至棧頂?shù)姆祷剡^程調(diào)用0600 %eip%eip是指 器(program過程返回8048591:%eip是指 器(program基于棧的編程語支持遞e.g.,C,Pascal,代碼是可重入的同時有同一個過程的多個實(shí)例在因此需要有一塊區(qū)域 每個過程實(shí)例的數(shù)參局部變返回地棧的工作規(guī)每個過程實(shí)例的運(yùn)行時間是有限的,即棧的有效時間有Fromwhencalledtowhen被調(diào)用者先于調(diào)用者返回(一般情況下每個過程實(shí)例在棧 一個棧幀(stackCode{Code{????}{??????}{{????}的內(nèi)局部變返回地臨時空棧幀的分配與釋進(jìn)入過程后先“分配”棧幀空“Set-up”過程返回時”釋放“Finish”
Stack 寄存器%ebp指向當(dāng)前棧幀的地
過程調(diào)用過程調(diào)用{????}
???{??{??}????
??????{??{???}
?????{??{???}
???{??{???}
???{??{???}?
???{??{???}?
?????{??{????}??
??????{???{????}amIamI
?????{??{??????}amI
??????{??{???}?amI
???當(dāng)前棧幀的內(nèi)容當(dāng)前棧幀的內(nèi)容(自“頂”向下子過程參“Argument局部變因?yàn)橥ㄓ眉拇嫫鱾€數(shù)被保存的寄存器父過程的棧幀起始地址父過程父過程的棧幀中與當(dāng)前過的內(nèi)返回地由call指令當(dāng)前過程的輸入?yún)?/p>
ReturnOldReturnOld+棧頂指回顧下swap
Callingswapfrom??intzip1=15213;intintzip1=15213;intzip2=void{swap(&zip1,}voidswap(int*xp,voidswap(int*xp,{}t0=t1===???Rtn
#GlobalVar#Global運(yùn)行voidswap(intvoidswap(int*xp,int{intt0=intt1=*xp=*yp=}movl8(%ebp),%edxmovl(%ecx),%eaxmovl(%edx),%ebxmovl%eax,(%edx)movl%ebx,(%ecx)movl%ebp,%esppopl%ebp
swapSetup
??????Rtnpushl%ebpmovl%esp,%ebppushl%ebx
??????RtnOldswapSetup?????Rtn
???Rtn???RtnOldpushl%ebpmovl%esp,%ebppushl%ebxswapSetup?????Rtn
??????RtnOldOldpushl%ebpmovl%esp,%ebppushl%ebx
??????RtnRtn???8(relativeto8 4 Rtn4Rtnmovl12(%ebp),%ecx#getmovl8(%ebp),%edx#get..
OldOldOldswapFinish??????RtnOldOld84
??????RtnOldOld84
Saved&restoredregister
movl-4(%ebp),%ebxmovl%ebp,%esppopl%ebpswapFinish??????RtnOldOld84
??????RtnOld84
movl-4(%ebp),%ebxmovl%ebp,%esppopl%ebpswapFinish??????RtnOld84
84
??????Rtnmovl-4(%ebp),%ebxmovl%ebp,%esppopl%ebp???Rtn???Rtn84
??????Saved&restoredregisterDidn’tdosofor%eax,%ecx,or
movl-4(%ebp),%ebxmovl%ebp,%esppopl%ebp寄存器使用過程yoo調(diào)用yoo who如何使用寄存器作為程序的臨 ???movl$15213,calladdl%edx,????movl8(%ebp),addl$91125,??%edx過程yoo調(diào)用yoo who如何使用寄存器作為程序的臨 使用慣例——通用寄存器分為“調(diào)用者負(fù)責(zé)保存Caller在調(diào)用子過程之前將這些寄存器內(nèi) 在它的棧幀“被調(diào)用者負(fù)責(zé)保存Callee在使用這些寄存器之前將其原有內(nèi) 在它的棧幀X86-32/Linux下的使用88個兩個特殊寄存%ebp,三個由調(diào)用者負(fù)責(zé)保%ebx,%esi,三個由被調(diào)用者負(fù)責(zé)存%eax,%edx,%eax用于保存過程返值
被調(diào)負(fù)責(zé)保特殊intintrfact(int{intrval;if(x<=returnrval=rfact(x-returnrval*}寄寄存器使用情%eax直接%ebx使用前保存舊出前恢
.globlpushl%ebpmovl%esp,%ebppushl%ebx movl8(%ebp),%ebxcmpl$1,%ebxjleleal-pushlcallrfactimull%ebx,%eaxjmp.L79.alignmovlmovl-movlpoplRtnRtnxprepreEnteringpupushhlppreprepreprex8x4
pupushhlpushl%ebpmovl%esp,%ebppushl%ebxpushl%ebpmovl%esp,%ebppushl%ebxRtnRtn
OldOldOld
intrfact(int{intintrfact(int{intif(x<=returnrval=rfact(x-1)returnrval*}movl#ebx=cmpl#Comparex:jle#If<=gotoleal-#eax=x-pushl#Pushx-call#imull#rval*jmp#Goto #movl #returnval= # x的臨 過程實(shí)例rfact(x-1)的返回lealleal-pushlpushlxRtnxRtnOldOld
xRtnOldxRtnOldOldxRtnOldOldRtn
callcallxx
xxximullReturnimullxRtnxRtnOldOldxxAssumethatrfact(x-returns(x-1)!in
xxRtnxxRtnOldOldpreprepreprexRtnOldOld40OldOld
l-lmovl-4(%ebp),%ebxmovl%ebp,%esppopl%ebp
preprepreprex8xRtnRtnOldOldOldOld
OldOldpreprexRtn
void(intvoid(intx,int{if(x<=1)elseintz=*accum**accum=s_helper(x-}}
Top-Levelintintsfact(int{intval=1;s_helper(x,&val);returnval;}創(chuàng)建指lp #elp #tl #d1116lx=xl) #l=1pushl#Savemovl#Setsubl#Add16movl#edx=movl$1,- #val=使用 臨時變Val必須存在棧Val的地址為%ebp-
40
intsfact(intintsfact(int{intval=1;s_helper(x,&val);returnval;}xRtnOldval=調(diào)用s_helper過
Stackattimeofll-x#lx #hnl #hl #l-x#?? #leal-4(%ebp),%eax#Computepushl #Pushonpushl #Pushcall #movl-4(%ebp),%eax#Return? #xRtnOldvalx40intsfact(intintsfact(int{intval=1;s_helper(x,&val);returnval;}
valval使用voidvoid(intx,int{??intz=*accum**accum=??}
xx??movl%ecx,%eax #z=ximull(%edx),%eax#z*=*accummovl%eax,(%edx)#*accum=z?? 變量 變量X86-32過程調(diào)用程序各個過程運(yùn)行實(shí)例的似有不同實(shí)例間避免相互過程本地變量與參數(shù)存于棧內(nèi)(采用相對于棧幀基址%ebp的尋址符合棧的基本工作規(guī)過程返回順序與過程調(diào)用的順序相關(guān)指令與寄存器使用CallRet指寄存器使用慣調(diào)用者/被調(diào)用者%ebp%esp兩個特殊寄棧幀 內(nèi)x86-64通用寄存相比于32位結(jié)構(gòu),寄存器個數(shù)加Accessibleas8,16,32,or64x86-64寄存器使用 Return ArgumentCallee Argument Return ArgumentCallee ArgumentArgument CalleeArgumentUsedfor ArgumentC:CalleeArgumentCalleeStackCalleeCalleeCalleex86-64寄存過程參數(shù)(不超過6個)通過寄存器大于6個的仍使用棧這些傳遞參數(shù)的寄存器可以看成是“調(diào)用者保存所有對于棧幀內(nèi)容 都是基于%esp完成%ebp完全用作通用寄x86-64下的swap過程-voidvoidswap(long*xp,long{longt0=longt1=*xp=*yp=}
(%rdi),%rdx(%rsi),%rax,%rdx,參數(shù)由寄存器傳First(xp)in%rdi,second(yp)in64無需任何棧操局部變量 于寄存器x86-64下的swap過程-強(qiáng)制使用強(qiáng)制使用???*Swap,usinglocalarrayvoidswap_a(long*xp,long{volatilelongloc[0]=*xp;loc[1]=*xp=*yp=}rtnrtn但在但在實(shí)際使用中沒有修頂寄存器
(%rdi),%rax,-(%rsi),%rax,--16(%rsp),%rax,-24(%rsp),%rax,swap_ele_se沒有棧幀,為什x86-64中swap_ele_se沒有棧幀,為什longlongscount=/*Swapa[i]&a[i+1]void(longa[],int{swap(&a[i],}#Signextend#8(%rdi),###x86-64中的swap過程-longscount=/*Swapa[i]&a[i+1]voidlongscount=/*Swapa[i]&a[i+1]void(longa[],int{swap(&a[i],}#Signextend8(%rdi),%rsi#x86-64的棧幀使用longlongsum=/*Swapa[i]&a[i+1]void(longa[],int{sum+=a[i];}因此必須分配棧幀來存這些寄存與swap_ele_se有不同
%rbx,-%r12,-%rdi,(%rdi,%rbx,8),$16,%rsp8(%rdi),%rsi(%r12,%rbx,8),%rax,sum(%rip)(%rsp),%rbx8(%rsp),%r12$16, %rbx,-16(%rsp)movslq%esi,%rbx %r12,- %rdi,
#Save#Extend&save#Save#Save (%rdi,%rbx,8),%rdi# $16, #Allocatestack
8(%rdi),
#(%r12,%rbx,8),%rax# %rax,sum(%rip)#sum+= (%rsp),%rbx 8(%rsp),%r12 $16,%rsp
#Restore#Restore#Deallocatestackmovq%rbx,-16(%rsp)movq%r12,-8(%rsp)
#Save%rbx#Save
rtnrtnsubq$16,
#Allocatestackrtnrtn(%rsp),#Restore8(%rsp),#Restoreaddq$16, #DeallocatestackX86-64下的棧幀的一些不同分配整個將%esp減去某個值(棧幀的大小對于棧幀內(nèi)容 都是基于%esp完成可以延遲分可以直 不超過當(dāng)前棧指針(%esp)128字節(jié)的棧上空釋放簡%esp直接加上某個值(棧幀的大小x86-64過程調(diào)用小頻繁使用寄存參數(shù)傳減少對棧的使甚至不使用分配與釋優(yōu)化操可以直接使用部分的???/p>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度裝飾裝修工程安裝合同
- 2024年工程材料供應(yīng)與驗(yàn)收合同
- 公司員工檢討書
- 2024年度新能源發(fā)電設(shè)備采購與銷售合同
- 2024年度W公司環(huán)保服務(wù)合同協(xié)議書
- 2024年建筑公司員工聘用合同
- 2024年度網(wǎng)絡(luò)通訊工程安全文明施工管理協(xié)議
- 2024年大型油田勘探開發(fā)合作合同(海外)
- 2024年度某航空公司飛機(jī)采購合同
- 2024年度區(qū)塊鏈應(yīng)用合作協(xié)議
- 暖通工程師面試試題(含答案)
- 行政服務(wù)中心窗口工作人員手冊
- 最新患者用藥情況監(jiān)測
- 試樁施工方案 (完整版)
- ESTIC-AU40使用說明書(中文100版)(共138頁)
- 河北省2012土建定額說明及計(jì)算規(guī)則(含定額總說明)解讀
- 中工商計(jì)算公式匯總.doc
- 深圳市建筑裝飾工程消耗量標(biāo)準(zhǔn)(第三版)2003
- 《初中英語課堂教學(xué)學(xué)困生轉(zhuǎn)化個案研究》開題報告
- 恒溫箱PLC控制系統(tǒng)畢業(yè)設(shè)計(jì)
- 176033山西《裝飾工程預(yù)算定額》定額說明及計(jì)算規(guī)則
評論
0/150
提交評論