第4章 選擇與循環(huán)_第1頁(yè)
第4章 選擇與循環(huán)_第2頁(yè)
第4章 選擇與循環(huán)_第3頁(yè)
第4章 選擇與循環(huán)_第4頁(yè)
第4章 選擇與循環(huán)_第5頁(yè)
已閱讀5頁(yè),還剩64頁(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、14.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)程序2指令指令 3指令指令 2順序結(jié)構(gòu)順序結(jié)構(gòu) 入口入口指令指令 1 出口出口分支結(jié)構(gòu)分支結(jié)構(gòu)入口入口滿足滿足條件條件? 分支分支 1 出口出口YN 分支分支 2循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu)入口入口 指令指令 修改條件修改條件條件滿足否?條件滿足否?Y 出口出口N結(jié)構(gòu)化程序設(shè)計(jì)的結(jié)構(gòu)化程序設(shè)計(jì)的“基本結(jié)構(gòu)基本結(jié)構(gòu)”3IPCSn指令存放在內(nèi)存中指令存放在內(nèi)存中,處理器從內(nèi)存取指令分析執(zhí)行處理器從內(nèi)存取指令分析執(zhí)行n處理器用處理器用CS:IP計(jì)算下一條要執(zhí)行的指令在內(nèi)存的物理地址計(jì)算下一

2、條要執(zhí)行的指令在內(nèi)存的物理地址 PA=CS*16+IPn指令一般是從前到后順序執(zhí)行的指令一般是從前到后順序執(zhí)行的CPU執(zhí)行當(dāng)前指令時(shí),執(zhí)行當(dāng)前指令時(shí),IP被更改為被更改為下一條指令下一條指令的地址的地址CS和和IP不能用不能用MOV等傳送指令直接修改等傳送指令直接修改nCPU通過(guò)執(zhí)行通過(guò)執(zhí)行轉(zhuǎn)移控制類指令轉(zhuǎn)移控制類指令改變它們的值,從而改變指令改變它們的值,從而改變指令的順序執(zhí)行。的順序執(zhí)行。回顧:回顧:8086/8088CPU專用寄存器專用寄存器下一條指令的段地址下一條指令的段地址下一條指令的偏移地址下一條指令的偏移地址44.1.1 4.1.1 無(wú)條件轉(zhuǎn)移指令無(wú)條件轉(zhuǎn)移指令4.1.2 4.1

3、.2 比較和測(cè)試指令比較和測(cè)試指令 4.1.3 4.1.3 條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令 54.1.1 無(wú)條件轉(zhuǎn)移指令無(wú)條件轉(zhuǎn)移指令n轉(zhuǎn)到轉(zhuǎn)到label指定的目標(biāo)地址處,執(zhí)行那里的指令指定的目標(biāo)地址處,執(zhí)行那里的指令n目的地址目的地址label的位置有的位置有2種情形:種情形:n和和JMP指令在同一個(gè)段,叫做指令在同一個(gè)段,叫做段內(nèi)轉(zhuǎn)移,段內(nèi)轉(zhuǎn)移,轉(zhuǎn)移時(shí)轉(zhuǎn)移時(shí) CPU只只改變改變IP;n和和JMP指令不在同一個(gè)段,叫做指令不在同一個(gè)段,叫做段間轉(zhuǎn)移,段間轉(zhuǎn)移,轉(zhuǎn)移時(shí)轉(zhuǎn)移時(shí)CPU既要更改既要更改IP又要更改又要更改CS,n目的地址目的地址label有兩種表示方式:有兩種表示方式:nlabel是目標(biāo)地

4、址處指令的標(biāo)號(hào),叫做是目標(biāo)地址處指令的標(biāo)號(hào),叫做直接尋址直接尋址nlabel是寄存器或內(nèi)存單元,跳轉(zhuǎn)目的地址在寄存器或內(nèi)是寄存器或內(nèi)存單元,跳轉(zhuǎn)目的地址在寄存器或內(nèi)存中,叫做存中,叫做間接尋址間接尋址JMP labelJMP label 段內(nèi)轉(zhuǎn)移、直接尋址段內(nèi)轉(zhuǎn)移、直接尋址 段內(nèi)轉(zhuǎn)移、間接尋址段內(nèi)轉(zhuǎn)移、間接尋址 段間轉(zhuǎn)移、直接尋址段間轉(zhuǎn)移、直接尋址 段間轉(zhuǎn)移、間接尋址段間轉(zhuǎn)移、間接尋址6段內(nèi)轉(zhuǎn)移、直接尋址段內(nèi)轉(zhuǎn)移、直接尋址JMP labelJMP labelcode1 segment jmp again ;轉(zhuǎn)到;轉(zhuǎn)到again處執(zhí)行處執(zhí)行again: dec cx ;again處的指令處的指令

5、code1 ends執(zhí)行執(zhí)行JMP指令時(shí):指令時(shí):CS的內(nèi)容不變,將以的內(nèi)容不變,將以again為標(biāo)號(hào)的指令的偏移地址裝入為標(biāo)號(hào)的指令的偏移地址裝入IP。7段內(nèi)轉(zhuǎn)移、間接尋址段內(nèi)轉(zhuǎn)移、間接尋址JMP r16/m16 JMP r16/m16 n將將1616位寄存器或內(nèi)存字單元內(nèi)容位寄存器或內(nèi)存字單元內(nèi)容IPIP寄存器,寄存器,CSCS內(nèi)容保持不變。內(nèi)容保持不變。例例1:假設(shè)假設(shè)AX存放了段內(nèi)某條指令的偏移地址,則存放了段內(nèi)某條指令的偏移地址,則 jmp ax ;IPAX例例2:假設(shè):假設(shè)DS:2000H存放了某條指令的偏移地址,則存放了某條指令的偏移地址,則 jmp word ptr 2000h

6、 ;IPDS:2000hcode1 segmentlea ax,again jmp ax ;轉(zhuǎn)到;轉(zhuǎn)到again處執(zhí)行處執(zhí)行again: dec cx ;again處的指令處的指令code1 ends81)JMP ONE;近程直接轉(zhuǎn)移;近程直接轉(zhuǎn)移假設(shè)假設(shè)ONE是程序中某條指令的標(biāo)號(hào),是程序中某條指令的標(biāo)號(hào),并且并且已在數(shù)據(jù)段定義字變量已在數(shù)據(jù)段定義字變量“TARGET”如下如下 :TAEGETDW ONE下面四種方法都可以實(shí)現(xiàn)同一個(gè)代碼段中向標(biāo)號(hào)下面四種方法都可以實(shí)現(xiàn)同一個(gè)代碼段中向標(biāo)號(hào)“ONE”的跳轉(zhuǎn):的跳轉(zhuǎn):段內(nèi)轉(zhuǎn)移舉例段內(nèi)轉(zhuǎn)移舉例2)LEA DX, ONE JMP DX;寄存器間接段內(nèi)

7、轉(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)移9段間轉(zhuǎn)移、直接尋址段間轉(zhuǎn)移、直接尋址JMP far ptr labelJMP far ptr label;IPlabelIPlabel的偏移地址的偏移地址;CSlabelCSlabel的段地址的段地址n將標(biāo)號(hào)所在段的段地址將標(biāo)號(hào)所在段的段地址CS,標(biāo)號(hào)處指令的偏移地址,標(biāo)號(hào)處指令的偏移地址IP;CPU轉(zhuǎn)移到指定代碼段標(biāo)號(hào)處執(zhí)行轉(zhuǎn)移到指定代碼段標(biāo)號(hào)處執(zhí)行code1 segment assume cs:co

8、de1 start:mov ax,20 mov bx,10 add ax,bx jmp far ptr exitcode1 endscode2 segment assume cs:code2 exit:mov ax,4c00h int 21hcode2 ends end start10段間轉(zhuǎn)移、間接尋址段間轉(zhuǎn)移、間接尋址JMP far ptr memJMP far ptr mem;IPmemIPmem,CSmem+2CSmem+2n用一個(gè)雙字存儲(chǔ)單元存儲(chǔ)要跳轉(zhuǎn)的目標(biāo)地用一個(gè)雙字存儲(chǔ)單元存儲(chǔ)要跳轉(zhuǎn)的目標(biāo)地址。低位字送址。低位字送IPIP,高位字送,高位字送CSCS例如:例如: 讓處理器轉(zhuǎn)移到讓處

9、理器轉(zhuǎn)移到1500h:0取指令執(zhí)行取指令執(zhí)行mov word ptr bx,0mov word ptr bx+2,1500hJMP far ptr bx111)JMP FAR PTR TWO;遠(yuǎn)程直接轉(zhuǎn)移;遠(yuǎn)程直接轉(zhuǎn)移假設(shè)假設(shè)TWO是程序中一個(gè)代碼段中的某條指令的標(biāo)號(hào),是程序中一個(gè)代碼段中的某條指令的標(biāo)號(hào),并且已在數(shù)據(jù)段定義雙字變量并且已在數(shù)據(jù)段定義雙字變量“FAR_TGT”如下:如下:FAR_TGTDDTWO下面三組指令都可以實(shí)現(xiàn)向遠(yuǎn)程標(biāo)號(hào)下面三組指令都可以實(shí)現(xiàn)向遠(yuǎn)程標(biāo)號(hào)“TWO”的轉(zhuǎn)移:的轉(zhuǎn)移:2)LEA BX, FAR_TGT JMP DWORD PTRBX;遠(yuǎn)程間接轉(zhuǎn)移;遠(yuǎn)程間接轉(zhuǎn)移3

10、)JMP FAR_TGT;遠(yuǎn)程間接轉(zhuǎn)移;遠(yuǎn)程間接轉(zhuǎn)移12目標(biāo)地址的范圍目標(biāo)地址的范圍n段內(nèi)轉(zhuǎn)移:不更改段內(nèi)轉(zhuǎn)移:不更改CS,只改變只改變IP,又分:,又分:l短轉(zhuǎn)移(短轉(zhuǎn)移(short):轉(zhuǎn)移范圍在段內(nèi)):轉(zhuǎn)移范圍在段內(nèi)128127字節(jié)字節(jié)l近轉(zhuǎn)移(近轉(zhuǎn)移(near):在當(dāng)前代碼段):在當(dāng)前代碼段64KB范圍內(nèi)轉(zhuǎn)移范圍內(nèi)轉(zhuǎn)移n段間轉(zhuǎn)移段間轉(zhuǎn)移遠(yuǎn)轉(zhuǎn)移(遠(yuǎn)轉(zhuǎn)移(far)n更改更改CS和和IPn從當(dāng)前代碼段跳到另一個(gè)代碼段,可以在從當(dāng)前代碼段跳到另一個(gè)代碼段,可以在1MB范圍跳轉(zhuǎn)范圍跳轉(zhuǎn)n目標(biāo)地址是雙字目標(biāo)地址是雙字(16位偏移地址和位偏移地址和16位段地址位段地址),叫做,叫做32位遠(yuǎn)指針位遠(yuǎn)指針

11、代碼段代碼段代碼段代碼段 實(shí)際編程時(shí),匯編程序會(huì)根據(jù)目標(biāo)地址的距實(shí)際編程時(shí),匯編程序會(huì)根據(jù)目標(biāo)地址的距離,離,自動(dòng)處理自動(dòng)處理成短轉(zhuǎn)移、近轉(zhuǎn)移或遠(yuǎn)轉(zhuǎn)移成短轉(zhuǎn)移、近轉(zhuǎn)移或遠(yuǎn)轉(zhuǎn)移 程序員可用操作符程序員可用操作符short、near ptr 或或far ptr 強(qiáng)制指明或改變轉(zhuǎn)移的屬性強(qiáng)制指明或改變轉(zhuǎn)移的屬性最常用格式:最常用格式:JMP 語(yǔ)句標(biāo)號(hào)語(yǔ)句標(biāo)號(hào)代碼段代碼段代碼段代碼段134.1.2 4.1.2 比較和測(cè)試指令比較和測(cè)試指令目的操作數(shù)目的操作數(shù)dest:8位位/16位的寄存器位的寄存器/存儲(chǔ)器操作數(shù)。存儲(chǔ)器操作數(shù)。源操作數(shù)源操作數(shù)src:與:與dest同類型的寄存器同類型的寄存器/存儲(chǔ)器

12、存儲(chǔ)器/立即數(shù)。立即數(shù)。功能功能:運(yùn)算后影響標(biāo)志位,但運(yùn)算后影響標(biāo)志位,但不保留運(yùn)算結(jié)果不保留運(yùn)算結(jié)果。用途:用途:CMP比較兩個(gè)數(shù)的大小關(guān)系,但不改變它們的值。比較兩個(gè)數(shù)的大小關(guān)系,但不改變它們的值。AX?=BXTEST 判斷目的操作數(shù)中個(gè)別二進(jìn)制位,但不改變它的值。判斷目的操作數(shù)中個(gè)別二進(jìn)制位,但不改變它的值。判斷一個(gè)數(shù)的奇偶性判斷一個(gè)數(shù)的奇偶性指令操作碼指令操作碼指令格式指令格式功能描述功能描述CMPCMP dest, src(dest) (src),不存結(jié)果,不存結(jié)果TESTTEST dest, src(dest) (src),不存結(jié)果,不存結(jié)果144.1.3 4.1.3 條件轉(zhuǎn)移指令

13、條件轉(zhuǎn)移指令“J”-Jump“xx”是轉(zhuǎn)移的條件是轉(zhuǎn)移的條件“l(fā)abel”只能只能為目標(biāo)指令的標(biāo)為目標(biāo)指令的標(biāo)號(hào)。號(hào)。都屬于段內(nèi)短轉(zhuǎn)移。都屬于段內(nèi)短轉(zhuǎn)移。Jxxlabel操作碼助記符操作碼助記符條件條件指令功能指令功能JZ/JEZF=1相等或?yàn)橄嗟然驗(yàn)?轉(zhuǎn)移轉(zhuǎn)移JNZ/JNEZF=0不相等或不為不相等或不為0轉(zhuǎn)移轉(zhuǎn)移JSSF=1結(jié)果是負(fù)數(shù),則轉(zhuǎn)移結(jié)果是負(fù)數(shù),則轉(zhuǎn)移JNSSF=0結(jié)果不是負(fù)數(shù),則轉(zhuǎn)移結(jié)果不是負(fù)數(shù),則轉(zhuǎn)移JOOF=1結(jié)果溢出,則轉(zhuǎn)移結(jié)果溢出,則轉(zhuǎn)移JNOOF=0結(jié)果沒(méi)有溢出,則轉(zhuǎn)移結(jié)果沒(méi)有溢出,則轉(zhuǎn)移JP/JPEPF=1低位字節(jié)有偶數(shù)個(gè)低位字節(jié)有偶數(shù)個(gè)1,則轉(zhuǎn)移,則轉(zhuǎn)移JNP/JP

14、OPF=0低位字節(jié)有奇數(shù)個(gè)低位字節(jié)有奇數(shù)個(gè)1,則轉(zhuǎn)移,則轉(zhuǎn)移JB/JNAE/JCCF=1有進(jìn)借位或,則轉(zhuǎn)移有進(jìn)借位或,則轉(zhuǎn)移JAE/JNB/JNCCF=0無(wú)進(jìn)借位或無(wú)進(jìn)借位或,則轉(zhuǎn)移,則轉(zhuǎn)移JBE/JNACF=1或或ZF=1,則轉(zhuǎn)移,則轉(zhuǎn)移JA/JNBECF=0且且ZF=0,則轉(zhuǎn)移,則轉(zhuǎn)移JL/JNGESFOF,則轉(zhuǎn)移,則轉(zhuǎn)移JGE/JNLSF=OF,則轉(zhuǎn)移,則轉(zhuǎn)移JLE/JNGSFOF或或ZF=1 ,則轉(zhuǎn)移,則轉(zhuǎn)移JG/JNLESF=OF且且ZF=0 ,則轉(zhuǎn)移,則轉(zhuǎn)移JCXZCX=0CX=0,則轉(zhuǎn)移則轉(zhuǎn)移15(1)根據(jù)兩個(gè)有符號(hào)數(shù)比較結(jié)果的條件轉(zhuǎn)移指令)根據(jù)兩個(gè)有符號(hào)數(shù)比較結(jié)果的條件轉(zhuǎn)移指令

15、兩個(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,否,否)指令助記符指令助記符 指令功能指令功能轉(zhuǎn)移條件轉(zhuǎn)移條件JG, JNLE大于(不小于等于)時(shí)轉(zhuǎn)移大于(不小于等于)時(shí)轉(zhuǎn)移OFSF= 0且且ZF=0JGE, JNL大于等于(不小于)時(shí)轉(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)移小

16、于(不大于等于)時(shí)轉(zhuǎn)移OFSF= 1JLE, JNG小于等于(不大于)時(shí)轉(zhuǎn)移小于等于(不大于)時(shí)轉(zhuǎn)移OFSF= 1或或ZF=116(2)根據(jù)兩個(gè)無(wú)符號(hào)數(shù)比較結(jié)果的條件轉(zhuǎn)移指令)根據(jù)兩個(gè)無(wú)符號(hào)數(shù)比較結(jié)果的條件轉(zhuǎn)移指令 兩個(gè)無(wú)符號(hào)數(shù)的比較結(jié)果通過(guò)兩個(gè)無(wú)符號(hào)數(shù)的比較結(jié)果通過(guò)CF,ZF反映出來(lái)。反映出來(lái)。 A(Above,高于),高于) B(Below,低于),低于) E(Equal,等于),等于)指令助記符指令助記符指令功能指令功能轉(zhuǎn)移條件轉(zhuǎn)移條件JA, JNBE高于(不低于等于)時(shí)轉(zhuǎn)移高于(不低于等于)時(shí)轉(zhuǎn)移CF= 0且且ZF=0JAE, JNB, JNC高于等于(不低于)時(shí)轉(zhuǎn)移高于等于(不低于)

17、時(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=117(3)根據(jù)單個(gè)標(biāo)志位的條件轉(zhuǎn)移指令)根據(jù)單個(gè)標(biāo)志位的條件轉(zhuǎn)移指令 JS和和JNS: 利用符號(hào)標(biāo)志利用符號(hào)標(biāo)志SF,判斷結(jié)果是正是負(fù),判斷結(jié)果是正是負(fù) JO和和JNO: 利用溢出標(biāo)志利用溢出標(biāo)志OF,判斷結(jié)果是否產(chǎn)生溢出,判斷結(jié)果是否產(chǎn)生溢出 JP/JPE和和JNP/JPO: 利用奇偶標(biāo)

18、志利用奇偶標(biāo)志PF,判斷結(jié)果中,判斷結(jié)果中“1”的個(gè)數(shù)的個(gè)數(shù) JC/JB/JNAE和和JNC/JNB/JAE: 利用進(jìn)位標(biāo)志利用進(jìn)位標(biāo)志CF,判斷結(jié)果是否進(jìn)位或借位,判斷結(jié)果是否進(jìn)位或借位 JZ/JE和和JNZ/JNE: 利用零標(biāo)志利用零標(biāo)志ZF,判斷結(jié)果是否為零(或相等),判斷結(jié)果是否為零(或相等)18JCXZ Label ;若;若CX=0,轉(zhuǎn)移到,轉(zhuǎn)移到Label(4)根據(jù))根據(jù)CX寄存器值的條件轉(zhuǎn)移指令寄存器值的條件轉(zhuǎn)移指令19JNGSkipJMPLabelSkip: 條件轉(zhuǎn)移指令的條件轉(zhuǎn)移指令的轉(zhuǎn)移范圍在以下一條指令地址為中心的轉(zhuǎn)移范圍在以下一條指令地址為中心的128127字節(jié)之間字節(jié)

19、之間。 JG Label ;如果標(biāo)號(hào);如果標(biāo)號(hào)“Label”超出范圍,匯編時(shí)將出錯(cuò)超出范圍,匯編時(shí)將出錯(cuò)如果跳轉(zhuǎn)超出范圍可以把上面指令修改為下面的指令:如果跳轉(zhuǎn)超出范圍可以把上面指令修改為下面的指令:條件轉(zhuǎn)移指令跳轉(zhuǎn)范圍限制條件轉(zhuǎn)移指令跳轉(zhuǎn)范圍限制204.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ù)合選擇結(jié)構(gòu)復(fù)合選擇結(jié)構(gòu)4.2.4 4.2.4 多分支選擇結(jié)構(gòu)多分支選擇結(jié)構(gòu)214.2.1 4.2.1 基本選擇結(jié)構(gòu)基本選擇結(jié)構(gòu)if(條件條件)程序段程序段A;else程序段程序段B;22CODESEGMENTASSUMEC

20、S: CODESTART:JMPBEGINXDB?; 被測(cè)試的數(shù),匯編之前置入被測(cè)試的數(shù),匯編之前置入YESDB0AH, 0DH, “Its a even number.”, 0AH, 0DH, $NODB0AH, 0DH, “Its a odd number.”, 0AH, 0DH, $BEGIN:PUSHCSPOPDSTESTX, 1;測(cè)試;測(cè)試X的最低位,確定是否為偶數(shù)的最低位,確定是否為偶數(shù)JZEVN;ZF=1,該數(shù)是偶數(shù),轉(zhuǎn)向,該數(shù)是偶數(shù),轉(zhuǎn)向“EVN”O(jiān)DD:LEADX, NO;否則,該數(shù)是奇數(shù);否則,該數(shù)是奇數(shù) MOV AH, 9 INT 21HJMPDONE;跳過(guò)偶數(shù)的處理;跳

21、過(guò)偶數(shù)的處理EVN:LEADX, YES MOVAH, 9INT21H;輸出偶數(shù)的相關(guān)信息;輸出偶數(shù)的相關(guān)信息DONE: MOVAX, 4C00HINT21HCODEENDSENDSTART例例4-2 判斷變量判斷變量X的值是否為的值是否為“偶數(shù)偶數(shù)”23CODESEGMENTASSUMECS: CODEXDB?; 被測(cè)試的數(shù),匯編之前置入被測(cè)試的數(shù),匯編之前置入YESDB0AH, 0DH, “Its a even number.”, 0AH, 0DH, $NODB0AH, 0DH, “Its a odd number.”, 0AH, 0DH, $BEGIN:PUSHCSPOPDSTESTX,

22、 1;測(cè)試;測(cè)試X的最低位,確定是否為偶數(shù)的最低位,確定是否為偶數(shù)JZEVN;ZF=1,該數(shù)是偶數(shù),轉(zhuǎn)向,該數(shù)是偶數(shù),轉(zhuǎn)向“EVN”O(jiān)DD:LEADX, NO;否則,該數(shù)是奇數(shù);否則,該數(shù)是奇數(shù)JMPDONE;跳過(guò)偶數(shù)的處理;跳過(guò)偶數(shù)的處理EVN:LEADX, YESDONE: MOVAH, 9INT21H;輸出偶數(shù)的相關(guān)信息;輸出偶數(shù)的相關(guān)信息MOVAX, 4C00HINT21HCODEENDSENDBEGIN例例4-2 判斷變量判斷變量X的值是否為的值是否為“偶數(shù)偶數(shù)”244.2.2 單分支選擇結(jié)構(gòu)單分支選擇結(jié)構(gòu)n合理選用合理選用Jcc指令所使用的轉(zhuǎn)移條件,可以使程序更加簡(jiǎn)潔流暢。指令所使

23、用的轉(zhuǎn)移條件,可以使程序更加簡(jiǎn)潔流暢。例如:當(dāng)求絕對(duì)值時(shí),應(yīng)選用例如:當(dāng)求絕對(duì)值時(shí),應(yīng)選用JGE指令而不用指令而不用JL指令指令(圖圖4-3)25例例: X、Y、Z均為有符號(hào)字節(jié)變量,將均為有符號(hào)字節(jié)變量,將X、Y中絕對(duì)值較中絕對(duì)值較大的數(shù)存入大的數(shù)存入Z。 mov al, x cmp al, 0 jge skip1 neg alskip1: mov bl, y cmp bl, 0 jge skip2 neg blskip2: cmp al, bl jae xtoz mov al, y jmp save xtoz:mov al, x save:mov z, al hlt26例例: 在顯示器以在

24、顯示器以16進(jìn)制形式顯示進(jìn)制形式顯示al中的值。中的值。將一個(gè)將一個(gè)16進(jìn)制數(shù)位(進(jìn)制數(shù)位(0F)調(diào)整為對(duì)應(yīng))調(diào)整為對(duì)應(yīng)ASCII碼的方法:碼的方法:方法方法1(基本選擇):(基本選擇): MOV DL, ? ;015 CMP DL, 9 JA ALPH ADD DL, 30H JMP DONEALPH:ADD DL, 37HDONE: 寫出該例題的源程序片段。寫出該例題的源程序片段。方法方法2(單分支選擇):(單分支選擇): MOV DL, ? ;015 ADD DL, 30H CMP DL, 9 JBE DONE ADD DL, 7DONE:27例例4-6 計(jì)算計(jì)算Y=SGN(X)X0X=

25、0Y=0Y=1YNNY=-1X0X=0Y=0Y=1YYNNY=-1Y(a)(b);方法;方法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 JE ZEROMINUS: MOVY, -1 JMPDONEPLUS: MOVY, 1 JMPDONEZERO: MOVY, 0DONE: 4.2.3 復(fù)合選擇結(jié)構(gòu)復(fù)合選擇結(jié)構(gòu) 1(X0)Y = 0 (X=0) -1(X0) 284

26、.2.4 4.2.4 多分支選擇結(jié)構(gòu)多分支選擇結(jié)構(gòu)CONDITIONF1C1(a)(b)F2F3F1-=C1=C2=C3=CnC2CnF2FnFnYYN-其它處理YNN- 在選擇結(jié)構(gòu)程序里,如果可供選擇的程序塊多于兩個(gè),這樣在選擇結(jié)構(gòu)程序里,如果可供選擇的程序塊多于兩個(gè),這樣的結(jié)構(gòu)稱為的結(jié)構(gòu)稱為多分支選擇結(jié)構(gòu)多分支選擇結(jié)構(gòu),如圖,如圖 (a)所示,圖所示,圖 (b)是剛講過(guò)的復(fù)是剛講過(guò)的復(fù)合選擇結(jié)構(gòu)的實(shí)現(xiàn)方法。合選擇結(jié)構(gòu)的實(shí)現(xiàn)方法。29CODESEGMENTASSUME CS: CODE, DS: DATASTART: MOVAX, DATAMOVDS, AXMOVAX, 4C00HINT21

27、HCODEENDSENDSTART 例例4-7 從鍵盤上輸入數(shù)字從鍵盤上輸入數(shù)字“1”到到“3”,根據(jù)輸入選擇顯示不同的信息。,根據(jù)輸入選擇顯示不同的信息。DATASEGMENTPROMPTDB0DH, 0AH, “Input a number (13): $”MSG1DB0DH, 0AH, “FUNCTION 1 EXECUTED . $”MSG2DB0DH, 0AH, “FUNCTION 2 EXECUTED . $”MSG3DB0DH, 0AH, “FUNCTION 3 EXECUTED . $”DATAENDSC1(b)F1C2CnF2FnYYN-其它處理YNN-30INPUT: LE

28、ADX, PROMPTMOVAH, 9INT21H;輸出提示信息;輸出提示信息MOVAH, 1INT21H;等待從鍵盤輸入一個(gè)數(shù)字;等待從鍵盤輸入一個(gè)數(shù)字CMPAL, 1JBINPUT;是;是“0”或非數(shù)字,重新輸入或非數(shù)字,重新輸入JEF1;數(shù)字;數(shù)字“1”,轉(zhuǎn),轉(zhuǎn)F1CMPAL, 2JEF2;數(shù)字;數(shù)字“2”,轉(zhuǎn),轉(zhuǎn)F2CMPAL, 3JEF3;數(shù)字;數(shù)字“3”,轉(zhuǎn),轉(zhuǎn)F3JMPINPUT;大于;大于“3”,重新輸入,重新輸入F1:LEADX, MSG1;F1程序塊程序塊JMPOUTPUTF2:LEADX, MSG2;F2程序塊程序塊JMPOUTPUTF3:LEADX, MSG3;F3程序

29、塊程序塊JMPOUTPUTOUTPUT:MOV AH, 9INT21HC1(b)F1C2CnF2FnYYN-其它處理YNN-31 把完成各分支的程序塊入口地址放在一張表格中,這個(gè)表叫地把完成各分支的程序塊入口地址放在一張表格中,這個(gè)表叫地址表,根據(jù)輸入,計(jì)算出應(yīng)該執(zhí)行的分支程序塊入口地址址表,根據(jù)輸入,計(jì)算出應(yīng)該執(zhí)行的分支程序塊入口地址在表在表中的中的位置,通過(guò)存儲(chǔ)器間接轉(zhuǎn)移轉(zhuǎn)入對(duì)應(yīng)位置執(zhí)行。位置,通過(guò)存儲(chǔ)器間接轉(zhuǎn)移轉(zhuǎn)入對(duì)應(yīng)位置執(zhí)行。方法方法2:按照流程:按照流程a的方法實(shí)現(xiàn)的方法實(shí)現(xiàn)CONDITIONF1(a)F2F3-=C1=C2=C3=CnFn32CODESEGMENT ASSUMECS

30、: CODE, DS: DATASTART:MOV AX, DATA MOV DS, AXINPUT: LEA DX, PROMPT MOV AH, 9 INT 21H MOV AH, 1 INT 21H CMP AL, 1 JB INPUT CMP AL, 3 JA INPUT SUB AL, 1 MOV AX, 4C00H INT 21HCODEENDSENDSTARTSHLAL, 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:LEADX, MSG1;F1程序塊程序塊JMPO

31、UTPUTF2:LEADX, MSG2;F2程序塊程序塊JMPOUTPUTF3:LEADX, MSG3;F3程序塊程序塊JMP OUTPUTOUTPUT:MOVAH, 9INT21H多分支核心實(shí)現(xiàn)多分支核心實(shí)現(xiàn)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, F

32、2, F3DATAENDS33 3X-5, |x|3 MOV AX, X CMP AX, 3 JG GREATER CMP AX, -3 JL GREATER MOV BX, AX SAL AX, 1 ADD AX, BX SUB AX, 5 JMP SAVEGREATER: MOV AX, 6 SAVE: MOV Y, AX HLT34補(bǔ)充例題:求有符號(hào)字變量補(bǔ)充例題:求有符號(hào)字變量X、Y、Z中的極值。中的極值。(1)將最大值存入)將最大值存入MAX(2)將最大值存入)將最大值存入MAX,最小值存入,最小值存入MIN MOV AX, X MOV BX, Y MOV CX, Z CMP AX,

33、 BX JG GOON XCHG AX, BXGOON: CMP AX, CX JG ISAX MOV MAX, CX JMP EXIT ISAX: MOV MAX, AX EXIT: HLT JL GOOD MOV MAX,AX CMP BX,CX JL BMIN MOV MIN,CX JMP QUIT BMIN: MOV MIN,BX QUIT: JMP EXITGOOD: MOV MIN,BX MOV MAX,CX EXIT: HLT351、統(tǒng)計(jì)成績(jī)數(shù)組中各分?jǐn)?shù)段的人數(shù);、統(tǒng)計(jì)成績(jī)數(shù)組中各分?jǐn)?shù)段的人數(shù);2、從鍵盤輸入一個(gè)字符串,統(tǒng)計(jì)其中數(shù)字字符、字母字、從鍵盤輸入一個(gè)字符串,統(tǒng)計(jì)其中數(shù)字

34、字符、字母字符和其它類型字符的個(gè)數(shù);符和其它類型字符的個(gè)數(shù);3、求有、求有/無(wú)符號(hào)數(shù)組中的最大、最小值。無(wú)符號(hào)數(shù)組中的最大、最小值。練習(xí):練習(xí):364.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)37計(jì)數(shù)循環(huán)計(jì)數(shù)循環(huán):循環(huán)的次數(shù)事先已知循環(huán)的次數(shù)事先已知,用一個(gè)變量(寄存器,用一個(gè)變量(寄存器或存儲(chǔ)器單元)記錄循環(huán)的次數(shù)(稱為或存儲(chǔ)器單元)記錄循環(huán)的次數(shù)(稱為“循環(huán)計(jì)循環(huán)計(jì)數(shù)數(shù)器器”)。)。條件循環(huán)條件循環(huán):循環(huán)的次數(shù)事先并不確定循環(huán)的次數(shù)事先并不確定,每次循環(huán)開始時(shí),每次循環(huán)開始時(shí)

35、或結(jié)束后測(cè)試某個(gè)條件,根據(jù)這個(gè)條件是否滿足或結(jié)束后測(cè)試某個(gè)條件,根據(jù)這個(gè)條件是否滿足來(lái)決定是否繼續(xù)下一次循環(huán)。來(lái)決定是否繼續(xù)下一次循環(huán)。按照循環(huán)結(jié)束的條件,有以下兩類循環(huán):按照循環(huán)結(jié)束的條件,有以下兩類循環(huán):38初始化部分工作部分修改部分控制部分初始化部分工作部分修改部分控制部分YNYN(a) WHILE結(jié)構(gòu)循環(huán)(b) DO-WHILE結(jié)構(gòu)循環(huán)兩種結(jié)構(gòu)的循環(huán):兩種結(jié)構(gòu)的循環(huán):394.3.1 4.3.1 循環(huán)指令循環(huán)指令它們都不影響標(biāo)志位;它們都不影響標(biāo)志位;轉(zhuǎn)移范圍:轉(zhuǎn)移范圍:Label距離距離LOOP指令的下一條指令必須在指令的下一條指令必須在-128+127B之內(nèi)。之內(nèi)。指令操作碼指令操作

36、碼指令格式指令格式功能描述功能描述LOOPLOOP labelCXCX-1,若,若(CX)0,轉(zhuǎn)移,轉(zhuǎn)移到到LabelLOOPZ/LOOPELOOPZ/LOOPE labelCXCX-1,若,若(CX)0且且ZF=1,轉(zhuǎn)移到轉(zhuǎn)移到LabelLOOPNZ/LOOPNELOOPNZ/LOOPNE labelCXCX-1,若,若(CX)0且且ZF=0,轉(zhuǎn)移到轉(zhuǎn)移到LabelLOOP Label 與下面兩條指令功能相近:與下面兩條指令功能相近:DECCX; CXCX-1JNZLabel; 若若(CX)0(也就是(也就是ZF=0),轉(zhuǎn)移到),轉(zhuǎn)移到Label40例例4-8 從鍵盤上輸入一個(gè)字符串(不超過(guò)

37、從鍵盤上輸入一個(gè)字符串(不超過(guò)80個(gè)字符),將它逆序后輸出。個(gè)字符),將它逆序后輸出。4.3.2 計(jì)數(shù)循環(huán)計(jì)數(shù)循環(huán)DATASEGMENT BUFFER DB 81, ?, 81 DUP(?) MESS DB 0AH, 0DH, “Input a string please : $”DATAENDSCODESEGMENTASSUME CS:CODE, DS:DATASTART:MOV AX, DATAMOVDS, AXLEADX, MESSMOVAH, 09HINT21H; 輸出提示信息輸出提示信息MOVAH, 0AHLEADX, BUFFERINT21H; 輸入字符串輸入字符串LEABX, B

38、UFFER; 緩沖區(qū)首地址送緩沖區(qū)首地址送BXMOVCL, BUFFER+1MOVCH, 0; 輸入字符個(gè)數(shù)送輸入字符個(gè)數(shù)送CX(循環(huán)次數(shù))(循環(huán)次數(shù))41JCXZ EXIT ADDBX, CXINCBX; 計(jì)算字符串末地址送計(jì)算字符串末地址送BX(指針)(指針)DISP:MOV DL, BXMOVAH, 02HINT21H; 逆序輸出一個(gè)字符逆序輸出一個(gè)字符DECBX; 修改指針修改指針LOOP DISP; 計(jì)數(shù)循環(huán)計(jì)數(shù)循環(huán)EXIT: MOVAX, 4C00HINT21HCODEENDSENDSTART42例例4-9 在顯示器以十六進(jìn)制形式顯示在顯示器以十六進(jìn)制形式顯示BX寄存器的內(nèi)容寄存器

39、的內(nèi)容 BX是一個(gè)是一個(gè)16位寄存器位寄存器二進(jìn)制二進(jìn)制 1010 1001 0011 1110 用十六進(jìn)顯示時(shí),每用十六進(jìn)顯示時(shí),每4位用一個(gè)字符顯示,共位用一個(gè)字符顯示,共4個(gè)個(gè)其中其中: 0000 0 30H , 1010 A 41H 0001 1 31H , 1011 B 42H 、 、 1001 9 39H , 1111 F 46H?十六進(jìn)制十六進(jìn)制 A 9 3 E 屏幕上的顯示屏幕上的顯示 A 9 3 E 對(duì)應(yīng)的對(duì)應(yīng)的ASCII 41H 39H 33H 45H43例例4-9 算法算法n取出要顯示的某取出要顯示的某4位,轉(zhuǎn)換為對(duì)應(yīng)的位,轉(zhuǎn)換為對(duì)應(yīng)的ASCII碼碼,再調(diào)用再調(diào)用DOS系

40、統(tǒng)功能進(jìn)行顯示。系統(tǒng)功能進(jìn)行顯示。 BX A 9 3 E9 3 E A A 9 3 E 3 E A 9 E A 9 3 44(1) 對(duì)于對(duì)于00001001(09), 先擴(kuò)展成一個(gè)字節(jié),高先擴(kuò)展成一個(gè)字節(jié),高4位清位清0, 加上加上30H后后, 即可得字符即可得字符09對(duì)應(yīng)的對(duì)應(yīng)的ASCII碼。碼。 0000 0001B + 30H= 31H 0000 1001B + 30H=39H 0001B 1 1001B 9 (2) 對(duì)于對(duì)于10101111(AF), 先擴(kuò)展成一個(gè)字節(jié),高先擴(kuò)展成一個(gè)字節(jié),高4位清位清0, 加上加上30H后后, 還要再加上還要再加上07H,才能得到,才能得到AF 對(duì)應(yīng)的

41、對(duì)應(yīng)的ASCII碼碼 0000 1010B+30H+07H = 41H 0000 1111B+30H+07H =46H 1010B A 1111B Fcode SEGMENT ASSUME CS:codestart: MOV BX,1234H MOV CH, 4 ;字符個(gè)數(shù)字符個(gè)數(shù) MOV CL, 4 ;循環(huán)移位次數(shù)循環(huán)移位次數(shù) next: ROL BX, CL ;取顯示位的值取顯示位的值 MOV DL, BL ;保存在保存在DL中中 AND DL, 0FH ;清除高清除高4位位 ADD DL, 30H ;轉(zhuǎn)變?yōu)閿?shù)字的轉(zhuǎn)變?yōu)閿?shù)字的ASCII CMP DL, 39H ;大于大于39H, 則應(yīng)轉(zhuǎn)變

42、則應(yīng)轉(zhuǎn)變 JBE print ;為字母為字母AF的的ASCII ADD DL, 07H print: MOV AH, 2H ;顯示顯示DL中的字符中的字符 INT 21H DEC CH ;顯示結(jié)束?顯示結(jié)束? JNZ next MOV AH, 4CH ;返回返回DOS INT 21Hcode ENDS END start顯示字符個(gè)數(shù)顯示字符個(gè)數(shù)CH=4循環(huán)移位次數(shù)循環(huán)移位次數(shù)CL=4BX循環(huán)左移循環(huán)左移4位,將要顯示的值位,將要顯示的值移至低移至低4位,保存在位,保存在DL中中清清DL 的高的高4位,位,只保留要顯示位的值只保留要顯示位的值DL DL+30H完成數(shù)值完成數(shù)值09的的ASCII碼

43、轉(zhuǎn)換碼轉(zhuǎn)換YNDLDL+07H完成數(shù)值完成數(shù)值A(chǔ)F的的ASCII碼轉(zhuǎn)換碼轉(zhuǎn)換用用02功能顯示功能顯示DL中的字符中的字符YN返回返回DOSDL 超出超出39H?CH CH-1轉(zhuǎn)換結(jié)束?轉(zhuǎn)換結(jié)束?開始開始例例4-9 程序程序計(jì)數(shù)控制法46思考思考n例例4-9采用的是大寫字母采用的是大寫字母AF進(jìn)行顯示,進(jìn)行顯示,若采用小寫字符若采用小寫字符a f 進(jìn)行顯示,程序如進(jìn)行顯示,程序如何改寫?何改寫?1010 0011 1001 1110 A39E 或或 a39en小寫小寫a f的的ASCII碼在碼在616FH,比,比大寫字大寫字母母AF的的ACII碼多碼多20H,判斷是字母的,判斷是字母的數(shù)字后,數(shù)

44、字后,加加27H即可即可。n也可以用查表的方法形成十六進(jìn)制數(shù)位的也可以用查表的方法形成十六進(jìn)制數(shù)位的ASCII碼。碼。(參見(jiàn)教材例參見(jiàn)教材例4.9)47DATASEGMENTSTRING DB “A string for testing . ”, 0LENGTH DW ?DATAENDS例例4-10 字符串字符串STRING以代碼以代碼0結(jié)束,求它的長(zhǎng)度(字符個(gè)數(shù))。結(jié)束,求它的長(zhǎng)度(字符個(gè)數(shù))。4.3.3 條件循環(huán)條件循環(huán)CODESEGMENTASSUME CS: CODE, DS: DATASTART:MOV AX, DATAMOV DS, AXLEASI, STRING;裝載字符串指針;

45、裝載字符串指針MOVCX, 0;設(shè)置計(jì)數(shù)器初值;設(shè)置計(jì)數(shù)器初值TST:CMPBYTE PTR SI, 0;比較;比較JEDONE;字符串結(jié)束;字符串結(jié)束,轉(zhuǎn)向轉(zhuǎn)向DONE保存結(jié)果保存結(jié)果INCSI;修改指針;修改指針I(yè)NCCX ;計(jì)數(shù);計(jì)數(shù)JMPTST;轉(zhuǎn)向;轉(zhuǎn)向TST,繼續(xù)循環(huán),繼續(xù)循環(huán)DONE:MOVLENGTH, CX;保存結(jié)果;保存結(jié)果MOVAX, 4C00HINT21HCODEENDSENDSTART48例題例題4-11 從鍵盤以從鍵盤以10進(jìn)制格式輸入一個(gè)無(wú)符號(hào)進(jìn)制格式輸入一個(gè)無(wú)符號(hào)字節(jié)數(shù)(字節(jié)數(shù)(0255)存入)存入result,回車結(jié)束輸入。,回車結(jié)束輸入。方法方法1:先利用:

46、先利用0AH號(hào)號(hào)dos功能調(diào)用獲得各個(gè)數(shù)據(jù)位和結(jié)束標(biāo)功能調(diào)用獲得各個(gè)數(shù)據(jù)位和結(jié)束標(biāo)志(回車鍵),然后調(diào)用算法將數(shù)據(jù)位組合成十進(jìn)制數(shù)。屬志(回車鍵),然后調(diào)用算法將數(shù)據(jù)位組合成十進(jìn)制數(shù)。屬于計(jì)數(shù)控制的循環(huán)。于計(jì)數(shù)控制的循環(huán)。方法方法2:利用:利用01H號(hào)號(hào)dos功能調(diào)用,每輸入一個(gè)數(shù)位時(shí)調(diào)用一功能調(diào)用,每輸入一個(gè)數(shù)位時(shí)調(diào)用一次算法,直到輸入回車鍵。屬于條件控制的循環(huán)。次算法,直到輸入回車鍵。屬于條件控制的循環(huán)。 (編寫匯編語(yǔ)言程序)(編寫匯編語(yǔ)言程序)思考思考1:通過(guò)方法:通過(guò)方法2,從鍵盤輸入一個(gè)無(wú)符號(hào)字整數(shù),保存到字變,從鍵盤輸入一個(gè)無(wú)符號(hào)字整數(shù),保存到字變量量NUM。當(dāng)檢測(cè)到非法字符或超出

47、范圍時(shí)重新輸入。當(dāng)檢測(cè)到非法字符或超出范圍時(shí)重新輸入。思考思考2:通過(guò)方法:通過(guò)方法2,從鍵盤輸入一個(gè)有符號(hào)字整數(shù),保存到字變,從鍵盤輸入一個(gè)有符號(hào)字整數(shù),保存到字變量量NUM。當(dāng)檢測(cè)到非法字符時(shí)重新輸入。當(dāng)檢測(cè)到非法字符時(shí)重新輸入。 (參考教材例(參考教材例4.15)49例題例題4-12 向顯示器以向顯示器以10進(jìn)制格式輸出一個(gè)無(wú)符進(jìn)制格式輸出一個(gè)無(wú)符號(hào)字節(jié)數(shù)(號(hào)字節(jié)數(shù)(0255)。)。方法:先利用除法指令從低位開始分離出各個(gè)數(shù)據(jù)位并保存,分方法:先利用除法指令從低位開始分離出各個(gè)數(shù)據(jù)位并保存,分離結(jié)束后再利用離結(jié)束后再利用02號(hào)號(hào)dos功能調(diào)用逆序顯示。功能調(diào)用逆序顯示。1。計(jì)數(shù)控制循環(huán)的

48、次數(shù):已介紹。計(jì)數(shù)控制循環(huán)的次數(shù):已介紹2。條件控制循環(huán)的次數(shù):當(dāng)某次除法結(jié)束后商為。條件控制循環(huán)的次數(shù):當(dāng)某次除法結(jié)束后商為0,結(jié)束循環(huán),結(jié)束循環(huán)。思考:如何輸出一個(gè)有符號(hào)數(shù)據(jù)?思考:如何輸出一個(gè)有符號(hào)數(shù)據(jù)?50例題例題4-13統(tǒng)計(jì)字變量統(tǒng)計(jì)字變量var中二進(jìn)制位中二進(jìn)制位1的個(gè)的個(gè)數(shù)數(shù)n方法方法1:計(jì)數(shù)控制的循環(huán)(已講解):計(jì)數(shù)控制的循環(huán)(已講解)n方法方法2:條件控制的循環(huán):條件控制的循環(huán)51 有時(shí)循環(huán)的控制既需要次數(shù)控制,又需要條件有時(shí)循環(huán)的控制既需要次數(shù)控制,又需要條件控制(如等長(zhǎng)字符串的比較),但通過(guò)設(shè)置輔助變控制(如等長(zhǎng)字符串的比較),但通過(guò)設(shè)置輔助變量后可以簡(jiǎn)化。量后可以簡(jiǎn)化。

49、編寫程序時(shí)的技巧:編寫程序時(shí)的技巧:52 例例4-14 4-14 將將變量var中的正數(shù)插入一個(gè)已整序的字?jǐn)?shù)組插入一個(gè)已整序的字?jǐn)?shù)組(各元素均為正數(shù))的正確位置。的正確位置。 x dw ?x dw ? array_head dw 3,5,15,23,37,49,52,65,78,99 array_head dw 3,5,15,23,37,49,52,65,78,99 array_end dw 105 array_end dw 105 var dw 32 var dw 32 -1x mov ax, varmov ax, var mov array_head-2, 0ffffh mov array

50、_head-2, 0ffffh mov si, 0 mov si, 0CompareCompare: cmp array_endsi, axcmp array_endsi, ax jle insertjle insert mov bx, array_endsi mov bx, array_endsi mov array_endsi+2, bx mov array_endsi+2, bx sub si, 2 sub si, 2 jmp compare jmp compareInsertInsert: mov array_endsi+2, axmov array_endsi+2, ax 32 3

51、5 49 15 52 23 37 105 99 78 65vararray_headarray_headarray_endarray_end53例例4-15 邏輯尺的用法邏輯尺的用法n設(shè)有數(shù)組設(shè)有數(shù)組x(x1, , x10)和和y(y1, , y10),編程計(jì)算編程計(jì)算 z1=x1 + y1 z2=x2 + y2 z3=x3 - y3 z4=x4 - y4 z5=x5 - y5 z6=x6 + y6 z7=x7 - y7 z8=x8 - y8 z9=x9 + y9 z10=x10 + y10 邏輯尺邏輯尺:0 0 1 1 0 1 1 1 0 0 1 減法減法 0 加法加法54x dw x1,x

52、2,x3,x4,x5,x6,x7,x8,x9,x10 x dw x1,x2,x3,x4,x5,x6,x7,x8,x9,x10y dw y1,y2,y3,y4,y5,y6,y7,y8,y9,y10y dw y1,y2,y3,y4,y5,y6,y7,y8,y9,y10z dw z1,z2,z3,z4,z5,z6,z7,z8,z9,z10z dw z1,z2,z3,z4,z5,z6,z7,z8,z9,z10logic_rule dw 00dchlogic_rule dw 00dch mov bx, 0mov bx, 0 mov cx, 10 mov cx, 10 mov dx, logic_rule

53、mov dx, logic_rule next: mov ax, xbx next: mov ax, xbx shr dx, 1 shr dx, 1 jc subtract jc subtract add ax, ybx add ax, ybx jmp jmp result result ; ; 向前引用向前引用subtract: sub ax, ybxsubtract: sub ax, ybx resultresult: mov zbx, ax: mov zbx, ax add bx, 2 add bx, 2 loop next loop next 邏輯尺程序邏輯尺程序55 用總分減去最高分

54、、最低分,最后除以用總分減去最高分、最低分,最后除以5,得到需要的成績(jī)。,得到需要的成績(jī)。 求求N個(gè)數(shù)據(jù)中最大值的方法:個(gè)數(shù)據(jù)中最大值的方法:預(yù)設(shè)一個(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ù)的范圍,取

55、一個(gè)該范圍內(nèi)的最小的數(shù)。 計(jì)算最小值的方法與此類似。計(jì)算最小值的方法與此類似。例例4-16 從鍵盤上輸入七名裁判的評(píng)分(從鍵盤上輸入七名裁判的評(píng)分(010),扣除一個(gè)最),扣除一個(gè)最高分,一個(gè)最低分,計(jì)算出其它五項(xiàng)評(píng)分的平均值(高分,一個(gè)最低分,計(jì)算出其它五項(xiàng)評(píng)分的平均值(保留保留一位小數(shù)一位小數(shù)),在顯示器上輸出。),在顯示器上輸出。56INCLUDEYLIB.HDATASEGMENTMESS1 DB0DH, 0AH, “Input a score ( 010 ) : $”MESS2 DB0DH, 0AH, “The final score is : $”C5DB5MAXDB?MINDB?S

56、UMDB?DATAENDSCODESEGMENTASSUMECS: CODE, DS: DATASTART:MOVAX, DATAMOVDS, AX57MOVSUM, 0; 累加器清零累加器清零MOVMAX, 0; “最大值最大值”預(yù)設(shè)為預(yù)設(shè)為0MOVMIN, 255; “最小值最小值”預(yù)設(shè)為預(yù)設(shè)為255MOVCX, 7; 循環(huán)計(jì)數(shù)器,初值循環(huán)計(jì)數(shù)器,初值7ONE:LEADX, MESS1CALLREADDEC; 鍵盤輸入一個(gè)分?jǐn)?shù)鍵盤輸入一個(gè)分?jǐn)?shù)ADDSUM, AL; 累加累加CMPMAX, AL; 與與“最大值最大值”比較比較JAL1MOVMAX, AL; 大于大于“最大值最大值”則保留則保

57、留L1:CMPMIN, AL; 與與“最小值最小值”比較比較JBL2MOVMIN, AL; 小于小于“最小值最小值”則保留則保留L2:LOOP ONE; 計(jì)數(shù)循環(huán)計(jì)數(shù)循環(huán)58MOVAL, SUMSUBAL, MAXSUBAL, MIN; 從總分中減去最大、最小值從總分中減去最大、最小值MOVSUM, ALXORAH, AH; 高高8位清零位清零DIVC5; 求平均值求平均值PUSHAX; 保留余數(shù)(在保留余數(shù)(在AH中)中)MOVAH, 0; 清余數(shù)清余數(shù)LEADX, MESS2CALLWRITEDEC; 輸出結(jié)果的整數(shù)部分輸出結(jié)果的整數(shù)部分 59MOVDL, .MOVAH, 2INT21H;

58、 輸出小數(shù)點(diǎn)輸出小數(shù)點(diǎn)POPAX; 從堆棧彈出余數(shù)從堆棧彈出余數(shù)SHLAH, 1; 計(jì)算小數(shù)部分:計(jì)算小數(shù)部分:(AH5)10=AH2MOVDL, AHORDL, 30H; 轉(zhuǎn)換成轉(zhuǎn)換成ASCII代碼代碼MOVAH, 2INT21H; 輸出結(jié)果的小數(shù)部分輸出結(jié)果的小數(shù)部分CALLCRLF; 輸出回車換行,結(jié)束本行輸出回車換行,結(jié)束本行MOVAX, 4C00HINT21HCODEENDSENDSTART60LOOPZ/LOOPE及及LOOPNZ/LOOPNE的功能及應(yīng)用的功能及應(yīng)用指令操作碼指令操作碼指令格式指令格式功能描述功能描述LOOPLOOP labelCXCX-1,若,若(CX)0,轉(zhuǎn)移

59、,轉(zhuǎn)移到到LabelLOOPZ/LOOPELOOPZ/LOOPE labelCXCX-1,若,若(CX)0且且ZF=1,轉(zhuǎn)移到轉(zhuǎn)移到LabelLOOPNZ/LOOPNELOOPNZ/LOOPNE labelCXCX-1,若,若(CX)0且且ZF=0,轉(zhuǎn)移到轉(zhuǎn)移到Label61例例4-17 判斷兩個(gè)字符串是否完全匹配。判斷兩個(gè)字符串是否完全匹配。Data segment mess1 db 0dh,0ah, “Please input string1:$” string1 db 20, ? , 20 dup(?) mess2 db 0dh,0ah, “Please input string2:$”

60、 string2 db 20, ? , 20 dup(?) yes db 0dh,0ah, “string1=string2$” no db 0dh,0ah, “string1!=string2$”Data ends62用用LOOP指令控制循環(huán):指令控制循環(huán):代碼段:代碼段: MOV AX, DATA MOV DS, AX LEA DX, MESS1 MOV AH, 9 INT 21H LEA DX, STRING1 MOV AH, 0AH INT 21H LEA DX, MESS2 MOV AH, 9 INT 21H LEA DX, STRING2 MOV AH, 0AH INT 21H M

溫馨提示

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