《匯編語(yǔ)言》講稿_10.ppt_第1頁(yè)
《匯編語(yǔ)言》講稿_10.ppt_第2頁(yè)
《匯編語(yǔ)言》講稿_10.ppt_第3頁(yè)
《匯編語(yǔ)言》講稿_10.ppt_第4頁(yè)
《匯編語(yǔ)言》講稿_10.ppt_第5頁(yè)
已閱讀5頁(yè),還剩74頁(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、匯編語(yǔ)言課件,王爽編寫,清華大學(xué)出版社,第10章,調(diào)用和ret指令,10.1 ret和retf 10.2調(diào)用指令10.3調(diào)用轉(zhuǎn)移指令,根據(jù)指令10.5中的位移10.4調(diào)用轉(zhuǎn)移目的地址的指令轉(zhuǎn)移寄存器中的地址10.6調(diào)用轉(zhuǎn)移存儲(chǔ)器中的地址的指令10.7調(diào)用和ret配合使用10.8 mul指令10.9模塊化編程10.10參數(shù)和結(jié)果傳輸10.11批量數(shù)據(jù)傳輸10.12介紹、呼叫和ret指令都是轉(zhuǎn)移指令,可以修改IP或同時(shí)修改CS和IP。它們經(jīng)常一起用來(lái)實(shí)現(xiàn)子程序的設(shè)計(jì)。在本章中,我們將解釋調(diào)用和ret命令的原理。10.1 ret和retf,ret指令利用堆棧中的數(shù)據(jù)修改IP的內(nèi)容,從而實(shí)現(xiàn)近傳輸;操

2、作retf指令用堆棧中的數(shù)據(jù)修改控制和IP的內(nèi)容,實(shí)現(xiàn)遠(yuǎn)程傳輸;操作,10.1 ret和retf,當(dāng)中央處理器執(zhí)行ret指令時(shí),執(zhí)行以下兩個(gè)步驟:(1)(IP)=(ss)* 16(sp)(2)(sp)=(sp)2,10.1 ret和retf,當(dāng)中央處理器執(zhí)行retf指令時(shí),執(zhí)行以下四個(gè)步驟:(1)(IP)=(ss)* 16(sp)(2)(sp)=(sp)2(3)(cs)=(ss)* 16(sp)(4)(sp)=(sp)2,相當(dāng)于:當(dāng)pop IP CPU執(zhí)行retf指令時(shí),相當(dāng)于:pop IP pop CS,10.1 ret和retf。執(zhí)行示例程序ret指令程序中的ret指令后,(IP)=0,C

3、S:IP指向代碼段的第一條指令。在執(zhí)行retf指令程序中的retf指令后,CS:IP指向代碼段的第一條指令。特別是,檢測(cè)點(diǎn)10.1(p179)還沒(méi)有完成該檢測(cè)點(diǎn),請(qǐng)不要向下進(jìn)行。10.2調(diào)用指令,中央處理器執(zhí)行該調(diào)用指令,并執(zhí)行兩個(gè)步驟:(1)將當(dāng)前IP或CS和IP推入堆棧;(2)轉(zhuǎn)讓。呼叫指令不能實(shí)現(xiàn)短傳。否則,調(diào)用指令的傳遞方法與jmp指令相同。在下面的小節(jié)中,我們將解釋調(diào)用指令的主要應(yīng)用格式,以不同的方法傳輸目的地址作為主線。10.3調(diào)用指令按移位轉(zhuǎn)移,調(diào)用標(biāo)簽(按下當(dāng)前的IP棧后,轉(zhuǎn)移到標(biāo)簽執(zhí)行指令)當(dāng)中央處理器以這種格式執(zhí)行調(diào)用指令時(shí),它執(zhí)行以下操作:(1)(SP)=(SP)2(SS

4、)* 16(SP)=(IP)(2)(IP)=(IP)10.3調(diào)用指令按移位轉(zhuǎn)移,調(diào)用標(biāo)簽為16位移位=在“標(biāo)簽”處的地址,以及調(diào)用指令后第一個(gè)字節(jié)的地址;16位移位的范圍是-3276832767,用補(bǔ)碼表示;16位移位由編譯器在編譯時(shí)計(jì)算。演示、10.3根據(jù)位移傳遞的調(diào)用指令。從上面的描述可以看出,如果我們用匯編語(yǔ)法來(lái)解釋這種格式的調(diào)用指令,當(dāng)中央處理器執(zhí)行指令“調(diào)用標(biāo)簽”時(shí),就相當(dāng)于:把IP jmp推到ptr標(biāo)簽附近。特別建議檢查點(diǎn)10.2(p181)沒(méi)有完成該檢查點(diǎn),請(qǐng)不要往下進(jìn)行。10.4指令中帶有轉(zhuǎn)移目的地址的調(diào)用指令,即上面解釋的調(diào)用指令,在相應(yīng)的機(jī)器指令中沒(méi)有轉(zhuǎn)移目的地址,而是相對(duì)

5、于當(dāng)前IP的轉(zhuǎn)移位移。指令“呼叫遠(yuǎn)端ptr標(biāo)簽”實(shí)現(xiàn)段間傳輸。操作,10.4指令中帶有轉(zhuǎn)移目的地址的調(diào)用指令,當(dāng)中央處理器以“調(diào)用遠(yuǎn)ptr標(biāo)簽”格式執(zhí)行調(diào)用指令時(shí)的操作:(1)(sp)=(sp)2(ss)16(sp)=(cs)(sp)2(ss)16(sp)=(IP)(2)(cs=標(biāo)簽所在的偏移地址,10.4轉(zhuǎn)移目的地址是指令中的調(diào)用指令。從上面的描述可以看出,如果我們用匯編語(yǔ)法來(lái)解釋這種格式的調(diào)用指令,當(dāng)中央處理器執(zhí)行“調(diào)用遠(yuǎn)ptr標(biāo)簽”指令時(shí),就相當(dāng)于:推CS推IP jmp遠(yuǎn)ptr標(biāo)簽。特別是,建議檢查點(diǎn)10.3(p181)沒(méi)有完成該檢查點(diǎn),所以請(qǐng)不要下去。10.5調(diào)用指令,轉(zhuǎn)移地址在寄存器

6、中,指令格式:調(diào)用16位寄存器函數(shù):(sp)=(sp)2(ss)* 16(sp)=(IP)=(16位寄存器),10.5調(diào)用指令,轉(zhuǎn)移地址在寄存器中,指令格式:調(diào)用16位寄存器匯編語(yǔ)法以這種格式解釋調(diào)用指令。當(dāng)中央處理器執(zhí)行調(diào)用16位寄存器時(shí),它相當(dāng)于推IP jmp 16位寄存器。特別建議檢查點(diǎn)10.4(p182)尚未完成該檢查點(diǎn),因此請(qǐng)不要向下進(jìn)行。10.6內(nèi)存中帶轉(zhuǎn)移地址的調(diào)用指令,有兩種格式:(1)調(diào)用字ptr內(nèi)存單元地址(2)調(diào)用dword ptr內(nèi)存單元地址,10.6內(nèi)存中帶轉(zhuǎn)移地址的調(diào)用指令,(1)調(diào)用字ptr內(nèi)存單元地址匯編的語(yǔ)法說(shuō)明:push IP jmp字ptr內(nèi)存單元地址示例

7、,10.6內(nèi)存中轉(zhuǎn)移地址的調(diào)用指令,(1)調(diào)用字ptr內(nèi)存單元地址(示例)如以下指令:mov sp,10h mov ax, 0123h mov ds:0,ax呼叫字ptr ds:0,(IP)=0123H,(sp)=0EH,10.6存儲(chǔ)器中有地址的轉(zhuǎn)移呼叫指令,(2)呼叫dword ptr存儲(chǔ)單元地址匯編的語(yǔ)法解釋:推送CS推送IP jmp dword ptr存儲(chǔ)單元地址示例,10.6存儲(chǔ)器中有轉(zhuǎn)移地址的呼叫指令,(2)呼叫dword ptr存儲(chǔ)單元地址(示例)例如,以下指令:mov sp,10h mov ax 特別建議檢測(cè)點(diǎn)10.5(p195)沒(méi)有完成該檢測(cè)點(diǎn),請(qǐng)不要,10.7呼叫和呼叫指令的

8、協(xié)同使用,之前我們已經(jīng)分別學(xué)習(xí)了呼叫指令和呼叫指令的原理?,F(xiàn)在我們來(lái)看看如何將它們結(jié)合起來(lái)實(shí)現(xiàn)子程序的機(jī)制。問(wèn)題10.1,10.7呼叫和ret的使用,假設(shè)cs:代碼段開始于:mov ax,1mov CX,3call s mov bx,ax;(bx)=?MOVAX,4C00H INT21H S: ADDAX,AX LOOP S RET代碼ENDS ENDS START,問(wèn)題10.1在正確的程序返回之前,bx中的值是多少?思考之后,看看分析。讓我們來(lái)看一下中央處理器執(zhí)行這個(gè)程序的主要過(guò)程:(1)中央處理器讀入調(diào)用指令的機(jī)器碼,并在調(diào)用后指向指令mov bx、ax,然后中央處理器執(zhí)行調(diào)用指令,推當(dāng)前

9、的IP值(指令MOVX、AX的偏移地址),并將IP值改為標(biāo)簽S處的偏移地址;(2)中央處理器開始執(zhí)行來(lái)自標(biāo)簽s的指令,循環(huán)結(jié)束,(ax)=8;10.7調(diào)用和ret的使用,問(wèn)題10.1分析(續(xù))讓我們來(lái)看看中央處理器執(zhí)行這個(gè)程序的主要過(guò)程:(3)中央處理器讀取ret指令的機(jī)器碼,IP指向ret指令后面的存儲(chǔ)單元,然后中央處理器執(zhí)行ret指令,并從堆棧中彈出一個(gè)值(即調(diào)用之前按下的movbx和ax指令的偏移地址)并將其發(fā)送到IP。然后,CS:IP指向指令movbx,ax;(4)中央處理器開始執(zhí)行來(lái)自mov bx,ax的指令,直到它完成。10.7調(diào)用和ret的使用,問(wèn)題10.1程序返回前的分析(續(xù))

10、,bx=8。我們可以看到,從標(biāo)簽s到ret的程序段的功能是計(jì)算2的n次方。在計(jì)算之前,n的值由CX提供。讓我們來(lái)看看下面的程序:10.7 2)調(diào)用和ret,10.7調(diào)用和ret。讓我們看看程序的主要執(zhí)行過(guò)程:(1)前三條指令執(zhí)行后,堆棧如下:(10.7調(diào)用和ret一起使用,程序的主要執(zhí)行過(guò)程:(2)調(diào)用指令被讀取后,(IP)=000EH,在中央處理器指令緩沖區(qū)。中央處理器執(zhí)行B8 05 00。首先,堆棧中的情況變?yōu)椋喝缓螅?IP)=(IP) 0005=0013H。10.7調(diào)用和ret一起使用,程序的主要執(zhí)行過(guò)程如下:(3)中央處理器從cs:0013H(即標(biāo)簽s)開始執(zhí)行。(4)讀取4)ret指

11、令后:(IP)=0016H,中央處理器指令緩沖區(qū)中的代碼為C3;中央處理器執(zhí)行C3,這相當(dāng)于流行的知識(shí)產(chǎn)權(quán)。執(zhí)行后,堆棧中的情況是:(IP)=000 eh;10.7在調(diào)用和ret的協(xié)同使用下,程序的主要執(zhí)行過(guò)程:(5)CPU返回到cs:000EH(即調(diào)用指令后面的指令)繼續(xù)執(zhí)行。從上面的討論中,我們發(fā)現(xiàn)我們可以編寫一個(gè)帶有特定函數(shù)的程序段,我們稱之為子程序,必要時(shí),使用調(diào)用指令來(lái)執(zhí)行它。10.7調(diào)用和ret的使用,但在執(zhí)行子程序后,如何使中央處理器執(zhí)行調(diào)用指令下來(lái)?在調(diào)用指令執(zhí)行子程序之前,調(diào)用指令后面的指令的地址將被存儲(chǔ)在堆棧中,所以ret指令可以在子程序后面使用,而IP值可以用堆棧中的數(shù)據(jù)

12、來(lái)設(shè)置,以便轉(zhuǎn)到調(diào)用指令后面的代碼繼續(xù)執(zhí)行。10.7調(diào)用和ret的使用,這樣,我們就可以用調(diào)用和ret來(lái)實(shí)現(xiàn)子程序機(jī)制。子程序框架:10.7調(diào)用和ret,子程序框架:指令ret,源程序框架:子程序,10.7調(diào)用和ret,現(xiàn)在我們可以從子程序的角度來(lái)看這一節(jié)中的兩個(gè)程序。10.8 mul指令,因?yàn)樗鼘⒃谙旅媸褂茫屛覀兘榻Bmul指令,mul是一個(gè)乘法指令,當(dāng)mul用于乘法時(shí):(1)兩個(gè)數(shù)字的乘法:8位或16位。8位:以8位寄存器或存儲(chǔ)字節(jié)為單位;16位:AX和16位寄存器或存儲(chǔ)字單元。10.8 mul指令,當(dāng)mul用于乘法時(shí):(2)結(jié)果8位:在AX中;16位:DX(高位)和AX(低位)。格式如下

13、:mul reg mul存儲(chǔ)器單元,10.8 mul指令,存儲(chǔ)器單元可以以不同的尋址方式給出,例如:mul字節(jié)ptr ds:0的意思是:(ax)=(al)*(ds)* 160);Mul字ptr bx si 8表示:(ax)=(ax)*(ds)*16 (bx) (si) 8)結(jié)果的低16位;(dx)=(ax)*(ds)*16 (bx) (si) 8)結(jié)果的高16位;10.8位乘法指令,例如:(1)計(jì)算100*10 100和10小于255,8位乘法可以完成,程序如下:100 mov bl,100 mov bl,10 mul bl結(jié)果:(ax)=1000(03E8H),10.8位乘法指令,例如:(1

14、)計(jì)算1000但10000大于255,所以必須完成16位乘法。程序如下:mov ax,100 mov bx,10000 mul bx結(jié)果:(ax)=4240H,(dx)=dx)=000FH (F4240H=1000000),10.9),模塊化編程,從上面我們可以看出調(diào)用和ret指令,在實(shí)際編程中,程序的模塊化是必要的。因?yàn)閷?shí)際問(wèn)題是復(fù)雜的,所以在分析時(shí)有必要將它們轉(zhuǎn)化為不同層次的相關(guān)子問(wèn)題。10.9模塊化編程、調(diào)用和ret指令為此分析方法提供程序?qū)崿F(xiàn)支持。通過(guò)使用call和ret指令,我們可以用簡(jiǎn)單的方法實(shí)現(xiàn)幾個(gè)具有獨(dú)立功能的相關(guān)子程序,從而解決一個(gè)復(fù)雜的問(wèn)題。在以下內(nèi)容中,我們將了解子程序設(shè)

15、計(jì)中的相關(guān)問(wèn)題和解決方案。10.10參數(shù)和結(jié)果傳輸問(wèn)題,子程序一般根據(jù)提供的參數(shù)處理某些事務(wù),并在處理后,向調(diào)用者提供結(jié)果(返回值)。事實(shí)上,當(dāng)我們討論參數(shù)和返回值的傳遞時(shí),我們實(shí)際上是在討論如何存儲(chǔ)子程序所需的參數(shù)和返回值。10.10參數(shù)和結(jié)果傳輸,我們?cè)O(shè)計(jì)了一個(gè)子程序,可以根據(jù)提供的n計(jì)算n的三次冪。這里有兩個(gè)問(wèn)題:(1)參數(shù)n存儲(chǔ)在哪里?(2)我們?cè)谀睦锎鎯?chǔ)計(jì)算值?10.10參數(shù)和結(jié)果傳輸?shù)膯?wèn)題,顯然,我們可以使用寄存器來(lái)存儲(chǔ)參數(shù)并將其放入bx;由于NNN是在子程序中計(jì)算的,所以可以使用多條mul指令,并且為了方便,可以將結(jié)果放入dx和ax中。子程序,10.10參數(shù)和結(jié)果傳輸問(wèn)題,子程序:描述:計(jì)算n的立方參數(shù):(BX)=n結(jié)果:(DX : AX)=N3立方3360 MOVAX,BX Mulbx Mulbx Ret,10.10參數(shù)和結(jié)果傳輸問(wèn)題,注意編程時(shí)要注意好的風(fēng)格,并對(duì)程序做詳

溫馨提示

  • 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)論