選擇和循環(huán)課件_第1頁
選擇和循環(huán)課件_第2頁
選擇和循環(huán)課件_第3頁
選擇和循環(huán)課件_第4頁
選擇和循環(huán)課件_第5頁
已閱讀5頁,還剩144頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、1 12 24.1 4.1 測試和控制指令測試和控制指令 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) : 程 序 按 照 它 編 寫 的 順 序 執(zhí) 行 , 每 條 指 令 只 執(zhí) 行 一: 程 序 按 照 它 編 寫 的 順 序 執(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ù) 某 個 條 件 , 一 部 分 指 令 被 執(zhí) 行 , 另 一 部 分 指: 根 據(jù) 某 個 條 件 , 一 部 分 指 令 被 執(zhí) 行 , 另 一 部 分 指 令 沒 有 被 執(zhí) 行 , 這 樣 的 程 序 稱 為令 沒 有 被 執(zhí) 行 , 這 樣 的 程 序 稱 為 “ 選 擇 結(jié) 構(gòu)選 擇 結(jié) 構(gòu) ” 或 者或 者 “ “分支結(jié)構(gòu)分支結(jié)構(gòu)”的程序。的程序。一個實際運行的程序,常常是由以上三種結(jié)構(gòu)的程序組合而成的,上

3、面的三一個實際運行的程序,常常是由以上三種結(jié)構(gòu)的程序組合而成的,上面的三種結(jié)構(gòu)稱為程序的種結(jié)構(gòu)稱為程序的“基本結(jié)構(gòu)基本結(jié)構(gòu)”。使用這三種基本結(jié)構(gòu),可以編寫出任何所。使用這三種基本結(jié)構(gòu),可以編寫出任何所需要的程序。需要的程序。 4 44.1.1 4.1.1 無條件轉(zhuǎn)移指令無條件轉(zhuǎn)移指令4.1.2 4.1.2 比較和測試指令比較和測試指令 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 無條件轉(zhuǎn)移指令無條件轉(zhuǎn)移指令無條件轉(zhuǎn)移指令的一般格式:無條件轉(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指令實現(xiàn)

5、轉(zhuǎn)移指令實現(xiàn)轉(zhuǎn)移7 71.近程無條件轉(zhuǎn)移指令近程無條件轉(zhuǎn)移指令 如果轉(zhuǎn)移的目的位置與出發(fā)點在同一個段里,這樣的轉(zhuǎn)移稱如果轉(zhuǎn)移的目的位置與出發(fā)點在同一個段里,這樣的轉(zhuǎn)移稱為為“近程近程”轉(zhuǎn)移或者轉(zhuǎn)移或者“段內(nèi)段內(nèi)”轉(zhuǎn)移。實現(xiàn)轉(zhuǎn)移。實現(xiàn)“近程近程”轉(zhuǎn)移,實質(zhì)轉(zhuǎn)移,實質(zhì)上是把目標(biāo)位置的上是把目標(biāo)位置的“偏移地址偏移地址”置入置入IP寄存器。寄存器。 按照尋址方式的不同,近程無條件轉(zhuǎn)移指令有三種格式。按照尋址方式的不同,近程無條件轉(zhuǎn)移指令有三種格式。8 8(1)短轉(zhuǎn)移短轉(zhuǎn)移如果目的位置離開出發(fā)點很近,可以使用以下格式:如果目的位置離開出發(fā)點很近,可以使用以下格式:JMPSHORT LABEL其中其中“

6、LABEL”是目的位置的標(biāo)號。這種格式產(chǎn)生的機器指令代碼最短,為是目的位置的標(biāo)號。這種格式產(chǎn)生的機器指令代碼最短,為2字節(jié)。字節(jié)。100H: JMP SHORT TWO102H: 10CH: TWO: 指令指令“JMP SHORT TWO”匯編后產(chǎn)生的機器指令為匯編后產(chǎn)生的機器指令為“EB0A”。 “EB”是這種類型轉(zhuǎn)移指令的是這種類型轉(zhuǎn)移指令的“操作碼操作碼”,“0A”是目的位置離開出發(fā)點的距離,是目的位置離開出發(fā)點的距離,10CH102H=0AH。 由于用一個字節(jié)補碼表示目的地址與當(dāng)前地址的距離,所以轉(zhuǎn)移范圍為下由于用一個字節(jié)補碼表示目的地址與當(dāng)前地址的距離,所以轉(zhuǎn)移范圍為下一條指令地址一

7、條指令地址-128 +127字節(jié)以內(nèi)。字節(jié)以內(nèi)。9 9(2)近程直接轉(zhuǎn)移近程直接轉(zhuǎn)移JMP目的位置標(biāo)號目的位置標(biāo)號指令指令“JMP TWO”JMP TWO”匯編后得到的機器指令代碼為匯編后得到的機器指令代碼為“E9FDEE”E9FDEE”?!癊9”E9”為操作碼為操作碼“0EEFDH”0EEFDH”為位移量,為位移量,0EEFDH=0F000H0EEFDH=0F000H103H103H。指令指令“JMP ONE”JMP ONE”對應(yīng)的機器指令代碼為對應(yīng)的機器指令代碼為“E90011”E90011”“E9”“E9”為操作碼為操作碼位移量位移量“1100H”1100H”,0F003H+1100H=

8、0103H(0F003H+1100H=0103H(舍去進位舍去進位) )使用近程直接轉(zhuǎn)移指令可以實現(xiàn)同一個段內(nèi)使用近程直接轉(zhuǎn)移指令可以實現(xiàn)同一個段內(nèi)64KB64KB范圍的轉(zhuǎn)移。范圍的轉(zhuǎn)移。100H: JMPTWO103H:ONE: 0F000H:TWO:JMPONE0F003H:1010(3)近程間接轉(zhuǎn)移近程間接轉(zhuǎn)移 把轉(zhuǎn)移的目的地址事先存放在某個寄存器或存儲器單元中,把轉(zhuǎn)移的目的地址事先存放在某個寄存器或存儲器單元中,通過這個寄存器或存儲單元實現(xiàn)轉(zhuǎn)移。通過這個寄存器或存儲單元實現(xiàn)轉(zhuǎn)移。JMP CX ;寄存器間接轉(zhuǎn)移,可使用任何一個通用寄存器;寄存器間接轉(zhuǎn)移,可使用任何一個通用寄存器JMP W

9、ORD PTRBX;存儲器間接轉(zhuǎn)移,目的地址在存儲單元中;存儲器間接轉(zhuǎn)移,目的地址在存儲單元中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 ;存儲器間接段內(nèi)轉(zhuǎn)移;存儲器間接段內(nèi)轉(zhuǎn)移4)JMP TARGET;存儲器間接段內(nèi)轉(zhuǎn)移;存儲器間接段內(nèi)轉(zhuǎn)移已在數(shù)據(jù)段定義存儲器單元已在數(shù)據(jù)段定義存儲器單元“TARGET” :TAEGETDW ONE下面四組指令都可以實現(xiàn)向標(biāo)號下面四組指令都可以實現(xiàn)向標(biāo)號“ONE”的轉(zhuǎn)移:的轉(zhuǎn)移:1212 遠程無條件轉(zhuǎn)移指令可

10、以實現(xiàn)不同的段之間的轉(zhuǎn)移,執(zhí)遠程無條件轉(zhuǎn)移指令可以實現(xiàn)不同的段之間的轉(zhuǎn)移,執(zhí)行該指令時,行該指令時,CPU把目的段的段基址裝入把目的段的段基址裝入CS,目的位置的,目的位置的段內(nèi)偏移地址裝入段內(nèi)偏移地址裝入IP。有直接尋址和間接尋址兩種格式。有直接尋址和間接尋址兩種格式。(1)遠程直接轉(zhuǎn)移遠程直接轉(zhuǎn)移JMP FAR PTR 遠程標(biāo)號遠程標(biāo)號指令匯編后,對應(yīng)的機器指令為指令匯編后,對應(yīng)的機器指令為5個字節(jié):個字節(jié): 1個字節(jié)操作碼個字節(jié)操作碼“0EAH” 2個字節(jié)目的地址的段內(nèi)偏移地址個字節(jié)目的地址的段內(nèi)偏移地址 2個字節(jié)目的標(biāo)號所在段的段基址個字節(jié)目的標(biāo)號所在段的段基址2遠程無條件轉(zhuǎn)移指令遠程

11、無條件轉(zhuǎn)移指令1313(2)遠程間接轉(zhuǎn)移遠程間接轉(zhuǎn)移 遠程轉(zhuǎn)移需要遠程轉(zhuǎn)移需要32位的目的地址,使用間接轉(zhuǎn)移時,需要把位的目的地址,使用間接轉(zhuǎn)移時,需要把32位目的地位目的地址事先裝入用址事先裝入用“DD”定義的存儲單元。定義的存儲單元。1)JMP FAR PTR TWO;遠程直接轉(zhuǎn)移;遠程直接轉(zhuǎn)移2)LEA BX, FAR_TGT JMP DWORD PTRBX;遠程間接轉(zhuǎn)移;遠程間接轉(zhuǎn)移3)JMP FAR_TGT;遠程間接轉(zhuǎn)移;遠程間接轉(zhuǎn)移假設(shè)已在數(shù)據(jù)段定義存儲器單元假設(shè)已在數(shù)據(jù)段定義存儲器單元“FAR_TGT”如下:如下:FAR_TGTDDTWO下面三組指令都可以實現(xiàn)向遠程標(biāo)號下面三組指

12、令都可以實現(xiàn)向遠程標(biāo)號“TWO”的轉(zhuǎn)移:的轉(zhuǎn)移:14144.1.2 4.1.2 比較和測試指令比較和測試指令(1)CMP(Compare, 比較)指令比較)指令指令格式指令格式:CMP 目的操作數(shù),源操作數(shù)目的操作數(shù),源操作數(shù)目的操作數(shù)目的操作數(shù):8位位/16位位/32位的寄存器位的寄存器/存儲器操作數(shù)。存儲器操作數(shù)。源操作數(shù)源操作數(shù):與目的操作數(shù)同類型的寄存器:與目的操作數(shù)同類型的寄存器/存儲器存儲器/立即數(shù)。立即數(shù)。功能功能:目的操作數(shù):目的操作數(shù)-源操作數(shù),保留運算產(chǎn)生的標(biāo)志位,不保留源操作數(shù),保留運算產(chǎn)生的標(biāo)志位,不保留運算的差。用來比較兩個有符號數(shù)或無符號數(shù)的大小。運算的差。用來比較

13、兩個有符號數(shù)或無符號數(shù)的大小。 1515假設(shè)(假設(shè)(ECX)= 8090A0B0H,指令,指令“CMP ECX, 0”執(zhí)行后:執(zhí)行后: ZF=0 (ECX) 0 OF=0 減法操作沒有產(chǎn)生溢出(減法操作沒有產(chǎn)生溢出(SF是正確的結(jié)果符號位)是正確的結(jié)果符號位) SF=1 如果如果ECX中存放的是有符號數(shù),這個數(shù)是負數(shù)中存放的是有符號數(shù),這個數(shù)是負數(shù) CF=0 如果如果ECX中存放的是無符號數(shù),這個數(shù)大于中存放的是無符號數(shù),這個數(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ù)對于有符號數(shù)對于有符號數(shù):OF=0時,時,SF為正確的結(jié)果符號為正確的結(jié)果符號 OF=1時,時,SF與正確的符號位相反與正確的符號位相反 OF SF的運算結(jié)果反映了正確的結(jié)果符號的運算結(jié)果反映了正確的結(jié)果符號OF SF= 0, 目的操作數(shù)目的操作數(shù)源操作數(shù)源操作數(shù)OF SF= 1, 目的操作數(shù)源操作數(shù)目的操作數(shù)源操作數(shù)對于無符號數(shù)對于無符號數(shù):1717ZF=0 (X) 5OF=0

15、減法操作沒有產(chǎn)生溢出,減法操作沒有產(chǎn)生溢出,SF是正確的結(jié)果符號位是正確的結(jié)果符號位SF=1 如果如果X中存放的是有符號數(shù),中存放的是有符號數(shù),X5 假設(shè)存儲器變量(假設(shè)存儲器變量(X)= 80H,指令,指令“CMP X, 5”執(zhí)行后:執(zhí)行后:1818(2)TEST(Test,測試)指令,測試)指令指令格式指令格式:TEST 目的操作數(shù),源操作數(shù)目的操作數(shù),源操作數(shù)目的操作數(shù)目的操作數(shù):8位位/16位位/32位的寄存器位的寄存器/存儲器操作數(shù)。存儲器操作數(shù)。源操源操 作數(shù)作數(shù):與目的操作數(shù)同類型的寄存器:與目的操作數(shù)同類型的寄存器/存儲器存儲器/立即數(shù)。立即數(shù)。功能功能:TEST指令將目的操作

16、數(shù)與源操作數(shù)進行邏輯乘運算,保指令將目的操作數(shù)與源操作數(shù)進行邏輯乘運算,保留運算產(chǎn)生的各標(biāo)志位,但是不保留邏輯乘的結(jié)果。該留運算產(chǎn)生的各標(biāo)志位,但是不保留邏輯乘的結(jié)果。該指令用來測試目的操作數(shù)中某幾位二進制的特征。指令用來測試目的操作數(shù)中某幾位二進制的特征。1919如果如果ZF = 0, 說明說明BL寄存器的寄存器的D2D100,這兩位為這兩位為01,10或或11。如果如果ZF = 1,說明,說明BL寄存器的寄存器的D2D100,這兩位為,這兩位為00。 指令指令 TESTVAR, 1 執(zhí)行后:執(zhí)行后:如果如果ZF = 0,說明變量,說明變量VAR的的D0位為位為1,該數(shù)為奇數(shù),該數(shù)為奇數(shù)如果

17、如果ZF = 1,說明變量,說明變量VAR的的D0位為位為0,該數(shù)為偶數(shù),該數(shù)為偶數(shù)指令指令 TESTBL, 6 執(zhí)行后:執(zhí)行后:2020(3)BT(Bit Test,位測試)指令,位測試)指令指令格式指令格式:BT目的操作數(shù),源操作數(shù)目的操作數(shù),源操作數(shù)目的操作數(shù)目的操作數(shù): 16位位/32位的寄存器位的寄存器/存儲器操作數(shù)。存儲器操作數(shù)。源操作數(shù)源操作數(shù):與目的操作數(shù)同類型的寄存器操作數(shù)或:與目的操作數(shù)同類型的寄存器操作數(shù)或0255以內(nèi)以內(nèi) 的立即數(shù)。的立即數(shù)。功能功能:BT指令將目的操作數(shù)內(nèi)部由源操作數(shù)指定的那一位二進指令將目的操作數(shù)內(nèi)部由源操作數(shù)指定的那一位二進制的值送入制的值送入CF

18、,兩個操作數(shù)的值均不改變。該指令用來,兩個操作數(shù)的值均不改變。該指令用來測試目的操作數(shù)中某一位二進制的值。測試目的操作數(shù)中某一位二進制的值。2121BTS目的操作數(shù),源操作數(shù)目的操作數(shù),源操作數(shù) ;測試目的操作數(shù)的指定位,并把該位置為;測試目的操作數(shù)的指定位,并把該位置為1BTR目的操作數(shù),源操作數(shù)目的操作數(shù),源操作數(shù);測試目的操作數(shù)的指定位,并把該位置為;測試目的操作數(shù)的指定位,并把該位置為0BTC目的操作數(shù),源操作數(shù)目的操作數(shù),源操作數(shù);測試目的操作數(shù)的指定位,并把該位取反;測試目的操作數(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)移指令操作碼的第一個字母是條件轉(zhuǎn)移指令操作碼的第一個字母 “cc”是代表轉(zhuǎn)移條件的是代表轉(zhuǎn)移條件的13個字母個字母 “l(fā)abel”是轉(zhuǎn)移目的地的標(biāo)號。是轉(zhuǎn)移目的地的標(biāo)號。條件轉(zhuǎn)移指令格式:條件轉(zhuǎn)移指令格式: Jcclabel2323(1)根據(jù)兩個有符號數(shù)比較結(jié)果的條件轉(zhuǎn)移指

20、令)根據(jù)兩個有符號數(shù)比較結(jié)果的條件轉(zhuǎn)移指令兩個有符號數(shù)的比較結(jié)果通過兩個有符號數(shù)的比較結(jié)果通過OF,SF,ZF反映出來反映出來 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大于(不小于等于)時轉(zhuǎn)移大于(不小于等于)時轉(zhuǎn)移OFSF= 0且且ZF=0JGE, JNL大于等于(不小于)時

21、轉(zhuǎn)移大于等于(不小于)時轉(zhuǎn)移OFSF= 0JZ, JE為零(相等)時轉(zhuǎn)移為零(相等)時轉(zhuǎn)移ZF= 1JNZ, JNE不為零(不相等)時轉(zhuǎn)移不為零(不相等)時轉(zhuǎn)移ZF=0JL, JNGE小于(不大于等于)時轉(zhuǎn)移小于(不大于等于)時轉(zhuǎn)移OFSF= 1JLE, JNG小于等于(不大于)時轉(zhuǎn)移小于等于(不大于)時轉(zhuǎn)移OFSF= 1或或ZF=1根據(jù)有符號數(shù)大小的條件轉(zhuǎn)移指令根據(jù)有符號數(shù)大小的條件轉(zhuǎn)移指令2525MOV AX, X ;取出;取出X的值送的值送AXCMP AX, Y ;比較兩個操作數(shù),建立需要的標(biāo)志位;比較兩個操作數(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)號;否則,執(zhí)行標(biāo)號“LESS”處的指令處的指令GREATER:EQUAL:下面程序根據(jù)有符號字變量下面程序根據(jù)有符號字變量X和和Y的大小決定程序的走向。的大小決定程序的走向。2626SUBAX, BX;AX(AX)(BX), 建立標(biāo)志位建立標(biāo)志位JGESKIP;如果;如果(AX)0,轉(zhuǎn)標(biāo)號,轉(zhuǎn)標(biā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: 這個程序能夠正確運行,最后一條指令有這個程序能夠正確運行,最后一條指令有“畫蛇添足畫蛇添足”之嫌。之嫌。下面的程序計算下面的程序計算 AX = |AXBX|2727(2)根據(jù)兩個無符號數(shù)比較結(jié)果的條件轉(zhuǎn)移指令)根據(jù)兩個無符號數(shù)比較結(jié)果的條件轉(zhuǎn)移指令兩個有符號數(shù)的比較結(jié)果通過兩個有符號數(shù)的比較結(jié)果通過CF,ZF反映出來,代反映出來,代表轉(zhuǎn)移條件的字母表轉(zhuǎn)移條件的字母: A(Above,高于),高于) B(Below,低于),低于) E(Equal,等于),等于)2

24、828指令助記符指令助記符指令功能指令功能轉(zhuǎn)移條件轉(zhuǎn)移條件JA, JNBE高于(不低于等于)時轉(zhuǎn)移高于(不低于等于)時轉(zhuǎn)移CF= 0且且ZF=0JAE, JNB, JNC高于等于(不低于)時轉(zhuǎn)移高于等于(不低于)時轉(zhuǎn)移CF= 0JZ, JE為零(相等)時轉(zhuǎn)移為零(相等)時轉(zhuǎn)移ZF= 1JNZ, JNE不為零(不相等)時轉(zhuǎn)移不為零(不相等)時轉(zhuǎn)移ZF=0JB, JNAE, JC低于(不高于等于)時轉(zhuǎn)移低于(不高于等于)時轉(zhuǎn)移CF= 1JBE, JNA低于等于(不高于)時轉(zhuǎn)移低于等于(不高于)時轉(zhuǎn)移CF= 1或或ZF=1根據(jù)無符號數(shù)大小的條件轉(zhuǎn)移指令根據(jù)無符號數(shù)大小的條件轉(zhuǎn)移指令2929(3)根據(jù)

25、單個標(biāo)志位的條件轉(zhuǎn)移指令)根據(jù)單個標(biāo)志位的條件轉(zhuǎn)移指令 指令操作碼助記符指令操作碼助記符指令功能指令功能轉(zhuǎn)移條件轉(zhuǎn)移條件JC, JB, JNAE有進位時轉(zhuǎn)移有進位時轉(zhuǎn)移CF= 1JNC, JNB, JAE無進位時轉(zhuǎn)移無進位時轉(zhuǎn)移CF= 0JZ, JE為零(相等)時轉(zhuǎn)移為零(相等)時轉(zhuǎn)移ZF= 1JNZ, JNE不為零(不相等)時轉(zhuǎn)移不為零(不相等)時轉(zhuǎn)移ZF=0JS為負時轉(zhuǎn)移為負時轉(zhuǎn)移SF=1JNS為正時轉(zhuǎn)移為正時轉(zhuǎn)移SF=0JO溢出時轉(zhuǎn)移溢出時轉(zhuǎn)移OF=1JNO不溢出時轉(zhuǎn)移不溢出時轉(zhuǎn)移OF=0JP, JPE“1”的個數(shù)為偶數(shù)時轉(zhuǎn)移的個數(shù)為偶數(shù)時轉(zhuǎn)移PF=1JNP, JPO“1”的個數(shù)為奇數(shù)時

26、轉(zhuǎn)移的個數(shù)為奇數(shù)時轉(zhuǎn)移PF=03030JNGSkipJMPLabelSkip: 對于對于16位位80X86CPU,條件轉(zhuǎn)移指令的轉(zhuǎn)移范圍在下一條指令地址,條件轉(zhuǎn)移指令的轉(zhuǎn)移范圍在下一條指令地址128127字節(jié)之間。如果轉(zhuǎn)移目的位置超出了上述范圍,匯編時將報告錯誤。字節(jié)之間。如果轉(zhuǎn)移目的位置超出了上述范圍,匯編時將報告錯誤。對于對于32位位80X86CPU,條件轉(zhuǎn)移指令匯編后產(chǎn)生,條件轉(zhuǎn)移指令匯編后產(chǎn)生4字節(jié)機器代碼,前字節(jié)機器代碼,前2字節(jié)是字節(jié)是它的操作碼,后面它的操作碼,后面2字節(jié)是表示轉(zhuǎn)移距離的位移量,可以實現(xiàn)字節(jié)是表示轉(zhuǎn)移距離的位移量,可以實現(xiàn)64KB范圍內(nèi)的范圍內(nèi)的轉(zhuǎn)移。轉(zhuǎn)移。 JG

27、 Label ;如果標(biāo)號;如果標(biāo)號“Label”超出范圍,匯編時將出錯超出范圍,匯編時將出錯可以把上面指令修改為:可以把上面指令修改為: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”分別編制了進行不同處理的指令序列。分別編制了進行不同處理的指令序列。如果條件如果條件“|X|3”成立(為成立(為“真真”),執(zhí)行),執(zhí)行 “Y=3X5”如果條件如果條件“|X|3”不成立(為不成立(為“假假”),執(zhí)行),執(zhí)行Y=6通過在不同的程序之間進行選擇,實現(xiàn)程序的不同功能,通過在不同的程序之間進行選擇,實現(xiàn)程序的不同功能,“選擇選擇結(jié)構(gòu)結(jié)構(gòu)”因此得名。因此得名。 653XY33XX計算分段函數(shù)的值計算分段函數(shù)的值34344.2.1 4.2.1 基本選擇結(jié)構(gòu)基本選擇結(jié)構(gòu)3535C

29、ODESEGMENTASSUMECS: CODESTART:JMPBEGINXDB?; 被測試的數(shù),匯編之前置入被測試的數(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;測試;測試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;跳過程序;跳過程序“EVN”EVN:LEADX, YESMOVAH, 9INT21H;輸出偶數(shù)的相關(guān)信息;輸出偶數(shù)的相關(guān)信息DONE:MOVAX, 4C00HINT21HCODEENDSENDSTART3737TESTX, 1;測試;測試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 ;跳過程序;跳過程序“EVN”EVN:LEA

31、DX, YES;該數(shù)是偶數(shù);該數(shù)是偶數(shù)DONE:MOVAH, 9INT21H;輸出該數(shù)的相關(guān)信息;輸出該數(shù)的相關(guān)信息MOV AX, 4C00H如果兩個如果兩個“平行平行”分支有相同的處理過程,可以把它們分支有相同的處理過程,可以把它們“合并合并” :3838變量變量X取值取值93H,匯編、連接后運行該程序,程序輸出:,匯編、連接后運行該程序,程序輸出:Its a odd number.變量變量X取值取值94H,匯編、連接后運行該程序,程序輸出:,匯編、連接后運行該程序,程序輸出:Its a even number.3939DATASEGMENTPROMPT DB 0DH, 0AH, “ Inp

32、ut a lowercase letter: $”;提示提示ERR_MSG DB 0DH, 0AH, “ Input error . $”;輸入錯誤警告;輸入錯誤警告BUFDB 0DH, 0AH, Prev: ;輸出緩沖區(qū);輸出緩沖區(qū)PREVDB 20HDB 0DH, 0AH, Succ: SUCCDB 20HDB 0DH, 0AH, $DATAENDSCODESEGMENTASSUMECS: CODE, DS: DATA例例4-3 從鍵盤上輸入一個小寫字母,顯示該字母的前導(dǎo)和后繼。從鍵盤上輸入一個小寫字母,顯示該字母的前導(dǎo)和后繼。4040START:MOV AX, DATAMOV DS, A

33、XINPUT:LEADX, PROMPTMOV AH, 9INT21H;輸出提示信息;輸出提示信息MOV AH, 1INT21H;輸入一個字符;輸入一個字符CMP AL, a;輸入正確性檢查;輸入正確性檢查JBERRORCMP AL, zJAERRORMOV BL, AL;計算;計算“前導(dǎo)前導(dǎo)”字母字母DECBL4141CMP BL, aJBSKIP1;“前導(dǎo)前導(dǎo)”非字母,跳過非字母,跳過MOV PREV, BL;保存;保存“前導(dǎo)前導(dǎo)”字母字母SKIP1:INCAL;計算;計算“后繼后繼”字母字母CMP AL, zJASKIP2;“后繼后繼”非字母,跳過非字母,跳過MOV SUCC, AL;“

34、后繼后繼”為字母,保存為字母,保存SKIP2:LEA DX, BUF;輸出;輸出“前導(dǎo)前導(dǎo)”和和“后繼后繼”字母字母MOV AH, 09HINT21HJMPEXIT;跳過出錯處理程序;跳過出錯處理程序4242ERROR:LEA DX, ERR-MSG;顯示出錯信息;顯示出錯信息MOV AH, 09HINT21HJMPINPUT;要求重新輸入;要求重新輸入EXIT:MOVAX, 4C00H;返回;返回OSINT21HCODEENDSENDSTART健壯性健壯性預(yù)設(shè)結(jié)果預(yù)設(shè)結(jié)果程序要點程序要點:4343例例4-4 計算分段函數(shù)計算分段函數(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;從鍵盤上輸入;從鍵盤上輸入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;輸出計算結(jié)果;輸出計算結(jié)果CALL CRLF;輸出回車換行;輸出回車換行EXIT:MOV AX, 4C00HINT 21HCODEENDSEND START4646復(fù)合邏輯表達式的分解復(fù)合邏輯表達式的分解47474.2.2 4.2.2 單分支選擇結(jié)構(gòu)單分支選擇結(jié)構(gòu) 如果選擇結(jié)構(gòu)的一個分支為如果選擇結(jié)構(gòu)的一個分支為“空空”,這樣的程序流程稱為,這樣的程序流程稱為“單分支選擇結(jié)構(gòu)單分支選擇結(jié)構(gòu)”。合理地選擇合理地選擇Jcc

37、指令所使用的條件,可以使程序更加流暢。指令所使用的條件,可以使程序更加流暢。 可以把一些基本選擇結(jié)構(gòu)程序改寫為單分支選擇結(jié)構(gòu)??梢园岩恍┗具x擇結(jié)構(gòu)程序改寫為單分支選擇結(jié)構(gòu)。 4848例例4-4為例,可以將為例,可以將Y“預(yù)設(shè)預(yù)設(shè)”為為6,一旦條件,一旦條件|X|3成立,立即轉(zhuǎn)成立,立即轉(zhuǎn)向向OUTPUT輸出輸出“預(yù)設(shè)預(yù)設(shè)”的結(jié)果,否則進行相應(yīng)的計算。的結(jié)果,否則進行相應(yīng)的計算。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;輸出計算結(jié)果;輸出計算結(jié)果5050例例4-5 將將4位二進制轉(zhuǎn)換成對應(yīng)的十六進制字符位二進制轉(zhuǎn)換成對應(yīng)的十六進制字符 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)一個分支的程序中又出現(xiàn)了選擇結(jié)構(gòu),這樣的選擇結(jié)構(gòu)一個分支的程序中又出現(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)排除法:每次判斷排除若干可能,留下一種可能情況進行處理;排除法:每次判斷排除若干可能,留下一種可能情況進行處理;確認法:每次判斷確認一種可能,對已確認的情況進行處理。確認法:每次判斷確認一種可能,對已確認的情況進行處理。

40、5252;方法;方法a,逐項排除,逐項排除 CMPX, 0 JGEUN_MINUSMINUS: MOVY, -1 JMPDONEUN_MINUS: JEZERO MOVY, 1 JMPDONEZERO: MOVY, 0DONE:;方法;方法b,逐項確認,逐項確認 CMPX, 0 JGPLUS JEZEROMINUS: MOVY, -1 JMPDONEPLUS: MOVY, 1 JMPDONEZERO: MOVY, 0DONE:例例4-6 計算計算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、程序塊多于兩個,這樣在選擇結(jié)構(gòu)程序里,如果可供選擇的程序塊多于兩個,這樣的結(jié)構(gòu)稱為多分支選擇結(jié)構(gòu),如下圖的結(jié)構(gòu)稱為多分支選擇結(jié)構(gòu),如下圖 (a)所示,下圖所示,下圖 (b)是匯是匯編語言程序的實現(xiàn)方法。編語言程序的實現(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 從鍵盤上輸入數(shù)字從鍵盤上輸入數(shù)字“1”到到“3”,根據(jù)輸入選擇對應(yīng)程,根據(jù)輸入選擇對應(yīng)程序序 塊執(zhí)行。塊執(zhí)行。5656INPUT:LEA DX, PROMPTMOV AH, 9INT21H;輸出提示信息;輸出提示信息MOV AH, 1INT21H;輸入一個數(shù)字;輸入一個數(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ù)輸入,計算出該功能程序塊入口地址在表中的位置,通過存儲器間接計算出該功能程序

44、塊入口地址在表中的位置,通過存儲器間接轉(zhuǎn)移轉(zhuǎn)入對應(yīng)位置執(zhí)行。轉(zhuǎn)移轉(zhuǎn)入對應(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;輸入一個數(shù)字;輸入一個數(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)移到對應(yīng)程序塊;間接尋址,轉(zhuǎn)移到對應(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 計數(shù)循環(huán)計數(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、用有限長度的程序,它使得一組指令重復(fù)地執(zhí)行,可以用有限長度的程序完成大量的處理任務(wù),幾乎所有的應(yīng)用程序中都離不開循環(huán)結(jié)構(gòu)。完成大量的處理任務(wù),幾乎所有的應(yīng)用程序中都離不開循環(huán)結(jié)構(gòu)。循環(huán)一般由以下循環(huán)一般由以下4個部分組成:個部分組成:(1)初始化部分初始化部分:為循環(huán)做準(zhǔn)備,如累加器清零,設(shè)置地址指:為循環(huán)做準(zhǔn)備,如累加器清零,設(shè)置地址指針和計數(shù)器的初始值等。針和計數(shù)器的初始值等。(2)工作部分工作部分:實現(xiàn)循環(huán)的基本操作,也就是需要重復(fù)執(zhí)行的:實現(xiàn)循環(huán)的基本操作,也就是需要重復(fù)執(zhí)行的一段程序。一段程序。(3)修改部分修改部分:修改指針、計數(shù)器的值,為下一次循環(huán)做準(zhǔn)備。:修改指針、計數(shù)器的值,

48、為下一次循環(huán)做準(zhǔn)備。(4)控制部分控制部分:判斷循環(huán)條件,結(jié)束循環(huán)或繼續(xù)循環(huán)。:判斷循環(huán)條件,結(jié)束循環(huán)或繼續(xù)循環(huán)。6464計數(shù)循環(huán)計數(shù)循環(huán):循環(huán)的次數(shù)事先已經(jīng)知道,用一個變量(寄存器或存儲器單元)記錄循環(huán)的循環(huán)的次數(shù)事先已經(jīng)知道,用一個變量(寄存器或存儲器單元)記錄循環(huán)的次數(shù)(稱為次數(shù)(稱為“循環(huán)計數(shù)循環(huán)計數(shù) 器器”)。進行減法計數(shù)時,循環(huán)計數(shù)器的初值直接設(shè))。進行減法計數(shù)時,循環(huán)計數(shù)器的初值直接設(shè)為循環(huán)次數(shù),每循環(huán)一次將計數(shù)器減為循環(huán)次數(shù),每循環(huán)一次將計數(shù)器減1,計數(shù)器減為,計數(shù)器減為0時,循環(huán)結(jié)束。時,循環(huán)結(jié)束。條件循環(huán)條件循環(huán):循環(huán)的次數(shù)事先并不確定,每次循環(huán)開始前或結(jié)束后測試某個條件,

49、根據(jù)這循環(huán)的次數(shù)事先并不確定,每次循環(huán)開始前或結(jié)束后測試某個條件,根據(jù)這個條件是否滿足來決定是否繼續(xù)下一次循環(huán)。個條件是否滿足來決定是否繼續(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):進入循環(huán)后,先判斷循環(huán)結(jié)束條件,條件滿足則退出循環(huán),循進入循環(huán)后,先判斷循環(huán)結(jié)束條件,條件滿足則退出循環(huán),循環(huán)次數(shù)最少為環(huán)次數(shù)最少為0次。次。DO-WHILEDO-WHILE循環(huán)循環(huán):進入循環(huán)后,先執(zhí)行工作部分,然后判斷循環(huán)繼續(xù)的

50、條件,條進入循環(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)指令采用相對尋址方式,循環(huán)指令采用相對尋址方式,Label距離循環(huán)指令的下一條指距離循

51、環(huán)指令的下一條指令必須在令必須在-128+127B之內(nèi)。之內(nèi)。6868 LOOPZ/LOOPE,LOOPNZ/LOOPNE指令的功能也可以由指令的功能也可以由Jcc指令實現(xiàn)。指令實現(xiàn)。 由于對由于對CX先減先減1,后判斷,如果,后判斷,如果CX的初值為的初值為0,將循環(huán),將循環(huán)65536次。次。 循環(huán)指令的執(zhí)行不影響標(biāo)志位。循環(huán)指令的執(zhí)行不影響標(biāo)志位。LOOP指令的功能可以用指令的功能可以用Jcc指令實現(xiàn):指令實現(xiàn):DECCX; CXCX-1JNZLabel ; 若若(CX)0(也就是(也就是ZF=0),轉(zhuǎn)移到),轉(zhuǎn)移到Label6969 計數(shù)循環(huán)是基本的循環(huán)組織方式,用循環(huán)計數(shù)器的值來控制計

52、數(shù)循環(huán)是基本的循環(huán)組織方式,用循環(huán)計數(shù)器的值來控制循環(huán),有時候也可以結(jié)合其它條件共同控制。循環(huán),有時候也可以結(jié)合其它條件共同控制。4.3.2 4.3.2 計數(shù)循環(huán)計數(shù)循環(huán)例例4-8 從鍵盤上輸入一個字符串(不超過從鍵盤上輸入一個字符串(不超過80個字符),將它個字符),將它逆序后輸出。逆序后輸出。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; 輸入字符個數(shù)送輸入字符個數(shù)送CX(循環(huán)次數(shù))(循環(huán)次數(shù))7171ADDBX, CXINCBX; 計算字符串末地址送計算字符串末地址送BX(指針)(指針)DISP: MOV DL, BXMOV AH, 02HINT21H; 逆序輸出一個字符逆序輸出一個字符DECBX; 修改指針修改指

54、針LOOPDISP; 計數(shù)循環(huán)計數(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 從鍵盤上輸入一個十進制無符號整數(shù),將它用十六進從鍵盤上輸入一個十進制無符號整數(shù),將它用十六進制格式輸出。制格式輸出。7373 LEADX, MESS1CALL READDEC; 輸入一個十進制無符號數(shù)輸入一個十進制無符號數(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)換成十六進制字符的轉(zhuǎn)換成十六進制字符的ASCII代碼代碼MOV DL, ALMOV AH, 2 INT21H; 輸出一個十六進制字符輸出一個十六進制字符POPCXLOOPONE; 計數(shù)循環(huán)計數(shù)循環(huán)CALL CRLF; 輸出回車換行輸出回車換行, 結(jié)束本行結(jié)束本行MOV AX, 4C00HINT21HCODEENDSENDSTART7575 用總分減去最高分、最低分,最后除以用總分減去最高分、最低分,最后除以5,得到需要的成績。,得到需要的成績。 求求N個數(shù)據(jù)中最大值的方法:個數(shù)據(jù)中最大值的方法:預(yù)設(shè)

57、一個預(yù)設(shè)一個“最大值最大值”,取出一個數(shù)據(jù)與這個取出一個數(shù)據(jù)與這個“最大值最大值”進行比較,進行比較, 如果數(shù)據(jù)大于如果數(shù)據(jù)大于“最大值最大值”,則將該數(shù)據(jù)作為新的,則將該數(shù)據(jù)作為新的“最大最大值值”。進行進行N次比較之后留下的就是這次比較之后留下的就是這N個數(shù)據(jù)的最大值。個數(shù)據(jù)的最大值。 預(yù)設(shè)的預(yù)設(shè)的“最大值最大值”的初值可以從的初值可以從N個數(shù)據(jù)中任取一個,也可以個數(shù)據(jù)中任取一個,也可以根根據(jù)數(shù)據(jù)的范圍,取一個該范圍內(nèi)的最小的數(shù)。據(jù)數(shù)據(jù)的范圍,取一個該范圍內(nèi)的最小的數(shù)。 計算最小值的方法與此類似。計算最小值的方法與此類似。例例4-10 從鍵盤上輸入七名裁判的評分(從鍵盤上輸入七名裁判的評分

58、(010),扣除一個最),扣除一個最高分,一個最低分,計算出其它五項評分的平均值(保留高分,一個最低分,計算出其它五項評分的平均值(保留一位小數(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)計數(shù)器,初值循環(huán)計數(shù)器,初值7ONE: LEADX, MESS1CALL READDEC; 鍵盤輸入一個分數(shù)鍵盤輸入一個分數(shù)ADDSUM, AL; 累加累加CMP MAX, AL; 與與“最大值最大值”比較比較JAL1MOV MAX, AL; 大于大于“最大值最大值”則保留則保留L1:CMP MIN, AL; 與與“最小值最小值”比較比較JBL2MOV MIN, AL; 小于小于“最小值最小值”則

60、保留則保留L2:LOOPONE; 計數(shù)循環(huán)計數(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ù)點輸出小數(shù)點POPAX; 從堆棧彈出余數(shù)從堆棧彈出余數(shù)SHLAH, 1 ; 計算小數(shù)部

溫馨提示

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

評論

0/150

提交評論