匯編語(yǔ)言:第10章 call和ret指令_第1頁(yè)
匯編語(yǔ)言:第10章 call和ret指令_第2頁(yè)
匯編語(yǔ)言:第10章 call和ret指令_第3頁(yè)
匯編語(yǔ)言:第10章 call和ret指令_第4頁(yè)
匯編語(yǔ)言:第10章 call和ret指令_第5頁(yè)
已閱讀5頁(yè),還剩14頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第10章call和ret指令ret和retf指令call指令ret和call指令配合完成子程序調(diào)用mul乘法指令模塊化程序設(shè)計(jì)一、返回指令ret和retf格式:ret

;實(shí)現(xiàn)近轉(zhuǎn)移,相當(dāng)于popip 格式:retf;實(shí)現(xiàn)遠(yuǎn)轉(zhuǎn)移,相當(dāng)于popip,popcsassumecs:codestack segmentdb16dup(0)stack endscode segmentmovax,4c00hint21hstart:movax,stack movss,ax movsp,16 movax,0 pushax movbx,0 retcode endsend startassumecs:codestack segmentdb16dup(0)stack endscode segmentmovax,4c00hint21hstart:movax,stack movss,ax movsp,16 movax,0 pushcs pushax movbx,0 retfcode endsend start一、返回指令ret和retf格式:ret

;實(shí)現(xiàn)近轉(zhuǎn)移,相當(dāng)于popip 格式:retf;實(shí)現(xiàn)遠(yuǎn)轉(zhuǎn)移,相當(dāng)于popip,popcs例10-1.補(bǔ)全程序,實(shí)現(xiàn)從內(nèi)存1000:0處開始執(zhí)行指令。assume cs:codestack segment db16dup(0)stack endscode segmentstart: movax,stack movss,ax movsp,16 movax,

pushax movax,

pushax retfcode endsend startret和retf指令執(zhí)行時(shí),將當(dāng)前堆棧內(nèi)容分別出棧給ip或ip和cs,以實(shí)現(xiàn)指令的近或遠(yuǎn)轉(zhuǎn)移。二、call指令執(zhí)行call指令的功能相當(dāng)于:1、puship或pushcs、puship;2、修改當(dāng)前ip或ip和cs指向目的地址。Call指令的主要格式:根據(jù)位移轉(zhuǎn)移轉(zhuǎn)移的目的地址在指令中轉(zhuǎn)移地址在寄存器中轉(zhuǎn)移地址在內(nèi)存中

1、依據(jù)位移進(jìn)行轉(zhuǎn)移的call指令格式:

call標(biāo)號(hào)功能:將當(dāng)前IP壓棧,IP=IP+16位的位移量,轉(zhuǎn)移到標(biāo)號(hào)處執(zhí)行。例10-2下面的程序執(zhí)行后,AX中的數(shù)值為多少??jī)?nèi)存地址 機(jī)器碼 匯編指令1000:0 B80000 MOVAX,01000:3 E80100 CALLS1000:6 40 INCAX1000:7 58 S:POPAX2、轉(zhuǎn)移的目的地址在指令中的call指令格式:

callfarptr標(biāo)號(hào)功能:

將當(dāng)前CS、IP壓棧,用標(biāo)號(hào)所在地址修改CS和IP實(shí)現(xiàn)遠(yuǎn)轉(zhuǎn)移。例10-3下面的程序執(zhí)行后,AX中的數(shù)值為多少??jī)?nèi)存地址 機(jī)器碼 匯編指令1000:0 B80000 MOVAX,01000:3 9A09000010 CALLFARPTRS1000:8 40 INCAX1000:9 58 S:POPAX ADDAX,AX POPBX ADDAX,BX3、轉(zhuǎn)移地址在寄存器中的call指令格式:

callreg(16位的寄存器)功能:

將當(dāng)前IP壓棧,用寄存器中的值修改IP實(shí)現(xiàn)近轉(zhuǎn)移。例10-4下面的程序執(zhí)行后,AX中的數(shù)值為多少??jī)?nèi)存地址 機(jī)器碼 匯編指令1000:0 B80600 MOVAX,61000:2 FFD0 CALLAX1000:5 40 INCAX1000:6 MOVBP,SP ADDAX,[BP]4、轉(zhuǎn)移地址在內(nèi)存中的call指令格式:

callword(dword)ptr[內(nèi)存單元]功能:

將當(dāng)前IP或IP、CS壓棧,用內(nèi)存單元中的字或雙字修改IP或IP和CS。movsp,10hmovax,0123hmovds:[0],axmovwordptrds:[2],0calldwordptrds:[0]執(zhí)行后IP=?CS=?例10-5下面的程序執(zhí)行后,AX中的數(shù)值為多少?Assume cs:codeStack segment dw8dup(0)Stack endsCode segmentStart:movax,stack movss,ax movsp,16 movds,ax movax,0 callwordptrds:[0eh] incax incax incaxCode endsEnd startss(ds):000:000100:000200:000300:000400:000500:000600:000700:000800:000900:000A00:000B00:000C00:000D00:000E00:000F00:0010spspIP4、轉(zhuǎn)移地址在內(nèi)存中的call指令格式:

callword(dword)ptr[內(nèi)存單元]功能:

將當(dāng)前IP或IP、CS壓棧,用內(nèi)存單元中的字或雙字修改IP或IP和CS。例10-5下面的程序執(zhí)行后,ax和bx中的數(shù)值為多少?assume cs:codestack segment dw8dup(0)stack endscode segmentstart:movax,data movss,ax movsp,16 movwordptrss:[0],offsets movss:[2],cs calldwordptrss:[0] nops: movax,offsets subax,ss:[0ch] movbx,cs subbx,ss:[0eh]code endsend startss:000:000100:000200:000300:000400:000500:000600:000700:000800:000900:000A00:000B00:000C00:000D00:000E00:000F00:0010spsp1900CSCSsp1800AX=0001hBX=0000h二、call指令執(zhí)行call指令的功能相當(dāng)于:1、puship或pushcs、puship;2、修改當(dāng)前ip或ip和cs指向目的地址。Call指令的主要格式:根據(jù)位移轉(zhuǎn)移轉(zhuǎn)移的目的地址在指令中轉(zhuǎn)移地址在寄存器中轉(zhuǎn)移地址在內(nèi)存中Call標(biāo)號(hào)

Callfarptr標(biāo)號(hào)

Callreg(16位)Callword(dword)ptr[內(nèi)存]jmp標(biāo)號(hào)jmpfarptr標(biāo)號(hào)jmpregjmpword(dword)ptr[內(nèi)存]三、call和ret配合使用(實(shí)現(xiàn)子程序調(diào)用)問題10-1下面程序返回前,BX中的值為多少?assumecs:codecode segmentstart:movax,1 movcx,3 calls movbx,ax movax,4c00h int21hs: addax,ax loops

retcode endsend start

源程序 內(nèi)存中的情況(設(shè)程序從1000:0處裝入)Assumecs:code Stacksegmentdb8dup(0) 1000:0000 0000000000000000db8dup(0) 1000:0008 0000000000000000Stack ends Code segmentStart: movax,stack 1001:0000 B80010 movss,ax 1001:0003 8ED0 movsp,16 1001:0005 BC1000 movax,1000 1001:0008 B8E803 calls 1001:000B E80500 movax,4c00h 1001:000E B8004C int21h 1001:0011 CD21S: addax,ax 1001:0013 03C0 ret 1001:0015 C3Code endsEnd start使用call和ret實(shí)現(xiàn)子程序:子程序的格式框架:具有子程序的源程序的框架:標(biāo)號(hào): 指令

retassumecs:codecode segmentstart:

calls1 movax,4c00h int21hs1:

calls2

rets2:

retCode endsEnd start四、乘法指令mul格式:mulreg mul[內(nèi)存單元]功能:字節(jié)(8位)或字(16位)的無(wú)符號(hào)相乘。說明:兩個(gè)相乘的數(shù)位數(shù)相同,8位乘法(乘數(shù)和被乘數(shù)都為8位數(shù));16位乘法(乘數(shù)和被乘數(shù)都為16位。)8位乘法中,一個(gè)乘數(shù)默認(rèn)在AL中,另一個(gè)由指令給出,16位的結(jié)果默認(rèn)保存在AX中。16位乘法中,一個(gè)乘數(shù)默認(rèn)在AX中,另一個(gè)由指令給出,32位的結(jié)果中高位保存在DX中,低位在AX中。例:計(jì)算100×10Moval,100Movbl,10Mulbl例:計(jì)算100×10000Movax,100Movbx,10000Mulbx五、模塊化程序設(shè)計(jì)

用call和ret指令可實(shí)現(xiàn)匯編語(yǔ)言中的模塊化設(shè)計(jì),可使用call指令在主程序中調(diào)用子程序來(lái)解決子問題,子問題解決后用ret指令來(lái)返回主程序。一、子程序中的參數(shù)和結(jié)果例:計(jì)算N的3次方的子程序;說明:計(jì)算N的3次方;參數(shù):(BX)=N;結(jié)果:(DX:AX)=N3Cube:movax,bx mulbx mulbx ret注:在編寫程序時(shí),應(yīng)對(duì)程序有必要的注釋內(nèi)容。子程序的注釋中應(yīng)包含子程序的功能、參數(shù)和結(jié)果的說明。編程:計(jì)算data段中第一組數(shù)據(jù)的3次方,結(jié)果保存到后面的一組dword單元中。Assume cs:codeData segment dw1,2,3,4,5,6,7,8 dd0,0,0,0,0,0,0,0Data endsCode segment start: movax,data movds,ax movsi,0 movdi,16 mo

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論