編匯編語(yǔ)言課件第五章.ppt_第1頁(yè)
編匯編語(yǔ)言課件第五章.ppt_第2頁(yè)
編匯編語(yǔ)言課件第五章.ppt_第3頁(yè)
編匯編語(yǔ)言課件第五章.ppt_第4頁(yè)
編匯編語(yǔ)言課件第五章.ppt_第5頁(yè)
已閱讀5頁(yè),還剩90頁(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、第五章順序、分支、循環(huán)程序設(shè)計(jì),學(xué)習(xí)目的,掌握轉(zhuǎn)移指令與循環(huán)指令的使用方法,能夠在程序中使用各種程序結(jié)構(gòu)。 掌握匯編語(yǔ)言程序設(shè)計(jì)的完整步驟,能夠上機(jī)調(diào)試程序。,5.1 順序結(jié)構(gòu)程序設(shè)計(jì),順序結(jié)構(gòu):指令按照內(nèi)存中的地址順序依次被執(zhí)行,沒(méi)有任何流程改變。 例1 計(jì)算 Z =(3X+Y-5)/ 2 (其中的變量為無(wú)符號(hào)數(shù)),(1)數(shù)據(jù)分析,表達(dá)式中有三個(gè)變量X、Y、Z,可以使用三個(gè)內(nèi)存單元來(lái)表示。 未指明變量的變化范圍,使用字節(jié)、字為單位均可,這里以字為單位。,(2)算法分析,3X : 2X+X一條移位指令和一條加法指令 3X+Y-5 : 一條加法指令和一條減法指令 (3X+Y-5)/ 2 :可使用

2、右移指令 程序應(yīng)為順序結(jié)構(gòu),按照表達(dá)式規(guī)定的順序使用加法、減法、移位指令可實(shí)現(xiàn)全部運(yùn)算。,(3)繪制流程圖并寫(xiě)出程序主體,開(kāi)始,計(jì)算2X+X,計(jì)算3X+Y-5,計(jì)算(3X+Y-5)/2,結(jié)束,MOV AX,VARX SHL AX,1 ADD AX,VARX,ADD AX,VARY SUB AX,5,SAR AX,1 MOV VARZ,AX,編制完整程序的余下步驟,(4)選擇一種程序框架,把程序主體添加到框架中。 (5)匯編過(guò)程:使用MASM.EXE對(duì)源程序文件(ASM)進(jìn)行匯編,檢查并修改語(yǔ)法錯(cuò)誤,生成目標(biāo)代碼文件(OBJ)。 (6)連接過(guò)程:使用LINK.EXE連接工具把OBJ文件組織為可執(zhí)

3、行文件(EXE文件)。 (7)使用DEBUG調(diào)試可執(zhí)行程序,觀察并修改程序中的邏輯錯(cuò)誤。,5.2 分支程序設(shè)計(jì),若程序需對(duì)計(jì)算結(jié)果或測(cè)試條件進(jìn)行判斷,根據(jù)判斷結(jié)果來(lái)決定程序流程,則采用分支結(jié)構(gòu)。 匯編語(yǔ)言中,實(shí)現(xiàn)分支結(jié)構(gòu)的指令是轉(zhuǎn)移類(lèi)指令,這類(lèi)指令通過(guò)修改CS和IP的內(nèi)容來(lái)改變程序執(zhí)行的流程。 循環(huán)結(jié)構(gòu)可看作分支結(jié)構(gòu)的一種特例。,5.2.1 轉(zhuǎn)移指令,轉(zhuǎn)移指令分為無(wú)條件和條件兩類(lèi)。 無(wú)條件轉(zhuǎn)移指令一定改變程序流程,改變下一條將要執(zhí)行的指令地址。 條件轉(zhuǎn)移指令會(huì)判斷特定的標(biāo)志位或寄存器,如果滿足條件,則改變程序流程,如果不滿足則不會(huì)改變程序流程。 兩種轉(zhuǎn)移指令的功能都不可忽視,在程序中都是經(jīng)常使

4、用的。,(1)無(wú)條件轉(zhuǎn)移指令,指令格式:JMP 目標(biāo)地址 功能:無(wú)條件的修改IP或者CS、IP中的內(nèi)容,改變下一條將要執(zhí)行的指令地址。即跳轉(zhuǎn)到目標(biāo)地址繼續(xù)執(zhí)行程序。 標(biāo)志位影響:無(wú),(1)無(wú)條件轉(zhuǎn)移指令,JMP L1 MOV AX,0 L1:MOV AX,0FFFFH 執(zhí)行JMP指令后,程序流程改變到L1標(biāo)號(hào)指明的地址。,(1)無(wú)條件轉(zhuǎn)移指令,JMP指令的轉(zhuǎn)移類(lèi)型分為兩種:段內(nèi)轉(zhuǎn)移和段間轉(zhuǎn)移。 (1)段內(nèi)轉(zhuǎn)移 JMP指令本身和目標(biāo)地址在同一代碼段內(nèi),只需修改IP的內(nèi)容,而不需要改變CS的內(nèi)容。,(1)無(wú)條件轉(zhuǎn)移指令,1)段內(nèi)直接轉(zhuǎn)移 格式:JMP 標(biāo)號(hào) 機(jī)器指令由兩部分構(gòu)成,OPCODE和DI

5、SP,OPCODE是操作碼,DISP是一個(gè)8位或16位的補(bǔ)碼。,1)段內(nèi)直接轉(zhuǎn)移指令,DISP表示的含義是標(biāo)號(hào)地址相對(duì)于JMP后一條指令的字節(jié)距離。 DISP = 標(biāo)號(hào)偏移量 JMP后一條指令偏移量 上面的計(jì)算是匯編程序在匯編過(guò)程中完成的。,1)段內(nèi)直接轉(zhuǎn)移指令,標(biāo)號(hào)地址 JMP后一條指令地址: DISP 0 標(biāo)號(hào)地址 JMP后一條指令地址: DISP 0 功能:IP = (IP)+ DISP,1)段內(nèi)直接轉(zhuǎn)移指令,(IP)+DISP 該加法是兩個(gè)補(bǔ)碼的加法。DISP可以是正數(shù)或負(fù)數(shù),但是(IP)總是理解為正數(shù)。 把第16位(超出字的范圍)理解為符號(hào)位,(IP)的第16位總是理解為0,DISP

6、的第16位由它自己的符號(hào)位決定。,1)段內(nèi)直接轉(zhuǎn)移指令,例:(IP)=1100101001101011 DISP = 11100110 (IP)+DISP: 0 11001010 01101011 +1 11111111 11100110 0 11001010 01010001 注意,相加的結(jié)果總是一個(gè)正數(shù),補(bǔ)碼加法完畢以后應(yīng)當(dāng)重新把(IP)看作無(wú)符號(hào)數(shù)。,短轉(zhuǎn)移與長(zhǎng)轉(zhuǎn)移,DISP字段是由匯編程序在匯編過(guò)程中計(jì)算并生成的。 按照DISP的長(zhǎng)度,段內(nèi)直接轉(zhuǎn)移指令又可分為短轉(zhuǎn)移和長(zhǎng)轉(zhuǎn)移兩種類(lèi)型。 若DISP在-128127范圍內(nèi),則只占用一個(gè)字節(jié)。這種情況稱(chēng)為短轉(zhuǎn)移。 若DISP超過(guò)了-12812

7、7范圍,則DISP占用一個(gè)字。這種情況稱(chēng)為長(zhǎng)轉(zhuǎn)移,其轉(zhuǎn)移范圍為-3276832767。,2)段內(nèi)間接轉(zhuǎn)移,JMP指令針對(duì)的目標(biāo)偏移量存放在16位通用寄存器或字內(nèi)存單元中。 指令格式:JMP 通用寄存器名稱(chēng) JMP 字內(nèi)存單元 功能:IP = (通用寄存器) IP = (EA),2)段內(nèi)間接轉(zhuǎn)移,例: JMP BX 功能:IP =(BX) JMP WORD PTR SI 功能:IP = (DS:SI),段內(nèi)直接與段內(nèi)間接的區(qū)別,注意段內(nèi)直接轉(zhuǎn)移和段內(nèi)間接轉(zhuǎn)移的區(qū)別。 段內(nèi)直接轉(zhuǎn)移:由機(jī)器指令的DISP字段給出目標(biāo)地址相對(duì)于JMP后一條指令的帶符號(hào)字節(jié)距離,功能為IP =(IP)+ DISP。 段

8、內(nèi)間接轉(zhuǎn)移:由16位通用寄存器或字內(nèi)存單元直接給出IP寄存器新的內(nèi)容。,(2)段間轉(zhuǎn)移,標(biāo)號(hào)地址和JMP指令不在同一代碼段內(nèi),這類(lèi)轉(zhuǎn)移必須同時(shí)修改CS和IP的內(nèi)容,才能完成正確的轉(zhuǎn)移操作。,1)段間直接轉(zhuǎn)移,指令格式:JMP FAR類(lèi)型的標(biāo)號(hào) JMP FAR PTR 標(biāo)號(hào) 第二種格式是強(qiáng)制指定標(biāo)號(hào)的臨時(shí)類(lèi)型屬性為FAR,無(wú)論該標(biāo)號(hào)定義為什么類(lèi)型,都作為FAR類(lèi)型來(lái)引用。,1)段間直接轉(zhuǎn)移,機(jī)器指令中除OPCODE字段外,還有兩個(gè)16位的字段,分別表示目標(biāo)地址的偏移量和段基值。 功能:IP = 目標(biāo)地址偏移量 CS = 目標(biāo)地址段基值 同時(shí)修改CS、IP中的內(nèi)容,實(shí)現(xiàn)段間轉(zhuǎn)移。,2)段間間接轉(zhuǎn)移

9、,該轉(zhuǎn)移方式所用的目標(biāo)地址只能是存放在雙字內(nèi)存單元中的內(nèi)容。 指令格式: JMP DWORD PTR 雙字單元起始偏移量 功能:IP =(EA) CS =(EA+2),2)段間間接轉(zhuǎn)移,例: ADR1 DD L1 JMP DWORD PTR ADR1 功能:實(shí)現(xiàn)段間轉(zhuǎn)移,目標(biāo)地址為L(zhǎng)1標(biāo)號(hào)所在位置,邏輯地址存放在ADR1雙字單元中。,2)段間間接轉(zhuǎn)移,例:JMP DWORD PTR BXDI 雙字單元有效地址:EA=(BX)+(DI) 采用基址變址尋址方式。 功能:IP =(EA) CS =(EA+2),(2)條件轉(zhuǎn)移指令,功能: 根據(jù)前一條指令所影響的某些標(biāo)志位或寄存器狀態(tài)作為判斷條件; 當(dāng)

10、條件滿足時(shí),把程序流程轉(zhuǎn)移到指定的目標(biāo)地址; 當(dāng)條件不滿足時(shí),不改變程序流程,CPU會(huì)順序執(zhí)行下一條指令。,(2)條件轉(zhuǎn)移指令,統(tǒng)一的匯編指令格式:JXX 目標(biāo)地址 標(biāo)志位影響:無(wú)(只使用標(biāo)志位作為判斷條件,不會(huì)去修改它),(2)條件轉(zhuǎn)移指令,機(jī)器指令格式:總是占用2個(gè)字節(jié),OPCODE與帶符號(hào)的相對(duì)位移量(DISP)。 由于DISP僅有8位,轉(zhuǎn)移范圍一定是 -128 127字節(jié),只能是短轉(zhuǎn)移,這一特征對(duì)于所有條件轉(zhuǎn)移指令是一致的。 如果需要條件轉(zhuǎn)移的轉(zhuǎn)移范圍得到擴(kuò)大,那么必須結(jié)合使用無(wú)條件轉(zhuǎn)移。,(2)條件轉(zhuǎn)移指令,在執(zhí)行條件轉(zhuǎn)移指令前,一般需要執(zhí)行一條算術(shù)運(yùn)算指令或邏輯運(yùn)算指令對(duì)特定標(biāo)志位

11、產(chǎn)生有意義的影響。 根據(jù)所判斷的條件,條件轉(zhuǎn)移指令可分為三類(lèi):?jiǎn)螚l件轉(zhuǎn)移、無(wú)符號(hào)數(shù)條件轉(zhuǎn)移,帶符號(hào)數(shù)條件轉(zhuǎn)移。,(1)單條件轉(zhuǎn)移指令,這一類(lèi)條件轉(zhuǎn)移指令只對(duì)某一個(gè)標(biāo)志位或寄存器的狀態(tài)進(jìn)行判斷,并決定是否進(jìn)行轉(zhuǎn)移。,1)單標(biāo)志位轉(zhuǎn)移,單標(biāo)志位轉(zhuǎn)移指令總共有5對(duì),能對(duì)5個(gè)標(biāo)志位:CF、ZF、SF、OF、PF各自的狀態(tài)進(jìn)行判斷。 例: JC L1 JNC L1,1)單標(biāo)志位轉(zhuǎn)移,例1 編寫(xiě)一段程序判斷兩個(gè)字節(jié)變量DB1和DB2的內(nèi)容是否相同,如果相同則把AL清0,否則置全1。 MOV AL,DB1 CMP AL,DB2 JZ L1 MOV AL,0FFH JMP L2 ;無(wú)條件轉(zhuǎn)移對(duì)于實(shí)現(xiàn)分支結(jié)構(gòu)也

12、是必不可少的 L1:MOV AL,00H L2:MOV AH,4CH INT 21H,1)單標(biāo)志位轉(zhuǎn)移,注意分析,上面的條件轉(zhuǎn)移有什么樣的缺陷。 如果JZ L1指令和L1標(biāo)號(hào)之間的字節(jié)距離超過(guò)127,那么在匯編過(guò)程中就會(huì)出現(xiàn)語(yǔ)法錯(cuò)誤。,1)單標(biāo)志位轉(zhuǎn)移,條件轉(zhuǎn)移指令不適合直接用于距離較遠(yuǎn)的轉(zhuǎn)移。 一般來(lái)說(shuō),應(yīng)該結(jié)合無(wú)條件轉(zhuǎn)移指令在分支結(jié)構(gòu)中實(shí)現(xiàn)長(zhǎng)距離轉(zhuǎn)移。 就上面的例子,可通過(guò)流程圖來(lái)得到合理的源程序。,根據(jù)流程圖寫(xiě)出相關(guān)程序主體,CMP AL,DB2 JZ L1 JMP L2,MOV AL,DB1,Y:L1,N:L2,L3,L1: MOV AL,0 JMP L3,L2: MOV AL,0FF

13、H,L3: MOV AH,4CH INT 21H,2)另一種單條件轉(zhuǎn)移,指令格式:JCXZ 目標(biāo)地址 功能:判斷(CX)是否為0,若是則跳轉(zhuǎn)到目標(biāo)地址,否則順序執(zhí)行下一條指令。 該指令主要用于和循環(huán)指令配合使用,以實(shí)現(xiàn)程序中循環(huán)結(jié)構(gòu)。 因?yàn)檠h(huán)指令使用CX寄存器作為計(jì)數(shù)器實(shí)現(xiàn)計(jì)數(shù)循環(huán)。,JCXZ,JCXZ是對(duì)(CX)進(jìn)行判斷,而不是ZF標(biāo)志位。例: MOV AX,34H MOV CX,34H CMP CX,AX JCXZ L1 L1: 程序中,JCXZ指令并不會(huì)跳轉(zhuǎn)到L1,因?yàn)椋–X)不等于0,ZF標(biāo)志不會(huì)影響它的判斷。,(2)無(wú)符號(hào)數(shù)條件轉(zhuǎn)移指令,一組用于判斷兩個(gè)無(wú)符號(hào)數(shù)大小關(guān)系,從而決定是

14、否執(zhí)行轉(zhuǎn)移的指令。 使用前提: 使用這組指令前,要保證上一條影響標(biāo)志位的指令是CMP指令; 并且程序員把兩個(gè)參與比較的操作數(shù)看作無(wú)符號(hào)數(shù)。,(2)無(wú)符號(hào)數(shù)條件轉(zhuǎn)移指令,這組指令在邏輯上把CMP指令的目的操作數(shù)稱(chēng)為A數(shù)據(jù),把源操作數(shù)稱(chēng)為B數(shù)據(jù)。 通過(guò)CF標(biāo)志和ZF標(biāo)志的狀態(tài)來(lái)判斷A、B兩個(gè)數(shù)據(jù)的大小關(guān)系,決定是否跳轉(zhuǎn)。,(2)無(wú)符號(hào)數(shù)條件轉(zhuǎn)移指令,JA:A B 成立則轉(zhuǎn)移 JNBE:A B 不成立則轉(zhuǎn)移 這兩個(gè)助記符含義相同,對(duì)應(yīng)同一條機(jī)器指令。 判斷規(guī)則:CF=0 AND ZF=0,轉(zhuǎn)移,否則不轉(zhuǎn)移。 CF=0:A-B最高位不產(chǎn)生借位,夠減,AB ZF=0:A-B結(jié)果不為0,AB 綜合分析所得

15、:AB,(2)無(wú)符號(hào)數(shù)條件轉(zhuǎn)移指令,JAE:AB成立則轉(zhuǎn)移 JNB:AB不成立則轉(zhuǎn)移 兩個(gè)助記符對(duì)應(yīng)同一條機(jī)器指令。 判斷規(guī)則:CF=0 OR ZF=1,轉(zhuǎn)移,否則不轉(zhuǎn)移。 CF=0:A-B最高位不產(chǎn)生借位,夠減,AB ZF=1:A-B結(jié)果為0,A=B 綜合分析所得: AB,(2)無(wú)符號(hào)數(shù)條件轉(zhuǎn)移指令,JB:AB成立則轉(zhuǎn)移 JNAE:AB不成立則轉(zhuǎn)移 兩個(gè)助記符對(duì)應(yīng)同一條機(jī)器指令。 判斷規(guī)則:CF=1 AND ZF=0,轉(zhuǎn)移,否則不轉(zhuǎn)移。 CF=1:A-B最高位產(chǎn)生借位,不夠減,AB ZF=0:A-B的結(jié)果不為0,AB 綜合分析所得:AB,(2)無(wú)符號(hào)數(shù)條件轉(zhuǎn)移指令,JBE:AB成立則轉(zhuǎn)移 J

16、NA:AB不成立則轉(zhuǎn)移 兩個(gè)助記符對(duì)應(yīng)同一條機(jī)器指令。 判斷規(guī)則:CF=1 OR ZF=1,轉(zhuǎn)移,否則不轉(zhuǎn)移。 CF=1:A-B最高位產(chǎn)生借位,不夠減,AB ZF=1:A-B的結(jié)果為0,A=B 綜合分析所得:AB,(2)無(wú)符號(hào)數(shù)條件轉(zhuǎn)移指令,例2 數(shù)據(jù)段中的ARY數(shù)組中存放了10個(gè)字節(jié)型的無(wú)符號(hào)數(shù),從數(shù)組中找出最大的數(shù)保存到MAX字節(jié)單元中。,例2 (1)數(shù)據(jù)分析,數(shù)組ARY需要10個(gè)字節(jié)的空間。 MAX字節(jié)單元用于存放最終結(jié)果。,例2 (2)算法分析,1)把數(shù)組中的第0個(gè)數(shù)據(jù)首先存放到一個(gè)寄存器中(這里選用AL)。 2)將寄存器中數(shù)據(jù)與數(shù)組中每一個(gè)數(shù)據(jù)按順序作比較,每遇到一個(gè)大于寄存器中數(shù)據(jù)

17、的數(shù)組元素,則用它替換寄存器中數(shù)據(jù),保持寄存器中數(shù)據(jù)總是當(dāng)前最大值。,例2 (2)算法分析,3)由于需要逐個(gè)訪問(wèn)數(shù)組中的元素,需要使用一個(gè)基址或變址寄存器作為一維數(shù)組的浮動(dòng)下標(biāo),這里選用SI; 4)需要一個(gè)計(jì)數(shù)器,對(duì)訪問(wèn)次數(shù)進(jìn)行記數(shù),保證對(duì)數(shù)組的訪問(wèn)不會(huì)越界,這里數(shù)組中有10個(gè)元素,使用CX來(lái)完成記數(shù)的功能。,(3)繪制流程圖并寫(xiě)出程序主體,開(kāi)始,初始化SI、 CX、AL,進(jìn)入循環(huán),修改SI 使它指向下一個(gè)數(shù)據(jù),MOV SI, OFFSET ARY MOV CX, 9 MOV AL, SI,LOP1: INC SI,(AL)(SI),AL=(SI),Y: L1,N: L2=L3,LOP1:,L

18、3,CMP AL, SI JB L1 JMP L3 ;L2=L3,L1: MOV AL, SI JMP L3(可省略),(3)繪制流程圖并寫(xiě)出程序主體,結(jié)束,CX=(CX)-1,L3: DEC CX,JNZ LOP1 ;條件轉(zhuǎn)移實(shí)現(xiàn)循環(huán),(CX)=0?,MAX=(AL),MOV MAX, AL,MOV AH, 4CH INT 21H,N: LOP1,L3,(3)帶符號(hào)數(shù)條件轉(zhuǎn)移指令,一組用于判斷兩個(gè)帶符號(hào)數(shù)大小關(guān)系,從而決定是否執(zhí)行程序流程轉(zhuǎn)移的指令。 使用前提: 使用這組指令之前,要保證上一條影響標(biāo)志位的指令是CMP指令, 并且程序員把兩個(gè)參與比較的操作數(shù)看作帶符號(hào)數(shù)。,(3)帶符號(hào)數(shù)條件轉(zhuǎn)

19、移指令,這組指令在邏輯上把CMP指令的目的操作數(shù)稱(chēng)為A數(shù)據(jù),把源操作數(shù)稱(chēng)為B數(shù)據(jù)。 通過(guò)OF標(biāo)志、SF標(biāo)志和ZF標(biāo)志的狀態(tài)來(lái)判斷A、B兩個(gè)數(shù)據(jù)的大小關(guān)系,決定是否跳轉(zhuǎn)。,(3)帶符號(hào)數(shù)條件轉(zhuǎn)移指令,JG:AB成立則轉(zhuǎn)移 JNLE:AB不成立則轉(zhuǎn)移 判斷規(guī)則:SF=OF AND ZF=0,轉(zhuǎn)移,否則不轉(zhuǎn)移。 SF=OF:(參見(jiàn)教案對(duì)CMP指令的分析)A-B的正確結(jié)果應(yīng)該是一個(gè)正數(shù)或者是0,AB ZF=0:A-B結(jié)果不為0,AB 綜合分析所得:AB,(3)帶符號(hào)數(shù)條件轉(zhuǎn)移指令,JGE:AB成立則轉(zhuǎn)移 JNL:AB不成立則轉(zhuǎn)移 判斷規(guī)則:SF=OF OR ZF=1,轉(zhuǎn)移,否則不轉(zhuǎn)移。 SF=OF:

20、AB ZF=1:A-B結(jié)果為0,A=B 綜合分析所得: AB 邏輯上ZF=1這個(gè)條件可以去掉。,(3)帶符號(hào)數(shù)條件轉(zhuǎn)移指令,JL:AB成立則轉(zhuǎn)移 JNGE:AB不成立則轉(zhuǎn)移 判斷規(guī)則:SFOF AND ZF=0,轉(zhuǎn)移,否則不轉(zhuǎn)移。 SFOF:A-B的正確結(jié)果應(yīng)該是負(fù)數(shù),AB ZF=0:A-B的結(jié)果不為0,AB 綜合分析所得:AB 邏輯上ZF=0這個(gè)條件可以去掉。,(3)帶符號(hào)數(shù)條件轉(zhuǎn)移指令,JLE:AB成立則轉(zhuǎn)移 JNG:AB不成立則轉(zhuǎn)移 判斷規(guī)則: SFOF OR ZF=1,則轉(zhuǎn)移,否則不轉(zhuǎn)移。 SFOF:AB ZF=1:A=B 綜合結(jié)果:AB,(3)帶符號(hào)數(shù)條件轉(zhuǎn)移指令,例3. 修改例2,

21、把數(shù)組中存放的無(wú)符號(hào)數(shù)改成帶符號(hào)數(shù),要求不但找出數(shù)組中最大值,而且找出最小值。 數(shù)據(jù)分析: ARY字節(jié)數(shù)組占用10個(gè)字節(jié) MIN字節(jié)單元用于存放最小值 MAX字節(jié)單元用于存放最大值,(3)帶符號(hào)數(shù)條件轉(zhuǎn)移指令,算法分析: 增加了求最小值的功能,可在求最大值的循環(huán)中一起完成,只是在循環(huán)中增加一個(gè)分支結(jié)構(gòu)。 在前面的例子中使用AL寄存器存放當(dāng)前比較的最大值,這里增加AH寄存器存放當(dāng)前比較的最小值。,(3)帶符號(hào)數(shù)條件轉(zhuǎn)移指令,開(kāi)始,初始化SI、 CX、AL、AH,進(jìn)入循環(huán),修改SI 使它指向下一個(gè)數(shù)據(jù),MOV SI, OFFSET ARY MOV CX, 9 MOV AL, SI MOV AH,S

22、I,LOP1: INC SI,(AL)(SI),AL=(SI),Y: L1,N: L2=L3,LOP1:,L3,CMP AL, SI JL L1 JMP L3 ;L2=L3,L1: MOV AL, SI JMP L3(可省略),(3)帶符號(hào)數(shù)條件轉(zhuǎn)移指令,L3: CMP AH, SI JG L4 JMP L6 ;L5=L6,L4: MOV AH, SI JMP L6 ;可省,(AH)(SI)?,L3,AH=(SI),Y: L4,N: L5=L6,L6,CX=(CX)-1,L6: DEC CX,JNZ LOP1,(CX)=0?,N: LOP1,(3)帶符號(hào)數(shù)條件轉(zhuǎn)移指令,分支結(jié)構(gòu),分支結(jié)構(gòu)是結(jié)合

23、使用條件轉(zhuǎn)移指令和無(wú)條件轉(zhuǎn)移指令來(lái)構(gòu)造的。分支結(jié)構(gòu)分為兩種: 1)IF-THEN-ELSE結(jié)構(gòu):雙分支結(jié)構(gòu),把程序流程分為兩支,這種結(jié)構(gòu)和條件轉(zhuǎn)移指令本來(lái)的特征是一致的。 2)CASE結(jié)構(gòu):多分支結(jié)構(gòu),可嵌套使用雙分支結(jié)構(gòu)來(lái)實(shí)現(xiàn),但執(zhí)行效率不高,也可通過(guò)建立多分支表的方法來(lái)建立效率較高的多分支結(jié)構(gòu)。,結(jié)構(gòu)化程序設(shè)計(jì),結(jié)構(gòu)化程序設(shè)計(jì),在非結(jié)構(gòu)化的分支結(jié)構(gòu)中,每一個(gè)分支可能有多個(gè)出口,如果需要分析或調(diào)試這一分支結(jié)構(gòu),那么必須在源程序中找到所有的出口位置。 非結(jié)構(gòu)化的分支會(huì)造成程序的可讀性下降,調(diào)試難度加大。 如果采用結(jié)構(gòu)化的分支,那么分支的所有出口都是一致的,程序的分析和調(diào)試都非常方便。,5.3

24、循環(huán)程序設(shè)計(jì),所有循環(huán)結(jié)構(gòu)均可使用條件轉(zhuǎn)移指令來(lái)實(shí)現(xiàn)。 高級(jí)語(yǔ)言中的WHILE循環(huán)、DO UNTILL循環(huán),都很適合使用條件轉(zhuǎn)移指令實(shí)現(xiàn)。,5.3 循環(huán)程序設(shè)計(jì),FOR循環(huán)(記數(shù)循環(huán))同樣可以使用DEC指令和條件轉(zhuǎn)移指令相結(jié)合來(lái)實(shí)現(xiàn)。 但是為了簡(jiǎn)化記數(shù)循環(huán)的設(shè)計(jì),8086/8088系統(tǒng)提供了專(zhuān)門(mén)的記數(shù)循環(huán)指令。,5.3.1 循環(huán)控制指令,循環(huán)指令和轉(zhuǎn)移指令的功能基本一致,都是完成程序流程的轉(zhuǎn)移,區(qū)別在于循環(huán)指令會(huì)隱含使用CX寄存器作為記數(shù)器,每執(zhí)行一次循環(huán)指令,(CX)就會(huì)自動(dòng)被減1。,5.3.1 循環(huán)控制指令,機(jī)器指令格式: OPCODE(8位) DISP(8位) DISP和條件轉(zhuǎn)移指令中的

25、位移量解釋相同,作為相對(duì)位移量,轉(zhuǎn)移范圍也是-128到127。,5.3.1 循環(huán)控制指令,執(zhí)行步驟: 1)CX=(CX)-1 2)若循環(huán)條件滿足,IP=(IP)+DISP 循環(huán)條件主要是指(CX)是否為0,如果(CX)=0則停止循環(huán),不改變程序的執(zhí)行流程,否則執(zhí)行流程轉(zhuǎn)移,繼續(xù)循環(huán)。,5.3.1 循環(huán)控制指令,有些循環(huán)指令在循環(huán)條件中還加上了對(duì)ZF標(biāo)志的判斷。 標(biāo)志位影響:所有轉(zhuǎn)移指令和循環(huán)指令都不會(huì)影響任何的標(biāo)志位; 雖然它們可能會(huì)對(duì)標(biāo)志位的當(dāng)前取值進(jìn)行判斷。,(1)LOOP指令,格式:LOOP 目標(biāo)地址 執(zhí)行步驟: 1)CX=(CX)-1 2)如果(CX)0,轉(zhuǎn)移到目標(biāo)地址,否則停止循環(huán),

26、順序執(zhí)行下一條指令 使用前提:在使用LOOP指令控制循環(huán)以前(進(jìn)入程序的循環(huán)體以前),必須把循環(huán)次數(shù)保存到CX。,(1)LOOP指令,例: 將 dec cx jnz lop 替換為 loop lop,(2)LOOPZ / LOOPE指令,格式:LOOPZ / LOOPE 目標(biāo)地址 執(zhí)行步驟: 1)CX=(CX)-1 2)如果(CX)0 AND ZF=1,則轉(zhuǎn)移到目標(biāo)地址,否則停止循環(huán),順序執(zhí)行下一條指令。,(2)LOOPZ / LOOPE指令,例:試編寫(xiě)一程序,在一字符串中查找第一個(gè)非空格字符,并將其在字符串中的序號(hào)(1n)送入index單元中。如果未找到非空格字符,則將全1送到index單元

27、中。,(2)LOOPZ / LOOPE指令,data segment strg db CHECK NO_SPACE leng db $-strg index db ? data ends stack1 segment para stack dw 20h dup(0) stack1 ends,(2)LOOPZ / LOOPE指令,code segment assume cs:code,ds:data,ss:stack1 start: mov ax, data mov ds, ax mov cx, leng mov bx, -1 next: inc bx cmp strgbx, loopz nex

28、t jnz found mov bl, 0feh,(2)LOOPZ / LOOPE指令,found: inc bl mov index, bl mov ah, 4ch int 21h code ends end start,(3)LOOPNE / LOOPNZ指令,格式:LOOPNE / LOOPNZ 目標(biāo)地址 執(zhí)行步驟: 1)CX=(CX)-1 2)如果(CX)0 AND ZF=0,則轉(zhuǎn)移到目標(biāo)地址,否則停止循環(huán),順序執(zhí)行下一條指令。,(3)LOOPNE / LOOPNZ指令,例:試編寫(xiě)程序,計(jì)算兩個(gè)字節(jié)數(shù)組ary1和ary2對(duì)應(yīng)元素之和,一直計(jì)算到兩數(shù)之和為0或數(shù)組結(jié)束為止。并將和存入非0

29、數(shù)組sum中,將該數(shù)組長(zhǎng)度存放在num單元中。,(3)LOOPNE / LOOPNZ指令,data segment ary1 db 12,10,3,5,-1,7,34,8,9,10 ary2 db 14,23,6,-2,1,9,45,21,8,24 leng equ ary2-ary1 sum db leng dup(?) num db ? data ends stack1 segment para stack dw 20h dup(0) stack1 ends,(3)LOOPNE / LOOPNZ指令,coseg segment assume cs:coseg,ds:data,ss:stac

30、k1 begin: mov ax, data mov ds, ax mov cx, leng mov bx, -1 nzero: inc bx mov al, ary1bx add al, ary2bx mov sumbx, al loopnz nzero jz zero,(3)LOOPNE / LOOPNZ指令,inc bl zero: mov num, bl mov ah, 4ch int 21h coseg ends end begin,(4)JCXZ在循環(huán)程序中的作用,進(jìn)入循環(huán)體之前,首先使用JCXZ指令判斷(CX)是否為0,如果為0就跳轉(zhuǎn)到循環(huán)體出口,以免執(zhí)行錯(cuò)誤的循環(huán)過(guò)程。 mov cx, count jcxz next Lop: loop lop next: ,5.3.2 單重循環(huán)程序設(shè)計(jì),(1)記數(shù)循環(huán) 對(duì)應(yīng)高級(jí)語(yǔ)言中的FOR循環(huán)。 (2)條件循環(huán) 對(duì)應(yīng)高級(jí)語(yǔ)言中的WHILE或DO UNTIL循環(huán)。,5.3.2 單重循環(huán)程序設(shè)計(jì),例 試編寫(xiě)一程序,統(tǒng)計(jì)字單元VARW中含“1”數(shù)據(jù)位的個(gè)數(shù),統(tǒng)計(jì)結(jié)果存放于CONT單元中。 算法思想:將VARW中各數(shù)據(jù)位逐位移動(dòng)到最高位進(jìn)行判斷

溫馨提示

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