版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1 12 24.1 4.1 測(cè)試和控制指令測(cè)試和控制指令 4.2 4.2 選擇結(jié)構(gòu)程序選擇結(jié)構(gòu)程序4.3 4.3 循環(huán)結(jié)構(gòu)程序循環(huán)結(jié)構(gòu)程序4.4 4.4 程序的調(diào)試程序的調(diào)試 習(xí)題四習(xí)題四3 3按照指令執(zhí)行的順序,程序的結(jié)構(gòu)可以劃分成以下三種。按照指令執(zhí)行的順序,程序的結(jié)構(gòu)可以劃分成以下三種。 順 序 結(jié) 構(gòu)順 序 結(jié) 構(gòu) : 程 序 按 照 它 編 寫(xiě) 的 順 序 執(zhí) 行 , 每 條 指 令 只 執(zhí) 行 一: 程 序 按 照 它 編 寫(xiě) 的 順 序 執(zhí) 行 , 每 條 指 令 只 執(zhí) 行 一 次,這樣的程序稱為次,這樣的程序稱為“順序結(jié)構(gòu)順序結(jié)構(gòu)”的程序。的程序。 循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu):一組指令
2、被反復(fù)地執(zhí)行,這樣的程序稱為:一組指令被反復(fù)地執(zhí)行,這樣的程序稱為“循環(huán)結(jié)循環(huán)結(jié) 構(gòu)構(gòu)”或者或者“重復(fù)結(jié)構(gòu)重復(fù)結(jié)構(gòu)”的程序。的程序。 選 擇 結(jié) 構(gòu)選 擇 結(jié) 構(gòu) : 根 據(jù) 某 個(gè) 條 件 , 一 部 分 指 令 被 執(zhí) 行 , 另 一 部 分 指: 根 據(jù) 某 個(gè) 條 件 , 一 部 分 指 令 被 執(zhí) 行 , 另 一 部 分 指 令 沒(méi) 有 被 執(zhí) 行 , 這 樣 的 程 序 稱 為令 沒(méi) 有 被 執(zhí) 行 , 這 樣 的 程 序 稱 為 “ 選 擇 結(jié) 構(gòu)選 擇 結(jié) 構(gòu) ” 或 者或 者 “ “分支結(jié)構(gòu)分支結(jié)構(gòu)”的程序。的程序。一個(gè)實(shí)際運(yùn)行的程序,常常是由以上三種結(jié)構(gòu)的程序組合而成的,上
3、面的三一個(gè)實(shí)際運(yùn)行的程序,常常是由以上三種結(jié)構(gòu)的程序組合而成的,上面的三種結(jié)構(gòu)稱為程序的種結(jié)構(gòu)稱為程序的“基本結(jié)構(gòu)基本結(jié)構(gòu)”。使用這三種基本結(jié)構(gòu),可以編寫(xiě)出任何所。使用這三種基本結(jié)構(gòu),可以編寫(xiě)出任何所需要的程序。需要的程序。 4 44.1.1 4.1.1 無(wú)條件轉(zhuǎn)移指令無(wú)條件轉(zhuǎn)移指令4.1.2 4.1.2 比較和測(cè)試指令比較和測(cè)試指令 4.1.3 4.1.3 條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令 5 5執(zhí)行執(zhí)行JMP指令后,程序轉(zhuǎn)移到新的指令后,程序轉(zhuǎn)移到新的“目的位置目的位置”執(zhí)行。執(zhí)行。4.1.1 4.1.1 無(wú)條件轉(zhuǎn)移指令無(wú)條件轉(zhuǎn)移指令無(wú)條件轉(zhuǎn)移指令的一般格式:無(wú)條件轉(zhuǎn)移指令的一般格式:JMP目的位
4、置目的位置6 6CODECODESEGMENTSEGMENTASSUMEASSUME CS: CODECS: CODESTART:START: MOVMOVDL, 20HDL, 20HONE:ONE:MOVMOVAH, 2AH, 2INTINT21H21H;輸出;輸出DLDL中的字符中的字符INCINCDLDL;修改;修改DLDL中的字符代碼中的字符代碼JMPJMPONEONE;轉(zhuǎn)移到;轉(zhuǎn)移到“ONE”O(jiān)NE”處繼續(xù)執(zhí)行處繼續(xù)執(zhí)行MOVMOVAX, 4C00HAX, 4C00HINTINT21H21HCODECODEENDSENDSENDENDSTARTSTART例例4-1 用用JMP指令實(shí)現(xiàn)
5、轉(zhuǎn)移指令實(shí)現(xiàn)轉(zhuǎn)移7 71.近程無(wú)條件轉(zhuǎn)移指令近程無(wú)條件轉(zhuǎn)移指令 如果轉(zhuǎn)移的目的位置與出發(fā)點(diǎn)在同一個(gè)段里,這樣的轉(zhuǎn)移稱如果轉(zhuǎn)移的目的位置與出發(fā)點(diǎn)在同一個(gè)段里,這樣的轉(zhuǎn)移稱為為“近程近程”轉(zhuǎn)移或者轉(zhuǎn)移或者“段內(nèi)段內(nèi)”轉(zhuǎn)移。實(shí)現(xiàn)轉(zhuǎn)移。實(shí)現(xiàn)“近程近程”轉(zhuǎn)移,實(shí)質(zhì)轉(zhuǎn)移,實(shí)質(zhì)上是把目標(biāo)位置的上是把目標(biāo)位置的“偏移地址偏移地址”置入置入IP寄存器。寄存器。 按照尋址方式的不同,近程無(wú)條件轉(zhuǎn)移指令有三種格式。按照尋址方式的不同,近程無(wú)條件轉(zhuǎn)移指令有三種格式。8 8(1)短轉(zhuǎn)移短轉(zhuǎn)移如果目的位置離開(kāi)出發(fā)點(diǎn)很近,可以使用以下格式:如果目的位置離開(kāi)出發(fā)點(diǎn)很近,可以使用以下格式:JMPSHORT LABEL其中其中“
6、LABEL”是目的位置的標(biāo)號(hào)。這種格式產(chǎn)生的機(jī)器指令代碼最短,為是目的位置的標(biāo)號(hào)。這種格式產(chǎn)生的機(jī)器指令代碼最短,為2字節(jié)。字節(jié)。100H: JMP SHORT TWO102H: 10CH: TWO: 指令指令“JMP SHORT TWO”匯編后產(chǎn)生的機(jī)器指令為匯編后產(chǎn)生的機(jī)器指令為“EB0A”。 “EB”是這種類型轉(zhuǎn)移指令的是這種類型轉(zhuǎn)移指令的“操作碼操作碼”,“0A”是目的位置離開(kāi)出發(fā)點(diǎn)的距離,是目的位置離開(kāi)出發(fā)點(diǎn)的距離,10CH102H=0AH。 由于用一個(gè)字節(jié)補(bǔ)碼表示目的地址與當(dāng)前地址的距離,所以轉(zhuǎn)移范圍為下由于用一個(gè)字節(jié)補(bǔ)碼表示目的地址與當(dāng)前地址的距離,所以轉(zhuǎn)移范圍為下一條指令地址一
7、條指令地址-128 +127字節(jié)以內(nèi)。字節(jié)以內(nèi)。9 9(2)近程直接轉(zhuǎn)移近程直接轉(zhuǎn)移JMP目的位置標(biāo)號(hào)目的位置標(biāo)號(hào)指令指令“JMP TWO”JMP TWO”匯編后得到的機(jī)器指令代碼為匯編后得到的機(jī)器指令代碼為“E9FDEE”E9FDEE”?!癊9”E9”為操作碼為操作碼“0EEFDH”0EEFDH”為位移量,為位移量,0EEFDH=0F000H0EEFDH=0F000H103H103H。指令指令“JMP ONE”JMP ONE”對(duì)應(yīng)的機(jī)器指令代碼為對(duì)應(yīng)的機(jī)器指令代碼為“E90011”E90011”“E9”“E9”為操作碼為操作碼位移量位移量“1100H”1100H”,0F003H+1100H=
8、0103H(0F003H+1100H=0103H(舍去進(jìn)位舍去進(jìn)位) )使用近程直接轉(zhuǎn)移指令可以實(shí)現(xiàn)同一個(gè)段內(nèi)使用近程直接轉(zhuǎn)移指令可以實(shí)現(xiàn)同一個(gè)段內(nèi)64KB64KB范圍的轉(zhuǎn)移。范圍的轉(zhuǎn)移。100H: JMPTWO103H:ONE: 0F000H:TWO:JMPONE0F003H:1010(3)近程間接轉(zhuǎn)移近程間接轉(zhuǎn)移 把轉(zhuǎn)移的目的地址事先存放在某個(gè)寄存器或存儲(chǔ)器單元中,把轉(zhuǎn)移的目的地址事先存放在某個(gè)寄存器或存儲(chǔ)器單元中,通過(guò)這個(gè)寄存器或存儲(chǔ)單元實(shí)現(xiàn)轉(zhuǎn)移。通過(guò)這個(gè)寄存器或存儲(chǔ)單元實(shí)現(xiàn)轉(zhuǎn)移。JMP CX ;寄存器間接轉(zhuǎn)移,可使用任何一個(gè)通用寄存器;寄存器間接轉(zhuǎn)移,可使用任何一個(gè)通用寄存器JMP W
9、ORD PTRBX;存儲(chǔ)器間接轉(zhuǎn)移,目的地址在存儲(chǔ)單元中;存儲(chǔ)器間接轉(zhuǎn)移,目的地址在存儲(chǔ)單元中11111)JMP ONE;近程直接轉(zhuǎn)移;近程直接轉(zhuǎn)移2)LEA DX, ONE JMP DX;寄存器間接段內(nèi)轉(zhuǎn)移;寄存器間接段內(nèi)轉(zhuǎn)移3)LEA BX, TARGET JMP WORD PTRBX ;存儲(chǔ)器間接段內(nèi)轉(zhuǎn)移;存儲(chǔ)器間接段內(nèi)轉(zhuǎn)移4)JMP TARGET;存儲(chǔ)器間接段內(nèi)轉(zhuǎn)移;存儲(chǔ)器間接段內(nèi)轉(zhuǎn)移已在數(shù)據(jù)段定義存儲(chǔ)器單元已在數(shù)據(jù)段定義存儲(chǔ)器單元“TARGET” :TAEGETDW ONE下面四組指令都可以實(shí)現(xiàn)向標(biāo)號(hào)下面四組指令都可以實(shí)現(xiàn)向標(biāo)號(hào)“ONE”的轉(zhuǎn)移:的轉(zhuǎn)移:1212 遠(yuǎn)程無(wú)條件轉(zhuǎn)移指令可
10、以實(shí)現(xiàn)不同的段之間的轉(zhuǎn)移,執(zhí)遠(yuǎn)程無(wú)條件轉(zhuǎn)移指令可以實(shí)現(xiàn)不同的段之間的轉(zhuǎn)移,執(zhí)行該指令時(shí),行該指令時(shí),CPU把目的段的段基址裝入把目的段的段基址裝入CS,目的位置的,目的位置的段內(nèi)偏移地址裝入段內(nèi)偏移地址裝入IP。有直接尋址和間接尋址兩種格式。有直接尋址和間接尋址兩種格式。(1)遠(yuǎn)程直接轉(zhuǎn)移遠(yuǎn)程直接轉(zhuǎn)移JMP FAR PTR 遠(yuǎn)程標(biāo)號(hào)遠(yuǎn)程標(biāo)號(hào)指令匯編后,對(duì)應(yīng)的機(jī)器指令為指令匯編后,對(duì)應(yīng)的機(jī)器指令為5個(gè)字節(jié):個(gè)字節(jié): 1個(gè)字節(jié)操作碼個(gè)字節(jié)操作碼“0EAH” 2個(gè)字節(jié)目的地址的段內(nèi)偏移地址個(gè)字節(jié)目的地址的段內(nèi)偏移地址 2個(gè)字節(jié)目的標(biāo)號(hào)所在段的段基址個(gè)字節(jié)目的標(biāo)號(hào)所在段的段基址2遠(yuǎn)程無(wú)條件轉(zhuǎn)移指令遠(yuǎn)程
11、無(wú)條件轉(zhuǎn)移指令1313(2)遠(yuǎn)程間接轉(zhuǎn)移遠(yuǎn)程間接轉(zhuǎn)移 遠(yuǎn)程轉(zhuǎn)移需要遠(yuǎn)程轉(zhuǎn)移需要32位的目的地址,使用間接轉(zhuǎn)移時(shí),需要把位的目的地址,使用間接轉(zhuǎn)移時(shí),需要把32位目的地位目的地址事先裝入用址事先裝入用“DD”定義的存儲(chǔ)單元。定義的存儲(chǔ)單元。1)JMP FAR PTR TWO;遠(yuǎn)程直接轉(zhuǎn)移;遠(yuǎn)程直接轉(zhuǎn)移2)LEA BX, FAR_TGT JMP DWORD PTRBX;遠(yuǎn)程間接轉(zhuǎn)移;遠(yuǎn)程間接轉(zhuǎn)移3)JMP FAR_TGT;遠(yuǎn)程間接轉(zhuǎn)移;遠(yuǎn)程間接轉(zhuǎn)移假設(shè)已在數(shù)據(jù)段定義存儲(chǔ)器單元假設(shè)已在數(shù)據(jù)段定義存儲(chǔ)器單元“FAR_TGT”如下:如下:FAR_TGTDDTWO下面三組指令都可以實(shí)現(xiàn)向遠(yuǎn)程標(biāo)號(hào)下面三組指
12、令都可以實(shí)現(xiàn)向遠(yuǎn)程標(biāo)號(hào)“TWO”的轉(zhuǎn)移:的轉(zhuǎn)移:14144.1.2 4.1.2 比較和測(cè)試指令比較和測(cè)試指令(1)CMP(Compare, 比較)指令比較)指令指令格式指令格式:CMP 目的操作數(shù),源操作數(shù)目的操作數(shù),源操作數(shù)目的操作數(shù)目的操作數(shù):8位位/16位位/32位的寄存器位的寄存器/存儲(chǔ)器操作數(shù)。存儲(chǔ)器操作數(shù)。源操作數(shù)源操作數(shù):與目的操作數(shù)同類型的寄存器:與目的操作數(shù)同類型的寄存器/存儲(chǔ)器存儲(chǔ)器/立即數(shù)。立即數(shù)。功能功能:目的操作數(shù):目的操作數(shù)-源操作數(shù),保留運(yùn)算產(chǎn)生的標(biāo)志位,不保留源操作數(shù),保留運(yùn)算產(chǎn)生的標(biāo)志位,不保留運(yùn)算的差。用來(lái)比較兩個(gè)有符號(hào)數(shù)或無(wú)符號(hào)數(shù)的大小。運(yùn)算的差。用來(lái)比較
13、兩個(gè)有符號(hào)數(shù)或無(wú)符號(hào)數(shù)的大小。 1515假設(shè)(假設(shè)(ECX)= 8090A0B0H,指令,指令“CMP ECX, 0”執(zhí)行后:執(zhí)行后: ZF=0 (ECX) 0 OF=0 減法操作沒(méi)有產(chǎn)生溢出(減法操作沒(méi)有產(chǎn)生溢出(SF是正確的結(jié)果符號(hào)位)是正確的結(jié)果符號(hào)位) SF=1 如果如果ECX中存放的是有符號(hào)數(shù),這個(gè)數(shù)是負(fù)數(shù)中存放的是有符號(hào)數(shù),這個(gè)數(shù)是負(fù)數(shù) CF=0 如果如果ECX中存放的是無(wú)符號(hào)數(shù),這個(gè)數(shù)大于中存放的是無(wú)符號(hào)數(shù),這個(gè)數(shù)大于0這條指令與下面的指令等效:這條指令與下面的指令等效: OR ECX, 0 ;根據(jù);根據(jù)ECX的值確定的值確定SF,ZF AND ECX, 0FFFFFFFFH ;
14、根據(jù);根據(jù)ECX的值確定的值確定SF,ZF XOR ECX, 0 ;根據(jù);根據(jù)ECX的值確定的值確定SF,ZF1616CF=0,目的操作數(shù),目的操作數(shù)源操作數(shù)源操作數(shù)CF= 1, 目的操作數(shù)源操作數(shù)目的操作數(shù)源操作數(shù)對(duì)于有符號(hào)數(shù)對(duì)于有符號(hào)數(shù):OF=0時(shí),時(shí),SF為正確的結(jié)果符號(hào)為正確的結(jié)果符號(hào) OF=1時(shí),時(shí),SF與正確的符號(hào)位相反與正確的符號(hào)位相反 OF SF的運(yùn)算結(jié)果反映了正確的結(jié)果符號(hào)的運(yùn)算結(jié)果反映了正確的結(jié)果符號(hào)OF SF= 0, 目的操作數(shù)目的操作數(shù)源操作數(shù)源操作數(shù)OF SF= 1, 目的操作數(shù)源操作數(shù)目的操作數(shù)源操作數(shù)對(duì)于無(wú)符號(hào)數(shù)對(duì)于無(wú)符號(hào)數(shù):1717ZF=0 (X) 5OF=0
15、減法操作沒(méi)有產(chǎn)生溢出,減法操作沒(méi)有產(chǎn)生溢出,SF是正確的結(jié)果符號(hào)位是正確的結(jié)果符號(hào)位SF=1 如果如果X中存放的是有符號(hào)數(shù),中存放的是有符號(hào)數(shù),X5 假設(shè)存儲(chǔ)器變量(假設(shè)存儲(chǔ)器變量(X)= 80H,指令,指令“CMP X, 5”執(zhí)行后:執(zhí)行后:1818(2)TEST(Test,測(cè)試)指令,測(cè)試)指令指令格式指令格式:TEST 目的操作數(shù),源操作數(shù)目的操作數(shù),源操作數(shù)目的操作數(shù)目的操作數(shù):8位位/16位位/32位的寄存器位的寄存器/存儲(chǔ)器操作數(shù)。存儲(chǔ)器操作數(shù)。源操源操 作數(shù)作數(shù):與目的操作數(shù)同類型的寄存器:與目的操作數(shù)同類型的寄存器/存儲(chǔ)器存儲(chǔ)器/立即數(shù)。立即數(shù)。功能功能:TEST指令將目的操作
16、數(shù)與源操作數(shù)進(jìn)行邏輯乘運(yùn)算,保指令將目的操作數(shù)與源操作數(shù)進(jìn)行邏輯乘運(yùn)算,保留運(yùn)算產(chǎn)生的各標(biāo)志位,但是不保留邏輯乘的結(jié)果。該留運(yùn)算產(chǎn)生的各標(biāo)志位,但是不保留邏輯乘的結(jié)果。該指令用來(lái)測(cè)試目的操作數(shù)中某幾位二進(jìn)制的特征。指令用來(lái)測(cè)試目的操作數(shù)中某幾位二進(jìn)制的特征。1919如果如果ZF = 0, 說(shuō)明說(shuō)明BL寄存器的寄存器的D2D100,這兩位為這兩位為01,10或或11。如果如果ZF = 1,說(shuō)明,說(shuō)明BL寄存器的寄存器的D2D100,這兩位為,這兩位為00。 指令指令 TESTVAR, 1 執(zhí)行后:執(zhí)行后:如果如果ZF = 0,說(shuō)明變量,說(shuō)明變量VAR的的D0位為位為1,該數(shù)為奇數(shù),該數(shù)為奇數(shù)如果
17、如果ZF = 1,說(shuō)明變量,說(shuō)明變量VAR的的D0位為位為0,該數(shù)為偶數(shù),該數(shù)為偶數(shù)指令指令 TESTBL, 6 執(zhí)行后:執(zhí)行后:2020(3)BT(Bit Test,位測(cè)試)指令,位測(cè)試)指令指令格式指令格式:BT目的操作數(shù),源操作數(shù)目的操作數(shù),源操作數(shù)目的操作數(shù)目的操作數(shù): 16位位/32位的寄存器位的寄存器/存儲(chǔ)器操作數(shù)。存儲(chǔ)器操作數(shù)。源操作數(shù)源操作數(shù):與目的操作數(shù)同類型的寄存器操作數(shù)或:與目的操作數(shù)同類型的寄存器操作數(shù)或0255以內(nèi)以內(nèi) 的立即數(shù)。的立即數(shù)。功能功能:BT指令將目的操作數(shù)內(nèi)部由源操作數(shù)指定的那一位二進(jìn)指令將目的操作數(shù)內(nèi)部由源操作數(shù)指定的那一位二進(jìn)制的值送入制的值送入CF
18、,兩個(gè)操作數(shù)的值均不改變。該指令用來(lái),兩個(gè)操作數(shù)的值均不改變。該指令用來(lái)測(cè)試目的操作數(shù)中某一位二進(jìn)制的值。測(cè)試目的操作數(shù)中某一位二進(jìn)制的值。2121BTS目的操作數(shù),源操作數(shù)目的操作數(shù),源操作數(shù) ;測(cè)試目的操作數(shù)的指定位,并把該位置為;測(cè)試目的操作數(shù)的指定位,并把該位置為1BTR目的操作數(shù),源操作數(shù)目的操作數(shù),源操作數(shù);測(cè)試目的操作數(shù)的指定位,并把該位置為;測(cè)試目的操作數(shù)的指定位,并把該位置為0BTC目的操作數(shù),源操作數(shù)目的操作數(shù),源操作數(shù);測(cè)試目的操作數(shù)的指定位,并把該位取反;測(cè)試目的操作數(shù)的指定位,并把該位取反設(shè)(設(shè)(EDX)= 12345678H, (ECX)= 5BT EDX, ECX
19、 ; 由于由于EDX寄存器寄存器D5=1,執(zhí)行后,執(zhí)行后CF= 1,EDX值不變值不變BT EDX, 2 ; 由于由于EDX寄存器寄存器D2=0,執(zhí)行后,執(zhí)行后CF= 0,EDX值不變值不變與與BT指令類似的還有以下三條指令:指令類似的還有以下三條指令:22224.1.3 4.1.3 條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令 “J”是條件轉(zhuǎn)移指令操作碼的第一個(gè)字母是條件轉(zhuǎn)移指令操作碼的第一個(gè)字母 “cc”是代表轉(zhuǎn)移條件的是代表轉(zhuǎn)移條件的13個(gè)字母?jìng)€(gè)字母 “l(fā)abel”是轉(zhuǎn)移目的地的標(biāo)號(hào)。是轉(zhuǎn)移目的地的標(biāo)號(hào)。條件轉(zhuǎn)移指令格式:條件轉(zhuǎn)移指令格式: Jcclabel2323(1)根據(jù)兩個(gè)有符號(hào)數(shù)比較結(jié)果的條件轉(zhuǎn)移指
20、令)根據(jù)兩個(gè)有符號(hào)數(shù)比較結(jié)果的條件轉(zhuǎn)移指令兩個(gè)有符號(hào)數(shù)的比較結(jié)果通過(guò)兩個(gè)有符號(hào)數(shù)的比較結(jié)果通過(guò)OF,SF,ZF反映出來(lái)反映出來(lái) G (Greater,大于,大于) L (Less,小于,小于) E (Equal,等于,等于) N (Not,否,否)例:例:JG大于(不小于等于)則轉(zhuǎn)移大于(不小于等于)則轉(zhuǎn)移 JNL 不小于(大于或等于)則轉(zhuǎn)移不小于(大于或等于)則轉(zhuǎn)移 JE等于(為零)則轉(zhuǎn)移等于(為零)則轉(zhuǎn)移2424指令助記符指令助記符 指令功能指令功能轉(zhuǎn)移條件轉(zhuǎn)移條件JG, JNLE大于(不小于等于)時(shí)轉(zhuǎn)移大于(不小于等于)時(shí)轉(zhuǎn)移OFSF= 0且且ZF=0JGE, JNL大于等于(不小于)時(shí)
21、轉(zhuǎn)移大于等于(不小于)時(shí)轉(zhuǎn)移OFSF= 0JZ, JE為零(相等)時(shí)轉(zhuǎn)移為零(相等)時(shí)轉(zhuǎn)移ZF= 1JNZ, JNE不為零(不相等)時(shí)轉(zhuǎn)移不為零(不相等)時(shí)轉(zhuǎn)移ZF=0JL, JNGE小于(不大于等于)時(shí)轉(zhuǎn)移小于(不大于等于)時(shí)轉(zhuǎn)移OFSF= 1JLE, JNG小于等于(不大于)時(shí)轉(zhuǎn)移小于等于(不大于)時(shí)轉(zhuǎn)移OFSF= 1或或ZF=1根據(jù)有符號(hào)數(shù)大小的條件轉(zhuǎn)移指令根據(jù)有符號(hào)數(shù)大小的條件轉(zhuǎn)移指令2525MOV AX, X ;取出;取出X的值送的值送AXCMP AX, Y ;比較兩個(gè)操作數(shù),建立需要的標(biāo)志位;比較兩個(gè)操作數(shù),建立需要的標(biāo)志位JGGREATER;如果;如果XY,轉(zhuǎn)移到,轉(zhuǎn)移到 “GR
22、EATER”處執(zhí)處執(zhí)行行JEEQUAL;如果;如果X=Y,轉(zhuǎn)移到,轉(zhuǎn)移到 “EQUAL”處執(zhí)行處執(zhí)行LESS:;否則,執(zhí)行標(biāo)號(hào);否則,執(zhí)行標(biāo)號(hào)“LESS”處的指令處的指令GREATER:EQUAL:下面程序根據(jù)有符號(hào)字變量下面程序根據(jù)有符號(hào)字變量X和和Y的大小決定程序的走向。的大小決定程序的走向。2626SUBAX, BX;AX(AX)(BX), 建立標(biāo)志位建立標(biāo)志位JGESKIP;如果;如果(AX)0,轉(zhuǎn)標(biāo)號(hào),轉(zhuǎn)標(biāo)號(hào)“SKIP”NEGAX;如果;如果(AX)0,把,把AX的值取反的值取反SKIP: JG GREATER;如果;如果XY,轉(zhuǎn)移到,轉(zhuǎn)移到 “GREATER”處處 JE EQUAL
23、 ;如果;如果X=Y,轉(zhuǎn)移到,轉(zhuǎn)移到 “EQUAL”處處 JL LESS;如果;如果XY,轉(zhuǎn)移到,轉(zhuǎn)移到 “LESS”處處LESS: 這個(gè)程序能夠正確運(yùn)行,最后一條指令有這個(gè)程序能夠正確運(yùn)行,最后一條指令有“畫(huà)蛇添足畫(huà)蛇添足”之嫌。之嫌。下面的程序計(jì)算下面的程序計(jì)算 AX = |AXBX|2727(2)根據(jù)兩個(gè)無(wú)符號(hào)數(shù)比較結(jié)果的條件轉(zhuǎn)移指令)根據(jù)兩個(gè)無(wú)符號(hào)數(shù)比較結(jié)果的條件轉(zhuǎn)移指令兩個(gè)有符號(hào)數(shù)的比較結(jié)果通過(guò)兩個(gè)有符號(hào)數(shù)的比較結(jié)果通過(guò)CF,ZF反映出來(lái),代反映出來(lái),代表轉(zhuǎn)移條件的字母表轉(zhuǎn)移條件的字母: A(Above,高于),高于) B(Below,低于),低于) E(Equal,等于),等于)2
24、828指令助記符指令助記符指令功能指令功能轉(zhuǎn)移條件轉(zhuǎn)移條件JA, JNBE高于(不低于等于)時(shí)轉(zhuǎn)移高于(不低于等于)時(shí)轉(zhuǎn)移CF= 0且且ZF=0JAE, JNB, JNC高于等于(不低于)時(shí)轉(zhuǎn)移高于等于(不低于)時(shí)轉(zhuǎn)移CF= 0JZ, JE為零(相等)時(shí)轉(zhuǎn)移為零(相等)時(shí)轉(zhuǎn)移ZF= 1JNZ, JNE不為零(不相等)時(shí)轉(zhuǎn)移不為零(不相等)時(shí)轉(zhuǎn)移ZF=0JB, JNAE, JC低于(不高于等于)時(shí)轉(zhuǎn)移低于(不高于等于)時(shí)轉(zhuǎn)移CF= 1JBE, JNA低于等于(不高于)時(shí)轉(zhuǎn)移低于等于(不高于)時(shí)轉(zhuǎn)移CF= 1或或ZF=1根據(jù)無(wú)符號(hào)數(shù)大小的條件轉(zhuǎn)移指令根據(jù)無(wú)符號(hào)數(shù)大小的條件轉(zhuǎn)移指令2929(3)根據(jù)
25、單個(gè)標(biāo)志位的條件轉(zhuǎn)移指令)根據(jù)單個(gè)標(biāo)志位的條件轉(zhuǎn)移指令 指令操作碼助記符指令操作碼助記符指令功能指令功能轉(zhuǎn)移條件轉(zhuǎn)移條件JC, JB, JNAE有進(jìn)位時(shí)轉(zhuǎn)移有進(jìn)位時(shí)轉(zhuǎn)移CF= 1JNC, JNB, JAE無(wú)進(jìn)位時(shí)轉(zhuǎn)移無(wú)進(jìn)位時(shí)轉(zhuǎn)移CF= 0JZ, JE為零(相等)時(shí)轉(zhuǎn)移為零(相等)時(shí)轉(zhuǎn)移ZF= 1JNZ, JNE不為零(不相等)時(shí)轉(zhuǎn)移不為零(不相等)時(shí)轉(zhuǎn)移ZF=0JS為負(fù)時(shí)轉(zhuǎn)移為負(fù)時(shí)轉(zhuǎn)移SF=1JNS為正時(shí)轉(zhuǎn)移為正時(shí)轉(zhuǎn)移SF=0JO溢出時(shí)轉(zhuǎn)移溢出時(shí)轉(zhuǎn)移OF=1JNO不溢出時(shí)轉(zhuǎn)移不溢出時(shí)轉(zhuǎn)移OF=0JP, JPE“1”的個(gè)數(shù)為偶數(shù)時(shí)轉(zhuǎn)移的個(gè)數(shù)為偶數(shù)時(shí)轉(zhuǎn)移PF=1JNP, JPO“1”的個(gè)數(shù)為奇數(shù)時(shí)
26、轉(zhuǎn)移的個(gè)數(shù)為奇數(shù)時(shí)轉(zhuǎn)移PF=03030JNGSkipJMPLabelSkip: 對(duì)于對(duì)于16位位80X86CPU,條件轉(zhuǎn)移指令的轉(zhuǎn)移范圍在下一條指令地址,條件轉(zhuǎn)移指令的轉(zhuǎn)移范圍在下一條指令地址128127字節(jié)之間。如果轉(zhuǎn)移目的位置超出了上述范圍,匯編時(shí)將報(bào)告錯(cuò)誤。字節(jié)之間。如果轉(zhuǎn)移目的位置超出了上述范圍,匯編時(shí)將報(bào)告錯(cuò)誤。對(duì)于對(duì)于32位位80X86CPU,條件轉(zhuǎn)移指令匯編后產(chǎn)生,條件轉(zhuǎn)移指令匯編后產(chǎn)生4字節(jié)機(jī)器代碼,前字節(jié)機(jī)器代碼,前2字節(jié)是字節(jié)是它的操作碼,后面它的操作碼,后面2字節(jié)是表示轉(zhuǎn)移距離的位移量,可以實(shí)現(xiàn)字節(jié)是表示轉(zhuǎn)移距離的位移量,可以實(shí)現(xiàn)64KB范圍內(nèi)的范圍內(nèi)的轉(zhuǎn)移。轉(zhuǎn)移。 JG
27、 Label ;如果標(biāo)號(hào);如果標(biāo)號(hào)“Label”超出范圍,匯編時(shí)將出錯(cuò)超出范圍,匯編時(shí)將出錯(cuò)可以把上面指令修改為:可以把上面指令修改為:3131(4)根據(jù))根據(jù)CX/ECX寄存器值的條件轉(zhuǎn)移指令寄存器值的條件轉(zhuǎn)移指令指令格式指令格式: JCXZLabel;若;若CX=0,轉(zhuǎn)移到,轉(zhuǎn)移到Label JECXZ Label;若;若ECX=0,轉(zhuǎn)移到,轉(zhuǎn)移到Label它們的轉(zhuǎn)移范圍固定為下一條指令地址它們的轉(zhuǎn)移范圍固定為下一條指令地址128127字節(jié)以內(nèi)。字節(jié)以內(nèi)。32324.2.1 4.2.1 基本選擇結(jié)構(gòu)基本選擇結(jié)構(gòu)4.2.2 4.2.2 單分支選擇結(jié)構(gòu)單分支選擇結(jié)構(gòu)4.2.3 4.2.3 復(fù)合
28、選擇結(jié)構(gòu)復(fù)合選擇結(jié)構(gòu)4.2.4 4.2.4 多分支選擇結(jié)構(gòu)多分支選擇結(jié)構(gòu)3333為為“|X|3”和和“|X|3”分別編制了進(jìn)行不同處理的指令序列。分別編制了進(jìn)行不同處理的指令序列。如果條件如果條件“|X|3”成立(為成立(為“真真”),執(zhí)行),執(zhí)行 “Y=3X5”如果條件如果條件“|X|3”不成立(為不成立(為“假假”),執(zhí)行),執(zhí)行Y=6通過(guò)在不同的程序之間進(jìn)行選擇,實(shí)現(xiàn)程序的不同功能,通過(guò)在不同的程序之間進(jìn)行選擇,實(shí)現(xiàn)程序的不同功能,“選擇選擇結(jié)構(gòu)結(jié)構(gòu)”因此得名。因此得名。 653XY33XX計(jì)算分段函數(shù)的值計(jì)算分段函數(shù)的值34344.2.1 4.2.1 基本選擇結(jié)構(gòu)基本選擇結(jié)構(gòu)3535C
29、ODESEGMENTASSUMECS: CODESTART:JMPBEGINXDB?; 被測(cè)試的數(shù),匯編之前置入被測(cè)試的數(shù),匯編之前置入YESDB0AH, 0DH, “Its a even number.”, 0AH, 0DH, $NODB0AH, 0DH, “Its a odd number.”, 0AH, 0DH, $BEGIN:PUSHCSPOPDS例例4-2 判斷變量判斷變量X的值是否為的值是否為“偶數(shù)偶數(shù)”3636TESTX, 1;測(cè)試;測(cè)試X的最低位,確定是否為偶數(shù)的最低位,確定是否為偶數(shù)JZEVN;ZF=1,該數(shù)是偶數(shù),轉(zhuǎn)向,該數(shù)是偶數(shù),轉(zhuǎn)向“EVN”O(jiān)DD:LEADX, NO;
30、否則,該數(shù)是奇數(shù);否則,該數(shù)是奇數(shù)MOVAH, 9INT21H;輸出奇數(shù)的相關(guān)信息;輸出奇數(shù)的相關(guān)信息JMPDONE;跳過(guò)程序;跳過(guò)程序“EVN”EVN:LEADX, YESMOVAH, 9INT21H;輸出偶數(shù)的相關(guān)信息;輸出偶數(shù)的相關(guān)信息DONE:MOVAX, 4C00HINT21HCODEENDSENDSTART3737TESTX, 1;測(cè)試;測(cè)試X的最低位,確定是否為偶數(shù)的最低位,確定是否為偶數(shù)JZEVN;ZF=1,該數(shù)是偶數(shù),轉(zhuǎn)向,該數(shù)是偶數(shù),轉(zhuǎn)向“EVN”O(jiān)DD:LEA DX, NO;否則,該數(shù)是奇數(shù);否則,該數(shù)是奇數(shù)JMP DONE ;跳過(guò)程序;跳過(guò)程序“EVN”EVN:LEA
31、DX, YES;該數(shù)是偶數(shù);該數(shù)是偶數(shù)DONE:MOVAH, 9INT21H;輸出該數(shù)的相關(guān)信息;輸出該數(shù)的相關(guān)信息MOV AX, 4C00H如果兩個(gè)如果兩個(gè)“平行平行”分支有相同的處理過(guò)程,可以把它們分支有相同的處理過(guò)程,可以把它們“合并合并” :3838變量變量X取值取值93H,匯編、連接后運(yùn)行該程序,程序輸出:,匯編、連接后運(yùn)行該程序,程序輸出:Its a odd number.變量變量X取值取值94H,匯編、連接后運(yùn)行該程序,程序輸出:,匯編、連接后運(yùn)行該程序,程序輸出:Its a even number.3939DATASEGMENTPROMPT DB 0DH, 0AH, “ Inp
32、ut a lowercase letter: $”;提示提示ERR_MSG DB 0DH, 0AH, “ Input error . $”;輸入錯(cuò)誤警告;輸入錯(cuò)誤警告BUFDB 0DH, 0AH, Prev: ;輸出緩沖區(qū);輸出緩沖區(qū)PREVDB 20HDB 0DH, 0AH, Succ: SUCCDB 20HDB 0DH, 0AH, $DATAENDSCODESEGMENTASSUMECS: CODE, DS: DATA例例4-3 從鍵盤(pán)上輸入一個(gè)小寫(xiě)字母,顯示該字母的前導(dǎo)和后繼。從鍵盤(pán)上輸入一個(gè)小寫(xiě)字母,顯示該字母的前導(dǎo)和后繼。4040START:MOV AX, DATAMOV DS, A
33、XINPUT:LEADX, PROMPTMOV AH, 9INT21H;輸出提示信息;輸出提示信息MOV AH, 1INT21H;輸入一個(gè)字符;輸入一個(gè)字符CMP AL, a;輸入正確性檢查;輸入正確性檢查JBERRORCMP AL, zJAERRORMOV BL, AL;計(jì)算;計(jì)算“前導(dǎo)前導(dǎo)”字母字母DECBL4141CMP BL, aJBSKIP1;“前導(dǎo)前導(dǎo)”非字母,跳過(guò)非字母,跳過(guò)MOV PREV, BL;保存;保存“前導(dǎo)前導(dǎo)”字母字母SKIP1:INCAL;計(jì)算;計(jì)算“后繼后繼”字母字母CMP AL, zJASKIP2;“后繼后繼”非字母,跳過(guò)非字母,跳過(guò)MOV SUCC, AL;“
34、后繼后繼”為字母,保存為字母,保存SKIP2:LEA DX, BUF;輸出;輸出“前導(dǎo)前導(dǎo)”和和“后繼后繼”字母字母MOV AH, 09HINT21HJMPEXIT;跳過(guò)出錯(cuò)處理程序;跳過(guò)出錯(cuò)處理程序4242ERROR:LEA DX, ERR-MSG;顯示出錯(cuò)信息;顯示出錯(cuò)信息MOV AH, 09HINT21HJMPINPUT;要求重新輸入;要求重新輸入EXIT:MOVAX, 4C00H;返回;返回OSINT21HCODEENDSENDSTART健壯性健壯性預(yù)設(shè)結(jié)果預(yù)設(shè)結(jié)果程序要點(diǎn)程序要點(diǎn):4343例例4-4 計(jì)算分段函數(shù)計(jì)算分段函數(shù) 653XY33XXINCLUDEYLIB.HDATASEG
35、MENTPROMPTDB0DH, 0AH, “Input X ( -10000+10000 ): $”XDW?OUT_MSGDB0DH, 0AH, “Y= $”DATAENDSCODESEGMENTASSUMECS: CODE, DS: DATASTART:MOVAX, DATA MOVDS, AX;裝載;裝載DS4444LEADX, PROMPT;輸入提示信息;輸入提示信息CALLREADINT;從鍵盤(pán)上輸入;從鍵盤(pán)上輸入X的值的值MOVX, AX;保存輸入值;保存輸入值COMP:CMP X, 3;比較,;比較,X3 ?JGGREATER ;X3成立,轉(zhuǎn)成立,轉(zhuǎn)“GREATER”CMPX,
36、-3;比較,;比較,X3 ?JLGREATER ;X3 的程序段的程序段OUTPUT:LEA DX, OUT_MSG ;結(jié)果的前導(dǎo)文字;結(jié)果的前導(dǎo)文字CALL WRITEINT;輸出計(jì)算結(jié)果;輸出計(jì)算結(jié)果CALL CRLF;輸出回車換行;輸出回車換行EXIT:MOV AX, 4C00HINT 21HCODEENDSEND START4646復(fù)合邏輯表達(dá)式的分解復(fù)合邏輯表達(dá)式的分解47474.2.2 4.2.2 單分支選擇結(jié)構(gòu)單分支選擇結(jié)構(gòu) 如果選擇結(jié)構(gòu)的一個(gè)分支為如果選擇結(jié)構(gòu)的一個(gè)分支為“空空”,這樣的程序流程稱為,這樣的程序流程稱為“單分支選擇結(jié)構(gòu)單分支選擇結(jié)構(gòu)”。合理地選擇合理地選擇Jcc
37、指令所使用的條件,可以使程序更加流暢。指令所使用的條件,可以使程序更加流暢。 可以把一些基本選擇結(jié)構(gòu)程序改寫(xiě)為單分支選擇結(jié)構(gòu)。可以把一些基本選擇結(jié)構(gòu)程序改寫(xiě)為單分支選擇結(jié)構(gòu)。 4848例例4-4為例,可以將為例,可以將Y“預(yù)設(shè)預(yù)設(shè)”為為6,一旦條件,一旦條件|X|3成立,立即轉(zhuǎn)成立,立即轉(zhuǎn)向向OUTPUT輸出輸出“預(yù)設(shè)預(yù)設(shè)”的結(jié)果,否則進(jìn)行相應(yīng)的計(jì)算。的結(jié)果,否則進(jìn)行相應(yīng)的計(jì)算。4949 COMP:MOV AX, 6;預(yù)設(shè);預(yù)設(shè)AX= 6CMP X, 3;比較,;比較,X3 ?JG OUTPUT;若;若X3,轉(zhuǎn),轉(zhuǎn)OUTPUT輸出輸出CMP X, -3;比較,;比較,X3 ?JL OUTPUT
38、;若;若X3,轉(zhuǎn)轉(zhuǎn)OUTPUT輸出輸出LESS:;|X3 的程序段的程序段MOV AX, X;AXX MOV BX, AX;BXXSAL AX, 1;AX2XADD AX, BX;AX2X+XSUB AX, 5;AX3X5OUTPUT:LEA DX, OUT_MSG;結(jié)果的前導(dǎo)文字;結(jié)果的前導(dǎo)文字 CALL WRITEINT;輸出計(jì)算結(jié)果;輸出計(jì)算結(jié)果5050例例4-5 將將4位二進(jìn)制轉(zhuǎn)換成對(duì)應(yīng)的十六進(jìn)制字符位二進(jìn)制轉(zhuǎn)換成對(duì)應(yīng)的十六進(jìn)制字符 HXHXY373099XX MOV AL, X CMP AL, 9 JAALPH ADDAL, 30H JMPDONEALPH: ADDAL, 37HDO
39、NE: MOV Y, AL MOVAL, X ORAL, 30H CMPAL, 9 JBEDONE ADDAL, 7DONE: MOVY, AL5151 選擇結(jié)構(gòu)一個(gè)分支的程序中又出現(xiàn)了選擇結(jié)構(gòu),這樣的選擇結(jié)構(gòu)一個(gè)分支的程序中又出現(xiàn)了選擇結(jié)構(gòu),這樣的結(jié)構(gòu)稱為結(jié)構(gòu)稱為“復(fù)合選擇結(jié)構(gòu)復(fù)合選擇結(jié)構(gòu)”或者或者“嵌套選擇結(jié)構(gòu)嵌套選擇結(jié)構(gòu)”。4.2.3 4.2.3 復(fù)合選擇結(jié)構(gòu)復(fù)合選擇結(jié)構(gòu)排除法:每次判斷排除若干可能,留下一種可能情況進(jìn)行處理;排除法:每次判斷排除若干可能,留下一種可能情況進(jìn)行處理;確認(rèn)法:每次判斷確認(rèn)一種可能,對(duì)已確認(rèn)的情況進(jìn)行處理。確認(rèn)法:每次判斷確認(rèn)一種可能,對(duì)已確認(rèn)的情況進(jìn)行處理。
40、5252;方法;方法a,逐項(xiàng)排除,逐項(xiàng)排除 CMPX, 0 JGEUN_MINUSMINUS: MOVY, -1 JMPDONEUN_MINUS: JEZERO MOVY, 1 JMPDONEZERO: MOVY, 0DONE:;方法;方法b,逐項(xiàng)確認(rèn),逐項(xiàng)確認(rèn) CMPX, 0 JGPLUS JEZEROMINUS: MOVY, -1 JMPDONEPLUS: MOVY, 1 JMPDONEZERO: MOVY, 0DONE:例例4-6 計(jì)算計(jì)算Y=SGN(X)5353復(fù)合分支選擇結(jié)構(gòu)復(fù)合分支選擇結(jié)構(gòu) 54544.2.4 4.2.4 多分支選擇結(jié)構(gòu)多分支選擇結(jié)構(gòu)在選擇結(jié)構(gòu)程序里,如果可供選擇的
41、程序塊多于兩個(gè),這樣在選擇結(jié)構(gòu)程序里,如果可供選擇的程序塊多于兩個(gè),這樣的結(jié)構(gòu)稱為多分支選擇結(jié)構(gòu),如下圖的結(jié)構(gòu)稱為多分支選擇結(jié)構(gòu),如下圖 (a)所示,下圖所示,下圖 (b)是匯是匯編語(yǔ)言程序的實(shí)現(xiàn)方法。編語(yǔ)言程序的實(shí)現(xiàn)方法。5555DATASEGMENTPROMPTDB0DH, 0AH, “Input a number (13): $”MSG1 DB0DH, 0AH, “FUNCTION 1 EXECUTED . $”MSG2 DB0DH, 0AH, “FUNCTION 2 EXECUTED . $”MSG3 DB0DH, 0AH, “FUNCTION 3 EXECUTED . $”DATAE
42、NDSCODESEGMENTASSUMECS: CODE, DS: DATASTART:MOV AX, DATAMOV DS, AX例例4-7 從鍵盤(pán)上輸入數(shù)字從鍵盤(pán)上輸入數(shù)字“1”到到“3”,根據(jù)輸入選擇對(duì)應(yīng)程,根據(jù)輸入選擇對(duì)應(yīng)程序序 塊執(zhí)行。塊執(zhí)行。5656INPUT:LEA DX, PROMPTMOV AH, 9INT21H;輸出提示信息;輸出提示信息MOV AH, 1INT21H;輸入一個(gè)數(shù)字;輸入一個(gè)數(shù)字CMP AL, 1JBINPUT;“0”或非數(shù)字,重新輸入或非數(shù)字,重新輸入JEF1;數(shù)字;數(shù)字“1”,轉(zhuǎn),轉(zhuǎn)F1CMP AL, 2JEF2;數(shù)字;數(shù)字“2”,轉(zhuǎn),轉(zhuǎn)F2CMP AL
43、, 3JEF3;數(shù)字;數(shù)字“3”,轉(zhuǎn),轉(zhuǎn)F3JMPINPUT;大于;大于“3”,重新輸入,重新輸入5757F1:LEADX, MSG1;F1程序塊程序塊JMPOUTPUTF2:LEADX, MSG2;F2程序塊程序塊JMPOUTPUTF3:LEADX, MSG3;F3程序塊程序塊JMPOUTPUTOUTPUT:MOV AH, 9INT21HMOV AX, 4C00HINT21HCODEENDSENDSTART 5858把完成各功能的程序塊入口地址放在一張表格中,根據(jù)輸入,把完成各功能的程序塊入口地址放在一張表格中,根據(jù)輸入,計(jì)算出該功能程序塊入口地址在表中的位置,通過(guò)存儲(chǔ)器間接計(jì)算出該功能程序
44、塊入口地址在表中的位置,通過(guò)存儲(chǔ)器間接轉(zhuǎn)移轉(zhuǎn)入對(duì)應(yīng)位置執(zhí)行。轉(zhuǎn)移轉(zhuǎn)入對(duì)應(yīng)位置執(zhí)行。DATASEGMENT PROMPTDB 0DH, 0AH, “Input a number (13): $”MSG1DB 0DH, 0AH, “FUNCTION 1 EXECUTED . $”MSG2DB 0DH, 0AH, “FUNCTION 2 EXECUTED . $”MSG3DB 0DH, 0AH, “FUNCTION 3 EXECUTED . $”ADDTBLDW F1, F2, F3DATAENDSCODESEGMENTASSUMECS: CODE, DS: DATA5959START:MOV AX
45、, DATAMOVDS, AXINPUT:LEADX, PROMPTMOVAH, 9INT21H;顯示提示信息;顯示提示信息MOVAH, 1INT21H;輸入一個(gè)數(shù)字;輸入一個(gè)數(shù)字CMPAL, 1JBINPUT ;不正確輸入,重新輸入;不正確輸入,重新輸入CMPAL, 3JAINPUT ;不正確輸入,重新輸入;不正確輸入,重新輸入6060SUBAL, 1 ;將數(shù)字字符;將數(shù)字字符“1”到到“3”轉(zhuǎn)換為轉(zhuǎn)換為0, 1, 2SHLAL, 1;轉(zhuǎn)換為;轉(zhuǎn)換為0,2,4MOVBL, ALMOVBH, 0;轉(zhuǎn)入;轉(zhuǎn)入BXJMPADDTBLBX;間接尋址,轉(zhuǎn)移到對(duì)應(yīng)程序塊;間接尋址,轉(zhuǎn)移到對(duì)應(yīng)程序塊F1:
46、LEADX, MSG1;F1程序塊程序塊JMPOUTPUTF2:LEADX, MSG2;F2程序塊程序塊JMPOUTPUTF3:LEADX, MSG3;F3程序塊程序塊JMPOUTPUT;這條指令可以省略;這條指令可以省略6161OUTPUT:MOV AH, 9INT21HMOV AX, 4C00HINT21HCODEENDSENDSTART62624.3.1 4.3.1 循環(huán)指令循環(huán)指令4.3.2 4.3.2 計(jì)數(shù)循環(huán)計(jì)數(shù)循環(huán)4.3.3 4.3.3 條件循環(huán)條件循環(huán)4.3.4 4.3.4 多重循環(huán)多重循環(huán)6363循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu)也稱為也稱為“重復(fù)結(jié)構(gòu)重復(fù)結(jié)構(gòu)”,它使得一組指令重復(fù)地執(zhí)行,可以
47、用有限長(zhǎng)度的程序,它使得一組指令重復(fù)地執(zhí)行,可以用有限長(zhǎng)度的程序完成大量的處理任務(wù),幾乎所有的應(yīng)用程序中都離不開(kāi)循環(huán)結(jié)構(gòu)。完成大量的處理任務(wù),幾乎所有的應(yīng)用程序中都離不開(kāi)循環(huán)結(jié)構(gòu)。循環(huán)一般由以下循環(huán)一般由以下4個(gè)部分組成:個(gè)部分組成:(1)初始化部分初始化部分:為循環(huán)做準(zhǔn)備,如累加器清零,設(shè)置地址指:為循環(huán)做準(zhǔn)備,如累加器清零,設(shè)置地址指針和計(jì)數(shù)器的初始值等。針和計(jì)數(shù)器的初始值等。(2)工作部分工作部分:實(shí)現(xiàn)循環(huán)的基本操作,也就是需要重復(fù)執(zhí)行的:實(shí)現(xiàn)循環(huán)的基本操作,也就是需要重復(fù)執(zhí)行的一段程序。一段程序。(3)修改部分修改部分:修改指針、計(jì)數(shù)器的值,為下一次循環(huán)做準(zhǔn)備。:修改指針、計(jì)數(shù)器的值,
48、為下一次循環(huán)做準(zhǔn)備。(4)控制部分控制部分:判斷循環(huán)條件,結(jié)束循環(huán)或繼續(xù)循環(huán)。:判斷循環(huán)條件,結(jié)束循環(huán)或繼續(xù)循環(huán)。6464計(jì)數(shù)循環(huán)計(jì)數(shù)循環(huán):循環(huán)的次數(shù)事先已經(jīng)知道,用一個(gè)變量(寄存器或存儲(chǔ)器單元)記錄循環(huán)的循環(huán)的次數(shù)事先已經(jīng)知道,用一個(gè)變量(寄存器或存儲(chǔ)器單元)記錄循環(huán)的次數(shù)(稱為次數(shù)(稱為“循環(huán)計(jì)數(shù)循環(huán)計(jì)數(shù) 器器”)。進(jìn)行減法計(jì)數(shù)時(shí),循環(huán)計(jì)數(shù)器的初值直接設(shè))。進(jìn)行減法計(jì)數(shù)時(shí),循環(huán)計(jì)數(shù)器的初值直接設(shè)為循環(huán)次數(shù),每循環(huán)一次將計(jì)數(shù)器減為循環(huán)次數(shù),每循環(huán)一次將計(jì)數(shù)器減1,計(jì)數(shù)器減為,計(jì)數(shù)器減為0時(shí),循環(huán)結(jié)束。時(shí),循環(huán)結(jié)束。條件循環(huán)條件循環(huán):循環(huán)的次數(shù)事先并不確定,每次循環(huán)開(kāi)始前或結(jié)束后測(cè)試某個(gè)條件,
49、根據(jù)這循環(huán)的次數(shù)事先并不確定,每次循環(huán)開(kāi)始前或結(jié)束后測(cè)試某個(gè)條件,根據(jù)這個(gè)條件是否滿足來(lái)決定是否繼續(xù)下一次循環(huán)。個(gè)條件是否滿足來(lái)決定是否繼續(xù)下一次循環(huán)。按照循環(huán)結(jié)束的條件,有以下兩類循環(huán):按照循環(huán)結(jié)束的條件,有以下兩類循環(huán):6565按照循環(huán)結(jié)束判斷在循環(huán)中的位置,有以下兩種結(jié)構(gòu)的循環(huán):按照循環(huán)結(jié)束判斷在循環(huán)中的位置,有以下兩種結(jié)構(gòu)的循環(huán):WHILEWHILE循環(huán)循環(huán):進(jìn)入循環(huán)后,先判斷循環(huán)結(jié)束條件,條件滿足則退出循環(huán),循進(jìn)入循環(huán)后,先判斷循環(huán)結(jié)束條件,條件滿足則退出循環(huán),循環(huán)次數(shù)最少為環(huán)次數(shù)最少為0次。次。DO-WHILEDO-WHILE循環(huán)循環(huán):進(jìn)入循環(huán)后,先執(zhí)行工作部分,然后判斷循環(huán)繼續(xù)的
50、條件,條進(jìn)入循環(huán)后,先執(zhí)行工作部分,然后判斷循環(huán)繼續(xù)的條件,條件滿足則轉(zhuǎn)向工作部分繼續(xù)循環(huán),循環(huán)次數(shù)最少件滿足則轉(zhuǎn)向工作部分繼續(xù)循環(huán),循環(huán)次數(shù)最少1次。次。66666767LOOPLabel ; CXCX-1,若,若(CX)0,轉(zhuǎn)移到,轉(zhuǎn)移到LabelLOOPZ/LOOPE Label; CXCX-1,若,若(CX)0且且ZF=1,轉(zhuǎn)移到,轉(zhuǎn)移到LabelLOOPNZ/LOOPNE Label; CXCX-1,若,若(CX)0且且ZF=0,轉(zhuǎn)移到,轉(zhuǎn)移到Label4.3.1 4.3.1 循環(huán)指令循環(huán)指令 循環(huán)指令采用相對(duì)尋址方式,循環(huán)指令采用相對(duì)尋址方式,Label距離循環(huán)指令的下一條指距離循
51、環(huán)指令的下一條指令必須在令必須在-128+127B之內(nèi)。之內(nèi)。6868 LOOPZ/LOOPE,LOOPNZ/LOOPNE指令的功能也可以由指令的功能也可以由Jcc指令實(shí)現(xiàn)。指令實(shí)現(xiàn)。 由于對(duì)由于對(duì)CX先減先減1,后判斷,如果,后判斷,如果CX的初值為的初值為0,將循環(huán),將循環(huán)65536次。次。 循環(huán)指令的執(zhí)行不影響標(biāo)志位。循環(huán)指令的執(zhí)行不影響標(biāo)志位。LOOP指令的功能可以用指令的功能可以用Jcc指令實(shí)現(xiàn):指令實(shí)現(xiàn):DECCX; CXCX-1JNZLabel ; 若若(CX)0(也就是(也就是ZF=0),轉(zhuǎn)移到),轉(zhuǎn)移到Label6969 計(jì)數(shù)循環(huán)是基本的循環(huán)組織方式,用循環(huán)計(jì)數(shù)器的值來(lái)控制計(jì)
52、數(shù)循環(huán)是基本的循環(huán)組織方式,用循環(huán)計(jì)數(shù)器的值來(lái)控制循環(huán),有時(shí)候也可以結(jié)合其它條件共同控制。循環(huán),有時(shí)候也可以結(jié)合其它條件共同控制。4.3.2 4.3.2 計(jì)數(shù)循環(huán)計(jì)數(shù)循環(huán)例例4-8 從鍵盤(pán)上輸入一個(gè)字符串(不超過(guò)從鍵盤(pán)上輸入一個(gè)字符串(不超過(guò)80個(gè)字符),將它個(gè)字符),將它逆序后輸出。逆序后輸出。INCLUDEYLIB.HDATASEGMENTBUFFERDB81, ?, 81 DUP(?)MESSDB0AH, 0DH, “Input a string please : $”DATAENDS7070CODESEGMENTASSUME CS:CODE, DS:DATASTART:MOV AX,
53、DATAMOVDS, AXLEADX, MESSMOVAH, 09HINT21H; 輸出提示信息輸出提示信息MOVAH, 0AHLEADX, BUFFERINT21H; 輸入字符串輸入字符串CALLCRLFLEABX, BUFFER; 緩沖區(qū)首地址送緩沖區(qū)首地址送BXMOVCL, BUFFER+1MOVCH, 0; 輸入字符個(gè)數(shù)送輸入字符個(gè)數(shù)送CX(循環(huán)次數(shù))(循環(huán)次數(shù))7171ADDBX, CXINCBX; 計(jì)算字符串末地址送計(jì)算字符串末地址送BX(指針)(指針)DISP: MOV DL, BXMOV AH, 02HINT21H; 逆序輸出一個(gè)字符逆序輸出一個(gè)字符DECBX; 修改指針修改指
54、針LOOPDISP; 計(jì)數(shù)循環(huán)計(jì)數(shù)循環(huán)CALL CRLF; 輸出換行、回車,結(jié)束本行輸出換行、回車,結(jié)束本行MOV AX, 4C00HINT21HCODEENDSENDSTART7272INCLUDEYLIB.HDATASEGMENTMESS1DB0AH, 0DH, “Input a number : $”MESS2DB0AH, 0DH, “The number in hexdecimal is: $”HEXTABDB“0123456789ABCDEF”DATAENDSCODESEGMENTASSUMECS: CODE, DS: DATASTART:MOV AX, DATAMOV DS, AX
55、例例4-9 從鍵盤(pán)上輸入一個(gè)十進(jìn)制無(wú)符號(hào)整數(shù),將它用十六進(jìn)從鍵盤(pán)上輸入一個(gè)十進(jìn)制無(wú)符號(hào)整數(shù),將它用十六進(jìn)制格式輸出。制格式輸出。7373 LEADX, MESS1CALL READDEC; 輸入一個(gè)十進(jìn)制無(wú)符號(hào)數(shù)輸入一個(gè)十進(jìn)制無(wú)符號(hào)數(shù)MOV SI, AX; 轉(zhuǎn)存在轉(zhuǎn)存在SI中中LEADX, MESS2MOV AH, 9INT21H; 輸出文字前導(dǎo)輸出文字前導(dǎo)MOV CX, 4; 循環(huán)次數(shù)初值循環(huán)次數(shù)初值LEABX, HEXTAB; 換碼表首地址換碼表首地址ONE: PUSH CXMOV CL, 4 ROLSI, CL; 把最高把最高4 4位移到最低位移到最低4 4位位7474MOV AX, S
56、I; 轉(zhuǎn)入轉(zhuǎn)入AX中中ANDAX, 000FH; 保留最低保留最低4位位XLAT; 查表查表,轉(zhuǎn)換成十六進(jìn)制字符的轉(zhuǎn)換成十六進(jìn)制字符的ASCII代碼代碼MOV DL, ALMOV AH, 2 INT21H; 輸出一個(gè)十六進(jìn)制字符輸出一個(gè)十六進(jìn)制字符POPCXLOOPONE; 計(jì)數(shù)循環(huán)計(jì)數(shù)循環(huán)CALL CRLF; 輸出回車換行輸出回車換行, 結(jié)束本行結(jié)束本行MOV AX, 4C00HINT21HCODEENDSENDSTART7575 用總分減去最高分、最低分,最后除以用總分減去最高分、最低分,最后除以5,得到需要的成績(jī)。,得到需要的成績(jī)。 求求N個(gè)數(shù)據(jù)中最大值的方法:個(gè)數(shù)據(jù)中最大值的方法:預(yù)設(shè)
57、一個(gè)預(yù)設(shè)一個(gè)“最大值最大值”,取出一個(gè)數(shù)據(jù)與這個(gè)取出一個(gè)數(shù)據(jù)與這個(gè)“最大值最大值”進(jìn)行比較,進(jìn)行比較, 如果數(shù)據(jù)大于如果數(shù)據(jù)大于“最大值最大值”,則將該數(shù)據(jù)作為新的,則將該數(shù)據(jù)作為新的“最大最大值值”。進(jìn)行進(jìn)行N次比較之后留下的就是這次比較之后留下的就是這N個(gè)數(shù)據(jù)的最大值。個(gè)數(shù)據(jù)的最大值。 預(yù)設(shè)的預(yù)設(shè)的“最大值最大值”的初值可以從的初值可以從N個(gè)數(shù)據(jù)中任取一個(gè),也可以個(gè)數(shù)據(jù)中任取一個(gè),也可以根根據(jù)數(shù)據(jù)的范圍,取一個(gè)該范圍內(nèi)的最小的數(shù)。據(jù)數(shù)據(jù)的范圍,取一個(gè)該范圍內(nèi)的最小的數(shù)。 計(jì)算最小值的方法與此類似。計(jì)算最小值的方法與此類似。例例4-10 從鍵盤(pán)上輸入七名裁判的評(píng)分(從鍵盤(pán)上輸入七名裁判的評(píng)分
58、(010),扣除一個(gè)最),扣除一個(gè)最高分,一個(gè)最低分,計(jì)算出其它五項(xiàng)評(píng)分的平均值(保留高分,一個(gè)最低分,計(jì)算出其它五項(xiàng)評(píng)分的平均值(保留一位小數(shù)),在顯示器上輸出。一位小數(shù)),在顯示器上輸出。7676INCLUDEYLIB.HDATASEGMENTMESS1DB0DH, 0AH, “Input a score ( 010 ) : $”MESS2DB0DH, 0AH, “The final score is : $”C5DB5MAXDB?MINDB?SUMDB?DATAENDSCODESEGMENTASSUMECS: CODE, DS: DATASTART:MOV AX, DATAMOV DS,
59、 AX7777MOV SUM, 0; 累加器清零累加器清零MOV MAX, 0; “最大值最大值”預(yù)設(shè)為預(yù)設(shè)為0MOV MIN, 255; “最小值最小值”預(yù)設(shè)為預(yù)設(shè)為255MOV CX, 7; 循環(huán)計(jì)數(shù)器,初值循環(huán)計(jì)數(shù)器,初值7ONE: LEADX, MESS1CALL READDEC; 鍵盤(pán)輸入一個(gè)分?jǐn)?shù)鍵盤(pán)輸入一個(gè)分?jǐn)?shù)ADDSUM, AL; 累加累加CMP MAX, AL; 與與“最大值最大值”比較比較JAL1MOV MAX, AL; 大于大于“最大值最大值”則保留則保留L1:CMP MIN, AL; 與與“最小值最小值”比較比較JBL2MOV MIN, AL; 小于小于“最小值最小值”則
60、保留則保留L2:LOOPONE; 計(jì)數(shù)循環(huán)計(jì)數(shù)循環(huán)7878MOV AL, SUMSUBAL, MAXSUBAL, MIN; 從總分中減去最大、最小值從總分中減去最大、最小值MOV SUM, ALXOR AH, AH; 高高8位清零位清零DIVC5; 求平均值求平均值PUSH AX; 保留余數(shù)(在保留余數(shù)(在AH中)中)MOV AH, 0; 清余數(shù)清余數(shù)LEADX, MESS2CALL WRITEDEC; 輸出結(jié)果的整數(shù)部分輸出結(jié)果的整數(shù)部分 7979MOV DL, .MOV AH, 2INT21H; 輸出小數(shù)點(diǎn)輸出小數(shù)點(diǎn)POPAX; 從堆棧彈出余數(shù)從堆棧彈出余數(shù)SHLAH, 1 ; 計(jì)算小數(shù)部
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《數(shù)字信號(hào)處理-基于數(shù)值計(jì)算》課件-第2章
- 《氧化還原反應(yīng)預(yù)習(xí)》課件
- 合同備注無(wú)效最簡(jiǎn)單三個(gè)步驟
- 投資花卉種植項(xiàng)目合同模板
- 工程施工合同實(shí)例
- 2025年涼山州貨運(yùn)從業(yè)資格證考試卷
- 2025年寧夏貨運(yùn)從業(yè)資格證考試題庫(kù)
- 2025年福建貨運(yùn)從業(yè)資格證模擬考試題答案大全
- 《氧化還原用》課件
- 《城市交通特性》課件
- 機(jī)電工程規(guī)范
- 攝影器材借還管理登記表Excel模板
- 中國(guó)風(fēng)兒童滿月紀(jì)念相冊(cè)PPT模板
- 楊柳煤礦“三量”動(dòng)態(tài)變化情況分析報(bào)告(3)
- 醫(yī)療垃圾收集辦法及流程圖
- 復(fù)古中古風(fēng)非遺之蘇繡文化介紹PPT模板
- 大氣課程設(shè)計(jì)-—袋式除塵器
- 手衛(wèi)生流程圖
- 叉車自檢報(bào)告模板(1)
- 水泥攪拌樁水灰比及漿液用量計(jì)算表(自動(dòng)計(jì)算)
- 建筑物放線驗(yàn)線技術(shù)報(bào)告
評(píng)論
0/150
提交評(píng)論