微機原理課件34_第1頁
微機原理課件34_第2頁
微機原理課件34_第3頁
微機原理課件34_第4頁
微機原理課件34_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

3.3.5程序控制指令控制轉(zhuǎn)移指令分為:轉(zhuǎn)移指令循環(huán)控制指令調(diào)用和返回指令中斷指令1轉(zhuǎn)移指令的實質(zhì):改變IP(或CS)的內(nèi)容。所有轉(zhuǎn)移指令不會影響標志位。分為無條件轉(zhuǎn)移和條件轉(zhuǎn)移兩種。1.轉(zhuǎn)移指令2(1)無條件轉(zhuǎn)移指令

-JMP本指令無條件轉(zhuǎn)移到指定的目標地址,以執(zhí)行從該地址開始的程序段。根據(jù)設(shè)置CS、IP的方法,JMP指令分成4種情況。

①段內(nèi)直接轉(zhuǎn)移:JMPdisp

指令中給出的8/16位的位移量加到IP。CS保持不變。

②段內(nèi)間接轉(zhuǎn)移:JMPreg/mem

reg/mem中的16位偏移地址送IP。CS保持不變。③段間直接轉(zhuǎn)移JMPsegment:offset

指令中給出的16位的段和16位的偏移地址送到CS和IP。

④段間間接轉(zhuǎn)移JMPmem32

mem32中的16位的段和16位的偏移地址送到CS和IP。3轉(zhuǎn)移的目標地址由指令直接給出。指令中給出的目標地址實際上是一個相對于IP的位移量:

位移量轉(zhuǎn)移范圍匯編語言中格式8位-128~+127JMPSHORTOPRD16位-32768~+32767JMPNEARPTROPRD例:JMP 0120H ;直接轉(zhuǎn)向0120H JMP SHORTLP ;轉(zhuǎn)向LPJMP NEARPTRBBB ;轉(zhuǎn)向BBB由于是段內(nèi)轉(zhuǎn)移,故轉(zhuǎn)移后CS內(nèi)容保持不變①段內(nèi)直接轉(zhuǎn)移4目的地址相對尋址方式5②段內(nèi)間接轉(zhuǎn)移轉(zhuǎn)移的目標地址由寄存器或存儲單元的內(nèi)容給出。

例1:JMPSI若(SI)=1200H,則指令執(zhí)行后,(IP)=1200H,于是轉(zhuǎn)向代碼段的偏移地址1200H處開始執(zhí)行。注意:目標地址以段內(nèi)偏移的形式給出,而不是相對于IP的位移量,所以它是一個16位的操作數(shù)。6例2:JMP[BX+DI]設(shè)指令執(zhí)行前:(DS)=3000H,(BX)=1300H,(DI)=1200H,(32500H)=2350H;則指令執(zhí)行后:(IP)=2350H在匯編語言中,段內(nèi)間接尋址通常寫成:

JMP WORDPTR[BX+DI]表示所取得的目標地址是一個字。7目的地址寄存器段內(nèi)間接尋址方式8目的地址存儲器段內(nèi)間接尋址方式9③段間直接轉(zhuǎn)移在指令中直接給出要轉(zhuǎn)移到的目的段地址和偏移地址。

例:JMP 2000H:1000H執(zhí)行時,(IP)←1000H,(CS)←2000H注:直接地址為符號地址時,段間直接轉(zhuǎn)移指令中的符號地址前應(yīng)加操作符FARPTR。

例:JMP

FARPTR

far_label其中的far_label為遠類型的標號。10目的地址段間直接尋址方式11轉(zhuǎn)移的目的地址(段和偏移)在兩個相鄰的字存儲單元中。例如:

JMP DWORDPTR[SI]設(shè)指令執(zhí)行前:(DS)=4000H,(SI)=1212H,(41212H)=1000H,(41214H)=4A00H則指令執(zhí)行后:(IP)=1000H,(CS)=4A00H于是轉(zhuǎn)到4B000H處開始執(zhí)行指令。例中的DWORDPTR表示轉(zhuǎn)移地址是一個雙字。④段間間接轉(zhuǎn)移1240001212+)41212DSSI0010004A

4121241213412144121510004A00IPCS段間間接轉(zhuǎn)移操作示意圖1111111111101100JMPDWORDPTR[SI]的機器碼DS:[SI]13目的地址存儲器段間間接尋址方式14條件轉(zhuǎn)移指令可實現(xiàn)程序的條件分支。條件轉(zhuǎn)移指令根據(jù)標志位的狀態(tài)來決定是否進行分支轉(zhuǎn)移。格式:

JXXlabel

;xx為條件名稱縮寫指令的轉(zhuǎn)移范圍為-128~+127字節(jié)。主要的條件轉(zhuǎn)移指令參見p98表2-7。(2)條件轉(zhuǎn)移指令-JXX15①根據(jù)單個標志位設(shè)置的條件轉(zhuǎn)移指令JB/JC;低于,或CF=1,則轉(zhuǎn)移JNB/JNC/JAE;高于或等于,或CF=0,則轉(zhuǎn)移JP/JPE;奇偶標志PF=1(偶),則轉(zhuǎn)移JNP/JPO;奇偶標志PF=0(奇),則轉(zhuǎn)移JZ/JE;結(jié)果為零(ZF=1),則轉(zhuǎn)移JNZ/JNE;結(jié)果不為零(ZF=0),則轉(zhuǎn)移JS;SF=1,則轉(zhuǎn)移JNS;SF=0,則轉(zhuǎn)移JO

;OF=1,則轉(zhuǎn)移JNO

;OF=0,則轉(zhuǎn)移16這類指令主要用來判斷兩個數(shù)的大小。一般指令序列為:CMPdist,src

;比較

Jxxlabel;根據(jù)比較結(jié)果轉(zhuǎn)移判斷無符號數(shù)的大小JA高于則轉(zhuǎn)移(dist>src)轉(zhuǎn)移條件為:CF=0∧ZF=0JNA/JBE低于或等于則轉(zhuǎn)移(dist≤src)轉(zhuǎn)移條件為:CF=1∨ZF=1②根據(jù)組合條件設(shè)置的條件轉(zhuǎn)移指令17JG;大于則轉(zhuǎn)移(dist>src)

轉(zhuǎn)移條件為:(SF⊕OF=0)∧ZF=0JGE;大于或等于則轉(zhuǎn)移(dist≥src)

轉(zhuǎn)移條件為:(SF⊕OF=0)∨ZF=1JL;小于則轉(zhuǎn)移(dist<src)

轉(zhuǎn)移條件為:(SF⊕OF=1)∧ZF=0JLE;小于或等于則轉(zhuǎn)移(dist≤src)

轉(zhuǎn)移條件為:(SF⊕OF=1)∨ZF=1判斷有符號數(shù)的大小18③根據(jù)CX內(nèi)容來決定是否轉(zhuǎn)移的轉(zhuǎn)移指令

JCXZlabel

若(CX)=0,則轉(zhuǎn)移到label處開始執(zhí)行。19條件轉(zhuǎn)移指令舉例:以十六進制數(shù)形式顯示BX中的內(nèi)容。

MOV BX,1234H MOV CH,4 ;CH做循環(huán)計數(shù)器ROT: MOV CL,4 ;CL做移位計數(shù)器 ROL BX,CL ;將最高4位移到低4位

MOV AL,BL AND AL,0FH ;取出低4位 ADD AL,30H ;轉(zhuǎn)換為ASCII碼

CMP AL,39H ;與’9’比較

JBE DISP ;若(AL)≤‘9’,則轉(zhuǎn)顯示

ADD AL,7 ;若(AL)>’9’,再加7轉(zhuǎn)為‘A’-‘F’DISP: MOV DL,AL ;(DL)←字符

MOV AH,2 INT 21H ;顯示輸出

DEC CH ;4個十六進制數(shù)顯示完否?

JNZ ROT ;沒有,循環(huán)

MOV DL,48H ;‘H’ MOV AH,2 INT 21H ;最后顯示’H’202.循環(huán)控制指令用在循環(huán)程序中以確定是否要繼續(xù)循環(huán)。循環(huán)次數(shù)通常置于CX中。轉(zhuǎn)移的目標應(yīng)在距離本指令-128~+127的范圍之內(nèi)。循環(huán)控制指令不影響標志位。21(1)LOOP格式:LOOPlabel操作:(CX)-1→CX;若(CX)≠0,則轉(zhuǎn)至label處執(zhí)行;否則退出循環(huán),執(zhí)行LOOP后面的指令。

注:LOOP指令與下面的指令段等價:

DECCX JNZlabel22(2)LOOPZ(LOOPE)格式:LOOPZ

label操作:(CX)-1→CX;若(CX)≠0∧ZF=1,則轉(zhuǎn)至label處執(zhí)行;否則退出循環(huán),執(zhí)行LOOP后面的指令。(3)LOOPNZ(LOOPNE)格式:LOOPNZlabel操作:(CX)-1→CX;若(CX)≠0∧ZF=0,則轉(zhuǎn)至label處執(zhí)行;否則退出循環(huán),執(zhí)行LOOP后面的指令。23例1:給1A000H開始的256個內(nèi)存單元均減去1,若發(fā)現(xiàn)某個單元減為0則立即退出循環(huán),其后的單元不再減1。程序段如下:(邏輯地址為1A00:0H)

MOVAX,1A00HMOVDS,AX;1A00H段MOVDI,-1MOVCX,256GOON:INCDIDECBYTEPTR[DI]LOOPNZ

GOONHLT24例2:在8000H開始的長度為1000字節(jié)的字符串中查找’S’,若找到,把其偏移地址記錄在ADDR中,否則ADDR單元置為0FFFFH。

MOVDI,8000HMOVCX,1000MOVAL,’S’MOVADDR,0FFFFHGOON:SCASBLOOPNZ

GOONJNZDONEDECDIMOVADDR,DIDONE:HLT253.過程調(diào)用和返回指令過程(子程序)一段具有特定功能的,供其它程序調(diào)用的公用程序。特點調(diào)用子程序時,IP(CS)的內(nèi)容被壓入堆棧棧頂。從子程序返回時,棧頂?shù)膬?nèi)容又被彈出到IP(CS)。子程序執(zhí)行結(jié)束后一般均要返回調(diào)用程序。一次定義,多次調(diào)用;可帶參數(shù)調(diào)用,以完成不同的功能。優(yōu)點程序代碼短,結(jié)構(gòu)清晰,便于編程、調(diào)試、修改和閱讀。兩條相關(guān)指令:子程序調(diào)用指令CALL子程序返回指令RET26一般格式:CALLsub

;sub為子程序的入口根據(jù)子程序入口的尋址方式,子程序調(diào)用有四類。①段內(nèi)直接調(diào)用子程序的偏移地址直接由CALL指令給出。格式:CALLnear_proc

CALL執(zhí)行時,它首先將IP內(nèi)容壓棧,然后把指令中給出的位移量加到IP上。

注:匯編以后的調(diào)用地址是相對于CALL的下一條指令的位移量。例:CALL0120H;子程序偏移地址由指令給出(1)調(diào)用指令CALL27位移量由匯編程序在匯編時進行計算,如下例:CS:0102 CALL0120H ;3字節(jié)

CS:0105……則位移量為:0120-0105H=001BH于是CALL 0120H的機器碼為E81B00CS:0102 E8CS:0103 1BCALL0120HCS:0104 00CS:0105……28子程序的偏移地址在寄存器或存儲器中。格式:CALLmem16/reg16CALL執(zhí)行時,它首先將IP內(nèi)容壓棧,然后把指定的寄存器/存儲器的內(nèi)容送入IP。例:CALL BX;子程序地址由BX給出CALL WORDPTR[SI];子程序地址在存儲器中②段內(nèi)間接調(diào)用29CALL

IPHIPL代碼段數(shù)據(jù)段CALLWORDPTR[SI]指令的操作圖示:假定:(DS)

=

8000H,(SI)

=

1200H81200H81201H30子程序的段地址和偏移地址直接由CALL指令給出。

格式:CALLfar_proc;far_proc為遠過程的地址指令的操作為:

CS內(nèi)容壓棧

IP內(nèi)容壓棧

CS←段地址

IP←偏移地址例:CALL2000H:1000HCALLTIMER;TIMER為遠過程③段間直接調(diào)用31子程序的段和偏移地址為存儲器的連續(xù)4個單元中的內(nèi)容。

格式:CALLmem32指令的操作為:

SP←(SP)-2

((SP)+1,(SP))←(CS);CS壓棧CS←(mem32+2)

SP←(SP)-2

((SP)+1,(SP))←(IP);IP壓棧IP←(mem32)例:CALLDWORD

PTR[DI]

調(diào)用地址在[DI],[DI]+1,[DI]+2,[DI]+3四個存儲單元中。低字內(nèi)容為偏移地址,高字內(nèi)容為段地址。④段間間接調(diào)用32CALL代碼段數(shù)據(jù)段

IPHIPL

CSHCSL[DI][DI]+1[DI]+2[DI]+3段間間接調(diào)用示意圖CALLDWORD

PTR[DI]

33例:下面的程序執(zhí)行后,(AX)=?(DX)=?

CS:2000HMOVAX,2012H2003HMOVCX,200CH2006HPUSHCX2007HCALL4000H200AHADDAX,BX200CHADDAX,DX200EHHLT…………CS:4000HMOVBX,200AHPOPDXRET(AX)=6028H(DX)=200CH34段內(nèi)返回指令RET的操作為:恢復(fù)子程序執(zhí)行前IP的內(nèi)容。段間返回指令RET的操作為:恢復(fù)子程序執(zhí)行前IP和CS的內(nèi)容。

另有一種帶立即數(shù)的返回指令“RETn”,其中n為偶數(shù),表示從棧頂彈出地址后另外丟棄的字節(jié)數(shù)。例:RET4;返回后再丟棄棧頂?shù)?個字節(jié)(2)返回指令RET354.中斷指令8086/8088CPU在程序中允許安排一條中斷指令來引起一個中斷過程,這種中斷叫內(nèi)部中斷,或叫軟中斷。被中斷的指令地址處稱為“斷點”。中斷指令共有三條:(1)INTn執(zhí)行類型n的中斷服務(wù)程序,N=0~255(2)INTO執(zhí)行溢出中斷的中斷服務(wù)程序(3)IRET從中斷服務(wù)程序返回調(diào)用程序36(1)INTn格式:

INTn說明:

n×4

=向量地址。該向量地址中的內(nèi)容即為中斷服務(wù)程序入口地址(段:偏移),入口地址也稱為“中斷向量”。0000:n×4XXHXXHYYHYYH中斷服務(wù)程序入口的偏移地址(IP)中斷服務(wù)程序入口的段地址(CS)中斷類型碼n=0?255內(nèi)存中斷向量37INT指令的操作:將FLAGS壓入堆棧;將INT指令下一條指令的地址壓棧(即把CS和IP的內(nèi)容壓棧);取中斷服務(wù)程序入口地址送入CS和IP。INT指令只影響IF和TF,對其余標志位無影響INT指令可用于調(diào)用系統(tǒng)服務(wù)程序,如INT21H38INT指令的操作例:INT21HIPLIPHCSLCSHSP=1200FLAGSLFLAGSHSP=11FA執(zhí)行INT21H指令后保護斷點堆棧執(zhí)行INT21H指令前39INT指令的操作例(續(xù)):執(zhí)行INT21H指令后,CS=?

IP=?因為n=21H,所以n×4=84H。下圖中,(0:0084H)=2000H:1123H所以:CS=2000H

IP=1123H0000:0084H23H11H00H20H0000:21H×4IP

CS40INTO檢查溢出標志OF,如果OF=1,則啟動一個類型4的中斷過程;如果OF=0,不做任何操作。通常INTO指令安排

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論