與匯編7語言過程調(diào)用中寄存器使用慣例_第1頁
與匯編7語言過程調(diào)用中寄存器使用慣例_第2頁
與匯編7語言過程調(diào)用中寄存器使用慣例_第3頁
與匯編7語言過程調(diào)用中寄存器使用慣例_第4頁
與匯編7語言過程調(diào)用中寄存器使用慣例_第5頁
已閱讀5頁,還剩55頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論