第六節(jié)控制轉(zhuǎn)移_第1頁
第六節(jié)控制轉(zhuǎn)移_第2頁
第六節(jié)控制轉(zhuǎn)移_第3頁
第六節(jié)控制轉(zhuǎn)移_第4頁
第六節(jié)控制轉(zhuǎn)移_第5頁
已閱讀5頁,還剩42頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

五控制控制轉(zhuǎn)移指令控制轉(zhuǎn)移指令分為:轉(zhuǎn)移指令子程序調(diào)用和返回指令循環(huán)控制指令中斷指令處理器控制指令1

◢程序是指令的集合◢指令代碼在內(nèi)存中順序存放在8086系列中,指令的地址由CS和IP兩個(gè)寄存器決定。CS和IP兩寄存器的內(nèi)容決定了程序的流程,1順序執(zhí)行

CPU取來一條指令后,自動將IP的值加上該指令的字節(jié)數(shù),使IP順序指向下一條指令,CPU取來緊接著的指令執(zhí)行。

(此時(shí)IP的變化由CPU內(nèi)部的硬件自動完成)先介召順序執(zhí)行和非順序執(zhí)行的概念2

通過控制轉(zhuǎn)移指令改變CS和IP的值,使程序產(chǎn)生分支、調(diào)用結(jié)構(gòu)。

例:比較(AX)、(BX)的大小,將大數(shù)存于(max)單元。

CMPAX,BX

JGEgreat XCHGAX,BX

great: MOV[max],AX

2非順序執(zhí)行3轉(zhuǎn)移指令的實(shí)質(zhì):改變IP(或CS)的內(nèi)容。所有轉(zhuǎn)移指令不會影響標(biāo)志位。分為無條件轉(zhuǎn)移和條件轉(zhuǎn)移兩種。1.轉(zhuǎn)移指令關(guān)于轉(zhuǎn)移指令和調(diào)用指令的尋址,結(jié)合轉(zhuǎn)移指令來介紹4(1)無條件轉(zhuǎn)移指令-JMP本指令無條件轉(zhuǎn)移到指定的目標(biāo)地址,以執(zhí)行從該地址開始的程序段。根據(jù)設(shè)置CS、IP的方法,JMP指令分成4種情況。

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

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

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

REG/MEM中的16位偏移地址送IP。CS保持不變。③段間直接轉(zhuǎn)移指令中給出的16位的段和16位的偏移地址送到CS和IP。

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

MEM中給出的16位的段和16位的偏移地址送到CS和IP。5轉(zhuǎn)移的目標(biāo)地址由指令直接給出。段內(nèi)轉(zhuǎn)移,故轉(zhuǎn)移后CS內(nèi)容保持不變,只改變IP的值。匯編語言中格式位移量轉(zhuǎn)移范圍JMPSHORTOPRD8位-128~+127JMPNEARPTROPRD16位-32768~+32767OPR-在匯編語言中使用符號地址。在機(jī)器語言中是一個(gè)相對于當(dāng)前IP的位移量:例:JMP SHORTLPI ;轉(zhuǎn)向LPIJMP NEARPTRBBB ;轉(zhuǎn)向BBB①段內(nèi)直接轉(zhuǎn)移6

JMPSHORTNEXT

指令本身占有兩個(gè)字節(jié)

操作碼占一個(gè)字節(jié);8位位移量占有一個(gè)字節(jié)=1050H-1000H源程序:條件轉(zhuǎn)移指令:JMPSHORTnext.........

next:MOVAL,03HOP50H......OP03H......3000:1000H3000:1050H(IP)當(dāng)前D8=50H(IP)=(IP)當(dāng)前+D8內(nèi)存例:代碼段內(nèi)有一條無條件轉(zhuǎn)移指令在匯編語言中使用符號地址執(zhí)行操作:(IP)←(IP)當(dāng)前+D8

7

JMPSHORTOPR

8位位移量D8的范圍在(-128~127)之間,否則出錯(cuò)JMPNEARPTROPR指令本身占有三個(gè)字節(jié),位移量為D16,占有兩個(gè)字節(jié),范圍:-32768~+32767H??梢赞D(zhuǎn)移到段內(nèi)的任一位置。8②段內(nèi)間接轉(zhuǎn)移轉(zhuǎn)移的目標(biāo)地址由寄存器或存儲單元的內(nèi)容給出。例1:JMPSI若指令執(zhí)行前(SI)=1200H,則指令執(zhí)行后,(IP)=1200H,于是轉(zhuǎn)向代碼段的偏移地址1200H處執(zhí)行。9例2:JMP[BX+DI]設(shè)指令執(zhí)行前:(DS)=3000H,(BX)=1300H,(DI)=1200H,(32500H)=2350H;則指令執(zhí)行后:(IP)=2350H在匯編語言中,段內(nèi)間接尋址通常寫成:

JMP WORDPTR[BX+DI]表示所取得的目標(biāo)地址是一個(gè)字。(只改變IP)10③段間直接轉(zhuǎn)移在指令中直接給出要轉(zhuǎn)移到的目的段地址和偏移地址。

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

例:JMP FARPTRfar_label其中的far_label為遠(yuǎn)類型的標(biāo)號。11例:

C1SEGMENT …JMPFARPTRnext_prog

C1ENDS

C2SEGMINT …next_prog:… …C2 ENDSFAR遠(yuǎn)屬性標(biāo)號,標(biāo)號與控制轉(zhuǎn)移指令不在同一代碼段中。

12轉(zhuǎn)移的目的地址(段和偏移)在兩個(gè)相鄰的字存儲單元中。例如:

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)移地址是一個(gè)雙字。④段間間接轉(zhuǎn)移1340001212+)41212DSSI0010004A

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

JXXlabel ;xx為條件名稱縮寫指令的轉(zhuǎn)移范圍為-128~+127字節(jié)。(2)條件轉(zhuǎn)移指令-JXX15①以單個(gè)狀態(tài)標(biāo)志作為轉(zhuǎn)移條件助記符 轉(zhuǎn)移條件助記符轉(zhuǎn)移條件助記符轉(zhuǎn)移條件JZ/JEZF=1JNZ/JNEZF=0JSSF=1JNSSF=0JOOF=1JNOOF=0JP/JPEPF=1JNP/JPOPF=0JCCF=1JNCCF=0②以CX的值為0作為轉(zhuǎn)移條件助記符轉(zhuǎn)移條件JCXZ CX=0按轉(zhuǎn)移條件不同,條件轉(zhuǎn)移指令可以分為四大類:

16助記符 轉(zhuǎn)移條件JA/JNBECF∨ZF=0 高于/不低于等于JAE/JNB/JNCCF=0高于或等于/不低于/無進(jìn)位JB/JNAE/JCCF=1

低于/不高于等于/有進(jìn)位JBE/JNACF∨ZF=1 低于或等于/不高于③以兩個(gè)無符號數(shù)比較的結(jié)果作為轉(zhuǎn)移條件④以兩個(gè)帶符號數(shù)比較的結(jié)果作為轉(zhuǎn)移條件助記符 轉(zhuǎn)移條件 JG/JNLE(SF⊕OF)∨ZF=0 大于/不小于等于JGE/JNL

SF⊕OF=0 大于或等于/不小于JL/JNGE

SF⊕OF=1

小于/不大于等于JLE/JNG(SF⊕OF)∨ZF=1 小于或等于/不大于171所有條件轉(zhuǎn)移指令只能用段內(nèi)直接尋址方式,都是相對轉(zhuǎn)移,范圍(-128~+127)。 當(dāng)需往一個(gè)較遠(yuǎn)地方進(jìn)行條件轉(zhuǎn)移時(shí), 先選用條件轉(zhuǎn)移轉(zhuǎn)到附近一個(gè)單元, 然后,再用無條件轉(zhuǎn)移轉(zhuǎn)到較遠(yuǎn)的目的地。2條件轉(zhuǎn)移指令中,相當(dāng)一部分指令是在比較完二個(gè)數(shù)大小后,根據(jù)結(jié)果而決定是否轉(zhuǎn)移,3條件轉(zhuǎn)移指令不影響標(biāo)志位注意幾點(diǎn):18條件轉(zhuǎn)移指令應(yīng)用舉例:例1:以十六進(jìn)制數(shù)形式顯示BX中的內(nèi)容。

MOV BX,1234H MOV CH,4 ;CH做循環(huán)計(jì)數(shù)器ROT: MOV CL,4 ;CL做移位計(jì)數(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個(gè)十六進(jìn)制數(shù)顯示完否?

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

MOV DL,48H ;‘H’ MOV AH,2 INT 21H ;最后顯示’H’19

ASCII碼美國標(biāo)準(zhǔn)信息交換代碼20例2:在8000H開始的長度為1000字節(jié)的字符串中查找’S’,若找到,把其偏移地址記錄在ADDR中,否則ADDR單元置為0FFFFH。MOVDI,8000HMOVCX,1000MOVAL,’S’MOVADDR,0FFFFHGOON:SCASBLOOPNZ

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

RET

過程名ENDP 過程有兩種類型:按過程與調(diào)用語句間的位置

NEAR:調(diào)用指令CALL與過程在同一個(gè)代碼段中

FAR:調(diào)用指令CALL與過程不在同一個(gè)代碼段中CALL指令和RET指令都不影響條件碼。23例:NEAR類型過程

code1SEGMENT;code段 …

CALLsubp

;調(diào)用指令

YYY:MOVBX,AX …

subp

PROCNEAR;過程定義 …

RET;返回

subpENDP

code1ENDS24一般格式:CALLsub

;sub為子程序的入口子程序調(diào)用有兩類。段內(nèi)調(diào)用段間調(diào)用①段內(nèi)直接調(diào)用子程序的偏移地址直接由CALL指令給出。格式:CALLNEARPTRDST

CALL執(zhí)行時(shí):首先將當(dāng)前IP內(nèi)容(返回地址)壓棧, 然后把機(jī)器指令中給出的位移量加到 IP上,轉(zhuǎn)到子程序的入口處去執(zhí)行。

注:返回地址-

CALL指令的下一條指令的首地址。

(1)調(diào)用指令CALL25例:段內(nèi)直接調(diào)用code1SEGMENT;code段 …

CALLsubp

;調(diào)用指令

YYY:MOVBX,AX …

subp

PROCNEAR;過程定義 …

RET;返回

subpENDP

code1ENDS問題:本例中的返回地址?26子程序的偏移地址在寄存器或存儲器中。格式:CALLmem16/reg16CALL執(zhí)行時(shí),它首先將IP內(nèi)容壓棧,然后把指定的寄存器/存儲器的內(nèi)容送入IP。例:CALL AX;調(diào)用地址由AX給出 CALL WORDPTR[SI];調(diào)用地址由存儲器給出②段內(nèi)間接調(diào)用27CALL

IPHIPL代碼段數(shù)據(jù)段對于CALLWORDPTR[SI]這條指令若:(DS)

=

8000H,(SI)

=

1200H則指令操作圖示如下。81200H81201H28子程序的段地址和偏移地址直接由CALL指令給出。

格式:CALLFARPTRDST;執(zhí)行操作:SP←(SP)-2

((SP)-1,(SP)-2)←(CS);返回地址的段地址入棧

SP←(SP)-2

((SP)-1,(SP)-2)←(IP);返回地址的偏移地址入棧

(IP)←DST偏移地址(CS)←DST段地址③段間直接調(diào)用29CSEG1 SEGMENT … CALLFARPTRPPP;AAA處的CS:IP入棧,轉(zhuǎn)PPPAAA: …CSEG1ENDSCSEG2SEGMENT …PPPPROCFAR … …RETPPPENDP …CSEG2ENDS段間直接調(diào)用舉例30子程序的段和偏移地址為存儲器的連續(xù)4個(gè)單元中的內(nèi)容。

格式:CALLmem32指令的操作為:

SP←(SP)-2

((SP)+1,(SP))←(CS);返回地址的段地址入棧 SP←(SP)-2

((SP)+1,(SP))←(IP);返回地址的偏移地址入棧

CS←(mem32+2) IP←(mem32)例:CALLDWORD

PTR[DI]

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

IPHIPL

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

PTR[DI]

32段內(nèi)返回指令RET的操作為:

IP←((SP)+1,(SP));棧頂內(nèi)容彈出到IPSP←(SP)+2段間返回指令RET的操作為:

IP←((SP)+1,(SP));棧頂內(nèi)容彈出到IPSP←(SP)+2CS←((SP)+1,(SP));棧頂內(nèi)容彈出到CSSP←(SP)+2帶立即數(shù)返回指令:RETN;N為偶數(shù)執(zhí)行操作:從棧頂彈出返回地址后,再使SP的值加N。 例:RET4(2)返回指令RET(子程序中的最后一條指令)33例如:RETN堆棧使用情況:

CODE SEGMENTASSUMECS:CODE,DS:DATAMAINPROCFAR START:MOVAX,DATA MOVDS,AX …… PUSHBX PUSHCX

CALLDELCHARQQQ:MOVAH,4CH INT21HMAINENDPDELCHARPROCNEAR ……

RET4DELCHARENDP

CODEENDS ENDSTART(BX)(SP)(CX)QQQ的偏移地址PUSHBXPUSHCXCALLDELCHARRET4RET4堆棧使用情況:

343.循環(huán)控制指令用在循環(huán)程序中以確定是否要繼續(xù)循環(huán)。循環(huán)次數(shù)通常置于CX中。轉(zhuǎn)移的目標(biāo)應(yīng)在距離本指令-128~+127的范圍之內(nèi)。循環(huán)控制指令不影響標(biāo)志位。35(1)LOOP格式:LOOPlabel操作:(CX)-1→CX;若(CX)≠0,則轉(zhuǎn)至label處執(zhí)行;否則退出循環(huán),執(zhí)行LOOP后面的指令。LOOP指令與下面的指令段等價(jià):

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

label操作:(CX)-1→CX;

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

MOVAX,1A00HMOVDS,AXMOVDI,0MOVCX,256GOON:DECBYTEPTR[DI]INCDICMPBYTEPTR[DI-1],0LOOPNZ

GOONHLT38例2:在40個(gè)元素構(gòu)成的數(shù)組中,尋找第一個(gè)非零元素

MOVCX,40; MOVSI,0FFH;NEXT:INCSI; CMPBYTEPTR[SI],0; LOOPZNEXT;(CX)≠0∧ZF=1當(dāng)前元素為0且未找完時(shí),繼續(xù)尋找 JNZOKK;退出循環(huán)有兩種情況:ZF=0,找到非零元素

或CX=0:整個(gè)數(shù)組已找完,未找到非零元素,此時(shí)ZF=1

CALLDISPLAY;未找到非零元素的處理 RETOKK:.….. ;找到非0元素的處理 …… RET394.中斷指令8086/8088CPU在程序中允許安排一條中斷指令來引起一個(gè)中斷過程,這種中斷叫軟中斷。有關(guān)中斷的詳細(xì)情況將在第六章討論。中斷指令共有三條:(1)INTn執(zhí)行類型n的中斷服務(wù)程序,N=0~255(2)INTO執(zhí)行溢出中斷的中斷服務(wù)程序(3)IRET從中斷服務(wù)程序返回調(diào)用程序40(1)INTn;n=0~255,為中斷類型號本指令的操作步驟為:①((SP)-1,(SP)-2)←(FLAGS),SP←(SP)-2

保護(hù)標(biāo)志寄存器的內(nèi)容②IF←0,TF←0

中斷服務(wù)程序中禁止外部INTR中斷和單步中斷③((SP)-1,(SP)-2)←(CS),SP←(SP)-2,CS←(n*4+2)

中斷服務(wù)程序的段地址送入CS。n*4為向量地址。該向量地址中的內(nèi)容即為中斷服務(wù)程序入口地址。④((SP)-1,(SP)-2)←(IP),SP←(SP)-2,IP←(n*4)

中斷服務(wù)程序的偏移地址送IP。INT指令只影響IF和TF,對其余標(biāo)志位無影響。INT指令可用于調(diào)用系統(tǒng)服務(wù)程序,如INT21H41(2)溢出中斷INTO

INTO檢查溢出標(biāo)志OF,如果OF=1,則啟動一個(gè)類型4的中斷過程;如果OF=0,不做任何操作。通常INTO指令安排在有符號數(shù)算術(shù)運(yùn)算指令后面。如

IMUL DX INTO ;若溢出,則啟動INT4,否則繼續(xù) MOV RESULT,AX MOV RESULT+2,DX……42用于從中斷服務(wù)程序返回被中斷的程序。任何中斷服務(wù)程序不管是外部中斷引起的,還是內(nèi)部中斷引起的,最后都要用IRET返回。

該指令執(zhí)行的操作為:IP←((SP)+1,(SP));棧頂內(nèi)容彈出到IPSP←(SP)+2CS←((SP)+1,(SP));棧頂內(nèi)容彈出到CSSP←(SP)+2FLAGS←((SP)+1,(SP));

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論