《深入理解計算機(jī)系統(tǒng)》基礎(chǔ)知識-使用函數(shù)_第1頁
《深入理解計算機(jī)系統(tǒng)》基礎(chǔ)知識-使用函數(shù)_第2頁
《深入理解計算機(jī)系統(tǒng)》基礎(chǔ)知識-使用函數(shù)_第3頁
《深入理解計算機(jī)系統(tǒng)》基礎(chǔ)知識-使用函數(shù)_第4頁
《深入理解計算機(jī)系統(tǒng)》基礎(chǔ)知識-使用函數(shù)_第5頁
已閱讀5頁,還剩32頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

匯編指令——使用函數(shù)當(dāng)應(yīng)用程序中需要相同的代碼時,可以創(chuàng)建包含此代碼段的函數(shù)(function),然后調(diào)用此函數(shù)。數(shù)據(jù)從主程序傳遞給函數(shù),然后結(jié)果返回給主程序。函數(shù)在匯編語言中創(chuàng)建函數(shù)的步驟:1)定義需要的輸入值:寄存器,全局變量,堆棧2)定義對輸入值進(jìn)行的操作(可以放置于主程序之前或之后).typefunc1,@functionfunc1:3)定義如何生成輸出值及傳遞給調(diào)用程序:把結(jié)果放于一個或多個寄存器中;放于全局變量內(nèi)存變量中20160022.s——使用寄存器20160023.s——使用全局變量創(chuàng)建函數(shù)使用全局變量的例子:20160024.c不建議使用全局變量:1)全局變量在程序的全部執(zhí)行過程中都占用存儲單元,而不是僅在需要時才開辟單元。2)函數(shù)的通用性/獨立性降低,因為函數(shù)在執(zhí)行時要依賴于其所在的外部變量。3)函數(shù)的清晰性降低,難于調(diào)試。4)局部變量與全局變量同名時,有可能會產(chǎn)生問題。函數(shù)——使用全局變量在調(diào)用函數(shù)之前,主程序把函數(shù)所需要的輸入?yún)?shù)放到堆棧的頂部。(C樣式要求參數(shù)存放到堆棧中的順序與函數(shù)原型中的順序相反)。堆棧指針(%esp)指向堆棧頂部。函數(shù)——使用堆棧由于在函數(shù)處理過程中可能有壓棧操作,改變%esp中的值,因此一般進(jìn)入函數(shù)的時候,會把%esp的內(nèi)容復(fù)制到%ebp,以確保有一個寄存器永遠(yuǎn)包含指向調(diào)用函數(shù)時的堆棧頂部的正確指針。函數(shù)——使用堆棧function: pushl%ebp movl%esp,%ebp . . movl%ebp,%esp popl%ebp ret函數(shù)——使用堆棧在設(shè)置了函數(shù)參數(shù)后,局部變量也將存放到堆棧中。函數(shù)——使用堆棧為了保證%esp指向棧頂,在函數(shù)代碼的開始添加一行,從%esp寄存器中減去一個值,為局部變量保留一定數(shù)量的堆??臻g。function: pushl%ebp movl%esp,%ebp subl$12,%esp函數(shù)——使用堆棧20160025.c函數(shù)——使用堆棧pushl %ebp

movl %esp,%ebp

subl $24,%esp

movl $3,-4(%ebp)#i

movl $4,-8(%ebp)#j

movl $0,-12(%ebp)#k

movl -8(%ebp),%eax

movl %eax,4(%esp)

movl -4(%ebp),%eax

movl %eax,(%esp)

call f_1

movl %eax,-12(%ebp)

movl $0,%eaxEBP,ESP舊的EBP值ebp-4ebp-8ebp-12ebp-16ebp-20ebp-24ebp-28pushl %ebp

movl %esp,%ebp

subl $24,%esp

movl $3,-4(%ebp)#i

movl $4,-8(%ebp)#j

movl $0,-12(%ebp)#k

movl -8(%ebp),%eax

movl %eax,4(%esp)

movl -4(%ebp),%eax

movl %eax,(%esp)

call f_1

movl %eax,-12(%ebp)

movl $0,%eaxebp舊的EBP值ebp-4ebp-8ebp-12ebp-16ebp-20esp,ebp-24ebp-28pushl %ebp

movl %esp,%ebp

subl $24,%esp

movl $3,-4(%ebp)#i

movl $4,-8(%ebp)#j

movl $0,-12(%ebp)#k

movl -8(%ebp),%eax

movl %eax,4(%esp)

movl -4(%ebp),%eax

movl %eax,(%esp)

call f_1

movl %eax,-12(%ebp)

movl $0,%eaxebp舊的EBP值ebp-43//i=3;ebp-8ebp-12ebp-16ebp-20esp,ebp-24ebp-28pushl %ebp

movl %esp,%ebp

subl $24,%esp

movl $3,-4(%ebp)#i

movl $4,-8(%ebp)#j

movl $0,-12(%ebp)#k

movl -8(%ebp),%eax

movl %eax,4(%esp)

movl -4(%ebp),%eax

movl %eax,(%esp)

call f_1

movl %eax,-12(%ebp)

movl $0,%eaxebp舊的EBP值ebp-43//i=3;ebp-84//j=4;ebp-120//k=0;ebp-16esp+4,ebp-20esp,ebp-24esp-4,ebp-28esp-8,ebp-32pushl %ebp

movl %esp,%ebp

subl $24,%esp

movl $3,-4(%ebp)#i

movl $4,-8(%ebp)#j

movl $0,-12(%ebp)#k

movl -8(%ebp),%eax

movl %eax,4(%esp)

#參數(shù)j入棧

movl -4(%ebp),%eax

movl %eax,(%esp)#參數(shù)i入棧

call f_1

movl %eax,-12(%ebp)

movl $0,%eaxebp舊的EBP值ebp-43//i=3;ebp-84//j=4;ebp-120//k=0;ebp-16esp+4,ebp-204//f_1(i,j)中的jesp,ebp-243//f_1(i,j)中的iesp-4,ebp-28esp-8,ebp-32pushl %ebp

movl %esp,%ebp

subl $24,%esp

movl $3,-4(%ebp)#i

movl $4,-8(%ebp)#j

movl $0,-12(%ebp)#k

movl -8(%ebp),%eax

movl %eax,4(%esp)

#參數(shù)j入棧

movl -4(%ebp),%eax

movl %eax,(%esp)#參數(shù)i入棧

call f_1

movl %eax,-12(%ebp)

movl $0,%eaxebp舊的EBP值ebp-43//i=3;ebp-84//j=4;ebp-120//k=0;ebp-16esp+8,ebp-204//f_1(i,j)中的jesp+4,ebp-243//f_1(i,j)中的iesp,ebp-28下一條指令的返回地址esp-4,ebp-32pushl %ebp

movl %esp,%ebp

subl $24,%esp

movl $1,-4(%ebp)

movl $2,-8(%ebp)

movl -8(%ebp),%eax

movl 12(%ebp),%edx

addl %eax,%edx

movl -4(%ebp),%eax

movl 8(%ebp),%ecx

leal (%ecx,%eax),%eax

movl %edx,4(%esp)

movl %eax,(%esp)

call f_0

addl %eax,%eax

movl %eax,-12(%ebp)

movl -12(%ebp),%eax

leave

retebp舊的EBP值ebp-43//i=3;ebp-84//j=4;ebp-120//k=0;ebp-16esp+12,ebp-204//f_1(i,j)中的jesp+8,ebp-243//f_1(i,j)中的iesp+4,ebp-28下一條指令的返回地址esp,ebp-32main函數(shù)的ebp舊值pushl %ebp

movl %esp,%ebp

subl $24,%esp

movl $1,-4(%ebp)

movl $2,-8(%ebp)

movl -8(%ebp),%eax

movl 12(%ebp),%edx

addl %eax,%edx

movl -4(%ebp),%eax

movl 8(%ebp),%ecx

leal (%ecx,%eax),%eax

movl %edx,4(%esp)

movl %eax,(%esp)

call f_0

addl %eax,%eax

movl %eax,-12(%ebp)

movl -12(%ebp),%eax

leave

retesp+32,ebp+32舊的EBP值esp+28,ebp+283//i=3;esp+24,ebp+244//j=4;esp+20,ebp+200//k=0;esp+16,ebp+16esp+12,ebp+124//f_1(i,j)中的jesp+8,ebp+83//f_1(i,j)中的iesp+4,ebp+4下一條指令的返回地址esp,ebpmain函數(shù)的ebp舊值pushl %ebp

movl %esp,%ebp

subl $24,%esp

movl $1,-4(%ebp)

movl $2,-8(%ebp)

movl -8(%ebp),%eax

movl 12(%ebp),%edx

addl %eax,%edx

movl -4(%ebp),%eax

movl 8(%ebp),%ecx

leal (%ecx,%eax),%eax

movl %edx,4(%esp)

movl %eax,(%esp)

call f_0

addl %eax,%eax

movl %eax,-12(%ebp)

movl -12(%ebp),%eax

leave

retesp+56,ebp+32舊的EBP值esp+52,ebp+283//i=3;esp+48,ebp+244//j=4;esp+44,ebp+200//k=0;esp+40,ebp+16esp+36,ebp+124//f_1(i,j)中的jesp+32,ebp+83//f_1(i,j)中的iesp+28,ebp+4下一條指令的返回地址esp+24,ebpmain函數(shù)的ebp舊值esp+20esp+16esp+12esp+8esp+4esppushl %ebp

movl %esp,%ebp

subl $24,%esp

movl $1,-4(%ebp)

movl $2,-8(%ebp)

movl -8(%ebp),%eax

movl 12(%ebp),%edx

addl %eax,%edx

movl -4(%ebp),%eax

movl 8(%ebp),%ecx

leal (%ecx,%eax),%eax

movl %edx,4(%esp)

movl %eax,(%esp)

call f_0

addl %eax,%eax

movl %eax,-12(%ebp)

movl -12(%ebp),%eax

leave

retesp+56,ebp+32舊的EBP值esp+52,ebp+283//i=3;esp+48,ebp+244//j=4;esp+44,ebp+200//k=0;esp+40,ebp+16esp+36,ebp+124//f_1(i,j)中的jesp+32,ebp+83//f_1(i,j)中的iesp+28,ebp+4下一條指令的返回地址esp+24,ebpmain函數(shù)的ebp舊值esp+20,ebp-41//局部變量aesp+16,ebp-82//局部變量besp+12esp+8esp+4esp

movl $2,-8(%ebp)

#f_0(x+a,y+b)

movl -8(%ebp),%eax

movl 12(%ebp),%edx

addl %eax,%edx

#準(zhǔn)備最右邊的參數(shù)y+b

movl -4(%ebp),%eax

movl 8(%ebp),%ecx

leal (%ecx,%eax),%eax

#準(zhǔn)備最左邊的參數(shù)x+a

movl %edx,4(%esp)

movl %eax,(%esp)

#參數(shù)入棧

call f_0

addl %eax,%eax

esp+56,ebp+32舊的EBP值esp+52,ebp+283//i=3;esp+48,ebp+244//j=4;esp+44,ebp+200//k=0;esp+40,ebp+16esp+36,ebp+124//f_1(i,j)中的jesp+32,ebp+83//f_1(i,j)中的iesp+28,ebp+4下一條指令的返回地址esp+24,ebpmain函數(shù)的ebp舊值esp+20,ebp-41//局部變量aesp+16,ebp-82//局部變量besp+12esp+8esp+46//y+besp4//x+apushl %ebp

movl %esp,%ebp

subl $24,%esp

movl $1,-4(%ebp)

movl $2,-8(%ebp)

movl -8(%ebp),%eax

movl 12(%ebp),%edx

addl %eax,%edx

movl -4(%ebp),%eax

movl 8(%ebp),%ecx

leal (%ecx,%eax),%eax

movl %edx,4(%esp)

movl %eax,(%esp)

call f_0

addl %eax,%eax

movl %eax,-12(%ebp)

movl -12(%ebp),%eax

leave

retesp+56,ebp+32舊的EBP值esp+56,ebp+283//i=3;esp+52,ebp+244//j=4;esp+48,ebp+200//k=0;esp+44,ebp+16esp+40,ebp+124//f_1(i,j)中的jesp+36,ebp+83//f_1(i,j)中的iesp+32,ebp+4下一條指令的返回地址esp+28,ebpmain函數(shù)的ebp舊值esp+24,ebp-41//局部變量aesp+20,ebp-82//局部變量besp+16esp+12esp+86//y+besp+44//x+aespaddl指令的地址pushl %ebp

movl %esp,%ebp

subl $16,%esp

movl 8(%ebp),%eax

movl %eax,%edx

imull 8(%ebp),%edx

movl 12(%ebp),%eax

imull 12(%ebp),%eax

leal (%edx,%eax),%eax

movl %eax,-4(%ebp)

movl -4(%ebp),%eax

leave

ret舊的EBP值3//i=3;4//j=4;0//k=0;ebp+124//f_1(i,j)中的jebp+83//f_1(i,j)中的iebp+4下一條指令的返回地址ebpmain函數(shù)的ebp舊值esp+28,ebp-41//局部變量aesp+24,ebp-82//局部變量besp+20esp+16esp+126//y+besp+84//x+aesp+4addl指令的地址espf_1函數(shù)的ebp舊值pushl %ebp

movl %esp,%ebp

subl $16,%esp

movl 8(%ebp),%eax

movl %eax,%edx

imull 8(%ebp),%edx

movl 12(%ebp),%eax

imull 12(%ebp),%eax

leal (%edx,%eax),%eax

movl %eax,-4(%ebp)

movl -4(%ebp),%eax

leave

ret舊的EBP值3//i=3;4//j=4;0//k=0;4//f_1(i,j)中的j3//f_1(i,j)中的iebp+36下一條指令的返回地址ebp+32main函數(shù)的ebp舊值esp+28,ebp+281//局部變量aesp+24,ebp+242//局部變量besp+20esp+16esp+126//y+besp+84//x+aesp+4,ebp+4addl指令的地址esp,ebpf_1函數(shù)的ebp舊值pushl %ebp

movl %esp,%ebp

subl $16,%esp

movl 8(%ebp),%eax

movl %eax,%edx

imull 8(%ebp),%edx

movl 12(%ebp),%eax

imull 12(%ebp),%eax

leal (%edx,%eax),%eax

movl %eax,-4(%ebp)

movl -4(%ebp),%eax

leave

ret4//f_1(i,j)中的j3//f_1(i,j)中的iebp+36下一條指令的返回地址ebp+32main函數(shù)的ebp舊值esp+28,ebp+281//局部變量aesp+24,ebp+242//局部變量besp+20esp+16esp+126//y+besp+84//x+aesp+4,ebp+4addl指令的地址esp,ebpf_1函數(shù)的ebp舊值pushl %ebp

movl %esp,%ebp

subl $16,%esp

movl 8(%ebp),%eax

movl %eax,%edx

imull 8(%ebp),%edx

movl 12(%ebp),%eax

imull 12(%ebp),%eax

leal (%edx,%eax),%eax

movl %eax,-4(%ebp)

movl -4(%ebp),%eax

leave

ret4//f_1(i,j)中的j3//f_1(i,j)中的iebp+36下一條指令的返回地址ebp+32main函數(shù)的ebp舊值esp+44,ebp+281//局部變量aesp+40,ebp+242//局部變量besp+36esp+32esp+286//y+besp+244//x+aesp+20,ebp+4addl指令的地址esp+16,ebpf_1函數(shù)的ebp舊值esp+12esp+8esp+4esppushl %ebp

movl %esp,%ebp

subl $16,%esp

#計算s

movl 8(%ebp),%eax

movl %eax,%edx

imull 8(%ebp),%edx

#計算x*x,結(jié)果存在edx中

movl 12(%ebp),%eax

imull 12(%ebp),%eax

leal (%edx,%eax),%eax

movl %eax,-4(%ebp)

movl -4(%ebp),%eax

leave

ret4//f_1(i,j)中的j3//f_1(i,j)中的iebp+36下一條指令的返回地址ebp+32main函數(shù)的ebp舊值esp+44,ebp+281//局部變量aesp+40,ebp+242//局部變量besp+36esp+32esp+286//y+besp+24,ebp+84//x+aesp+20,ebp+4addl指令的地址esp+16,ebpf_1函數(shù)的ebp舊值esp+12esp+8esp+4esppushl %ebp

movl %esp,%ebp

subl $16,%esp

#計算s

movl 8(%ebp),%eax

movl %eax,%edx

imull 8(%ebp),%edx

#計算x*x,結(jié)果存在edx中

movl 12(%ebp),%eax

imull 12(%ebp),%eax

#計算y*y,結(jié)果存在eax中

leal (%edx,%eax),%eax

#leal5(%edx,%ecx,2),%eax

movl %eax,-4(%ebp)

movl -4(%ebp),%eax

leave

ret4//f_1(i,j)中的j3//f_1(i,j)中的iebp+36下一條指令的返回地址ebp+32main函數(shù)的ebp舊值esp+44,ebp+281//局部變量aesp+40,ebp+242//局部變量besp+36esp+32esp+286//y+besp+24,ebp+84//x+aesp+20,ebp+4addl指令的地址esp+16,ebpf_1函數(shù)的ebp舊值esp+12esp+8esp+4esppushl %ebp

movl %esp,%ebp

subl $16,%esp

#計算s

movl 8(%ebp),%eax

movl %eax,%edx

imull 8(%ebp),%edx

#計算x*x,結(jié)果存在edx中

movl 12(%ebp),%eax

imull 12(%ebp),%eax

#計算y*y,結(jié)果存在eax中

leal (%edx,%eax),%eax

#leal5(%edx,%edx,2),%eax

movl %eax,-4(%ebp)

movl -4(%ebp),%eax

leave

ret4//f_1(i,j)中的j3//f_1(i,j)中的iebp+36下一條指令的返回地址ebp+32main函數(shù)的ebp舊值esp+44,ebp+281//局部變量aesp+40,ebp+242//局部變量besp+36esp+32esp+286//y+besp+24,ebp+84//x+aesp+20,ebp+4addl指令的地址esp+16,ebpf_1函數(shù)的ebp舊值esp+12esp+8esp+4esppushl %ebp

movl %esp,%ebp

subl $16,%esp

#計算s

movl 8(%ebp),%eax

movl %eax,%edx

imull 8(%ebp),%edx

#計算x*x,結(jié)果存在edx中

movl 12(%ebp),%eax

imull 12(%ebp),%eax

#計算y*y,結(jié)果存在eax中

leal (%edx,%eax),%eax

#leal5(%edx,%edx,2),%eax

movl %eax,-4(%ebp)

movl -4(%ebp),%eax

leave

ret4//f_1(i,j)中的j3//f_1(i,j)中的iebp+36下一條指令的返回地址ebp+32main函數(shù)的ebp舊值esp+44,ebp+281//局部變量aesp+40,ebp+242//局部變量besp+36esp+32esp+286//y+besp+24,ebp+84//x+aesp+20,ebp+4addl指令的地址esp+16,ebpf_1函數(shù)的ebp舊值esp+12,ebp-452//x*x+y*yesp+8esp+4esppushl %ebp

movl %esp,%ebp

subl $16,%esp

#計算s

movl 8(%ebp),%eax

movl %eax,%edx

imull 8(%ebp),%edx

#計算x*x,結(jié)果存在edx中

movl 12(%ebp),%eax

imull 12(%ebp),%eax

#計算y*y,結(jié)果存在eax中

leal (%edx,%eax),%eax

#leal5(%edx,%edx,2),%eax

movl %eax,-4(%ebp)

movl -4(%ebp),%eax

leave

#恢復(fù)ebp舊值,恢復(fù)esp到返回地址

ret4//f_1(i,j)中的j3//f_1(i,j)中的iebp下一條指令的返回地址ebpmain函數(shù)的ebp舊值esp+24,ebp-41//局部變量aesp+20,ebp-82//局部變量besp+16esp+12esp+86//y+besp+44//x+aespaddl指令的地址f_1函數(shù)的ebp舊值52//x*x+y*ypushl %ebp

movl %esp,%ebp

subl $16,%esp

#計算s

movl 8(%ebp),%eax

movl %eax,%edx

imull 8(%ebp),%edx

#計算x*x,結(jié)果存在edx中

movl 12(%ebp),%eax

imull 12(%ebp),%eax

#計算y*y,結(jié)果存在eax中

leal (%edx,%eax),%eax

#leal5(%edx,%edx,2),%eax

movl %eax,-4(%ebp)

movl -4(%ebp),%eax

leave

#恢復(fù)ebp舊值,恢復(fù)esp到返回地址

ret4//f_1(i,j)中的j3//f_1(i,j)中的iebp下一條指令的返回地址ebpmain函數(shù)的ebp舊值esp+24,ebp-41//局部變量aesp+20,ebp-82//局部變量besp+16esp+12esp+86//y+besp+44//x+aespaddl指令的地址f_1函數(shù)的ebp舊值52//x*x+y*ypushl %ebp

movl %esp,%ebp

subl $16,%esp

#計算s

movl 8(%ebp),%eax

movl %eax,%edx

imull 8(%ebp),%edx

#計算x*x,結(jié)果存在edx中

movl 12(%ebp),%eax

imull 12(%ebp),%eax

#計算y*y,結(jié)果存在eax中

leal (%edx,%eax),%eax

#leal5(%edx,%edx,2),%eax

movl %eax,-4(%ebp)

movl -4(%ebp),%eax

leave

ret

#將棧頂返回地址彈出至$eip4//f_1(i,j)中的j3//f_1(i,j)中的iebp下一條指令的返回地址ebpmain函數(shù)的ebp舊值esp+20,ebp-41//局部變量aesp+16,ebp-82//局部變量besp+12esp+8esp+46//y+besp4//x+aaddl指令的地址f_1函數(shù)的ebp舊值52//x*x+y*y4//f_1(i,j)中的j3//f_1(i,j)中的iebp下一條指令的返回地址ebpmain函數(shù)的ebp舊值esp+20,ebp-41//局部變量aesp+16,ebp-82//局部變量besp+12esp+8esp+46//y+besp4//x+aaddl指令的地址f_1函數(shù)的ebp舊值52//x*x+y*yesp+56,ebp+32舊的EBP值esp+52,ebp+283//i=3;esp+48,ebp+244//j=4;esp+44,ebp+200//k=0;esp+40,ebp+16esp+36,ebp+124//f_1(i,j)中的jesp+32,ebp+83//f_1(i,j)中的iesp+28,ebp+4下一條指令的返回地址esp+24,ebpmain函數(shù)的ebp舊值esp+20,ebp-41//局部變量aesp+16,ebp-82//局部變量besp+12esp+8esp+46//y+besp4//x+a

movl $2,-8(%ebp)

#f_0(x+a,y+b)

movl -8(%ebp),%eax

movl 12(%ebp),%edx

addl %eax,%edx

#準(zhǔn)備最右邊的參數(shù)y+b

movl -4(%ebp),%eax

movl 8(%ebp),%ecx

leal (%ecx,%eax),%eax

#準(zhǔn)備最左邊的參數(shù)

溫馨提示

  • 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

提交評論