第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è),還剩53頁(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)介

第四章選擇和循環(huán)

4.1測(cè)試和控制指令

4.2選擇結(jié)構(gòu)程序

4.3循環(huán)結(jié)構(gòu)程序1指令3指令2順序結(jié)構(gòu)

入口指令1出口分支結(jié)構(gòu)入口滿足條件?

分支1出口YN

分支2循環(huán)結(jié)構(gòu)入口

指令

修改條件條件滿足否?Y出口N結(jié)構(gòu)化程序設(shè)計(jì)的“基本結(jié)構(gòu)”2IPCS指令存放在內(nèi)存中,處理器從內(nèi)存取指令分析執(zhí)行處理器用CS:IP計(jì)算下一條要執(zhí)行的指令在內(nèi)存的物理地址

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

4.1測(cè)試和轉(zhuǎn)移控制指令4.1.1無(wú)條件轉(zhuǎn)移指令4.1.2比較和測(cè)試指令4.1.3條件轉(zhuǎn)移指令

44.1.1無(wú)條件轉(zhuǎn)移指令轉(zhuǎn)到label指定的目標(biāo)地址處,執(zhí)行那里的指令目的地址label的位置有2種情形:和JMP指令在同一個(gè)段,叫做段內(nèi)轉(zhuǎn)移,轉(zhuǎn)移時(shí)CPU只改變IP;和JMP指令不在同一個(gè)段,叫做段間轉(zhuǎn)移,轉(zhuǎn)移時(shí)CPU既要更改IP又要更改CS,目的地址label有兩種表示方式:label是目標(biāo)地址處指令的標(biāo)號(hào),叫做直接尋址label是寄存器或內(nèi)存單元,跳轉(zhuǎn)目的地址在寄存器或內(nèi)存中,叫做間接尋址JMPlabel

⑴段內(nèi)轉(zhuǎn)移、直接尋址⑵段內(nèi)轉(zhuǎn)移、間接尋址⑶段間轉(zhuǎn)移、直接尋址⑷段間轉(zhuǎn)移、間接尋址5段內(nèi)轉(zhuǎn)移、直接尋址JMPlabel

code1segment

……

jmp

again;轉(zhuǎn)到again處執(zhí)行 ……again:

dec

cx

;again處的指令 ……code1ends執(zhí)行JMP指令時(shí):CS的內(nèi)容不變,將以again為標(biāo)號(hào)的指令的偏移地址裝入IP。6段內(nèi)轉(zhuǎn)移、間接尋址JMPr16/m16將16位寄存器或內(nèi)存字單元內(nèi)容IP寄存器,CS內(nèi)容保持不變。例1:假設(shè)AX存放了段內(nèi)某條指令的偏移地址,則

jmpax

;IP←AX例2:假設(shè)DS:2000H存放了某條指令的偏移地址,則

jmpwordptr[2000h] ;IP←DS:[2000h]code1segment

…… leaax,again

jmp

ax;轉(zhuǎn)到again處執(zhí)行 ……again:

dec

cx

;again處的指令 ……code1ends71)JMPONE ;近程直接轉(zhuǎn)移假設(shè)ONE是程序中某條指令的標(biāo)號(hào),并且已在數(shù)據(jù)段定義字變量“TARGET”如下:

TAEGET DWONE下面四種方法都可以實(shí)現(xiàn)同一個(gè)代碼段中向標(biāo)號(hào)“ONE”的跳轉(zhuǎn):段內(nèi)轉(zhuǎn)移舉例2)LEADX,ONEJMPDX ;寄存器間接段內(nèi)轉(zhuǎn)移3)LEABX,TARGETJMPWORDPTR[BX] ;存儲(chǔ)器間接段內(nèi)轉(zhuǎn)移4)JMPTARGET ;存儲(chǔ)器間接段內(nèi)轉(zhuǎn)移8段間轉(zhuǎn)移、直接尋址JMPfarptrlabel

;IP←label的偏移地址 ;CS←label的段地址將標(biāo)號(hào)所在段的段地址CS,標(biāo)號(hào)處指令的偏移地址IP;CPU轉(zhuǎn)移到指定代碼段標(biāo)號(hào)處執(zhí)行code1segmentassumecs:code1

start:movax,20

movbx,10addax,bx

jmpfarptrexitcode1endscode2segmentassumecs:code2

exit:movax,4c00h

int21hcode2endsendstart9段間轉(zhuǎn)移、間接尋址JMPfarptr

mem

;IP←[mem],CS←[mem+2]用一個(gè)雙字存儲(chǔ)單元存儲(chǔ)要跳轉(zhuǎn)的目標(biāo)地址。低位字送IP,高位字送CS例如:讓處理器轉(zhuǎn)移到1500h:0取指令執(zhí)行movwordptr[bx],0movwordptr[bx+2],1500hJMPfarptr[bx]101)JMPFARPTRTWO ;遠(yuǎn)程直接轉(zhuǎn)移假設(shè)TWO是程序中一個(gè)代碼段中的某條指令的標(biāo)號(hào),并且已在數(shù)據(jù)段定義雙字變量“FAR_TGT”如下:

FAR_TGT DD TWO下面三組指令都可以實(shí)現(xiàn)向遠(yuǎn)程標(biāo)號(hào)“TWO”的轉(zhuǎn)移:2)LEABX,FAR_TGTJMPDWORDPTR[BX] ;遠(yuǎn)程間接轉(zhuǎn)移3)JMPFAR_TGT ;遠(yuǎn)程間接轉(zhuǎn)移11目標(biāo)地址的范圍段內(nèi)轉(zhuǎn)移:不更改CS,只改變IP,又分:短轉(zhuǎn)移(short):轉(zhuǎn)移范圍在段內(nèi)-128~+127字節(jié)近轉(zhuǎn)移(near):在當(dāng)前代碼段64KB范圍內(nèi)轉(zhuǎn)移段間轉(zhuǎn)移——遠(yuǎn)轉(zhuǎn)移(far)更改CS和IP從當(dāng)前代碼段跳到另一個(gè)代碼段,可以在1MB范圍跳轉(zhuǎn)目標(biāo)地址是雙字(16位偏移地址和16位段地址),叫做32位遠(yuǎn)指針代碼段代碼段

實(shí)際編程時(shí),匯編程序會(huì)根據(jù)目標(biāo)地址的距離,自動(dòng)處理成短轉(zhuǎn)移、近轉(zhuǎn)移或遠(yuǎn)轉(zhuǎn)移程序員可用操作符short、nearptr

或farptr

強(qiáng)制指明或改變轉(zhuǎn)移的屬性最常用格式:JMP語(yǔ)句標(biāo)號(hào)代碼段代碼段124.1.2比較和測(cè)試指令目的操作數(shù)dest:8位/16位的寄存器/存儲(chǔ)器操作數(shù)。源操作數(shù)src:與dest同類型的寄存器/存儲(chǔ)器/立即數(shù)。功能:運(yùn)算后影響標(biāo)志位,但不保留運(yùn)算結(jié)果。用途:CMP——比較兩個(gè)數(shù)的大小關(guān)系,但不改變它們的值。AX?=BXTEST——判斷目的操作數(shù)中個(gè)別二進(jìn)制位,但不改變它的值。判斷一個(gè)數(shù)的奇偶性指令操作碼指令格式功能描述CMPCMPdest,src(dest)-(src),不存結(jié)果TESTTESTdest,src(dest)∧(src),不存結(jié)果134.1.3條件轉(zhuǎn)移指令“J”----Jump“xx”是轉(zhuǎn)移的條件“l(fā)abel”只能為目標(biāo)指令的標(biāo)號(hào)。都屬于段內(nèi)短轉(zhuǎn)移。Jxx label操作碼助記符條件指令功能JZ/JEZF=1相等或?yàn)?轉(zhuǎn)移JNZ/JNEZF=0不相等或不為0轉(zhuǎn)移JSSF=1結(jié)果是負(fù)數(shù),則轉(zhuǎn)移JNSSF=0結(jié)果不是負(fù)數(shù),則轉(zhuǎn)移JOOF=1結(jié)果溢出,則轉(zhuǎn)移JNOOF=0結(jié)果沒(méi)有溢出,則轉(zhuǎn)移JP/JPEPF=1低位字節(jié)有偶數(shù)個(gè)1,則轉(zhuǎn)移JNP/JPOPF=0低位字節(jié)有奇數(shù)個(gè)1,則轉(zhuǎn)移JB/JNAE/JCCF=1有進(jìn)借位或<,則轉(zhuǎn)移JAE/JNB/JNCCF=0無(wú)進(jìn)借位或≥,則轉(zhuǎn)移JBE/JNACF=1或ZF=1≤,則轉(zhuǎn)移JA/JNBECF=0且ZF=0>,則轉(zhuǎn)移JL/JNGESF≠OF<,則轉(zhuǎn)移JGE/JNLSF=OF≥,則轉(zhuǎn)移JLE/JNGSF≠OF或ZF=1≤,則轉(zhuǎn)移JG/JNLESF=OF且ZF=0>,則轉(zhuǎn)移JCXZCX=0CX=0,則轉(zhuǎn)移14(1)根據(jù)兩個(gè)有符號(hào)數(shù)比較結(jié)果的條件轉(zhuǎn)移指令兩個(gè)有符號(hào)數(shù)的比較結(jié)果通過(guò)OF,SF,ZF反映出來(lái)。

G(Greater,大于)L(Less,小于)E(Equal,等于)N(Not,否)指令助記符

指令功能轉(zhuǎn)移條件JG,JNLE大于(不小于等于)時(shí)轉(zhuǎn)移OF⊕SF=0且ZF=0JGE,JNL大于等于(不小于)時(shí)轉(zhuǎn)移OF⊕SF=0JZ,JE為零(相等)時(shí)轉(zhuǎn)移ZF=1JNZ,JNE不為零(不相等)時(shí)轉(zhuǎn)移ZF=0JL,JNGE小于(不大于等于)時(shí)轉(zhuǎn)移OF⊕SF=1JLE,JNG小于等于(不大于)時(shí)轉(zhuǎn)移OF⊕SF=1或ZF=115(2)根據(jù)兩個(gè)無(wú)符號(hào)數(shù)比較結(jié)果的條件轉(zhuǎn)移指令兩個(gè)無(wú)符號(hào)數(shù)的比較結(jié)果通過(guò)CF,ZF反映出來(lái)。

A(Above,高于)

B(Below,低于)

E(Equal,等于)指令助記符指令功能轉(zhuǎn)移條件JA,JNBE高于(不低于等于)時(shí)轉(zhuǎn)移CF=0且ZF=0JAE,JNB,JNC高于等于(不低于)時(shí)轉(zhuǎn)移CF=0JZ,JE為零(相等)時(shí)轉(zhuǎn)移ZF=1JNZ,JNE不為零(不相等)時(shí)轉(zhuǎn)移ZF=0JB,JNAE,JC低于(不高于等于)時(shí)轉(zhuǎn)移CF=1JBE,JNA低于等于(不高于)時(shí)轉(zhuǎn)移CF=1或ZF=116(3)根據(jù)單個(gè)標(biāo)志位的條件轉(zhuǎn)移指令⑴

JS和JNS:利用符號(hào)標(biāo)志SF,判斷結(jié)果是正是負(fù)⑵JO和JNO:利用溢出標(biāo)志OF,判斷結(jié)果是否產(chǎn)生溢出⑶JP/JPE和JNP/JPO:利用奇偶標(biāo)志PF,判斷結(jié)果中“1”的個(gè)數(shù)⑷JC/JB/JNAE和JNC/JNB/JAE:利用進(jìn)位標(biāo)志CF,判斷結(jié)果是否進(jìn)位或借位⑸

JZ/JE和JNZ/JNE:利用零標(biāo)志ZF,判斷結(jié)果是否為零(或相等)17JCXZ Label

;若CX=0,轉(zhuǎn)移到Label(4)根據(jù)CX寄存器值的條件轉(zhuǎn)移指令18 JNG Skip JMP LabelSkip: ……條件轉(zhuǎn)移指令的轉(zhuǎn)移范圍在以下一條指令地址為中心的-128~+127字節(jié)之間。

JG Label;如果標(biāo)號(hào)“Label”超出范圍,匯編時(shí)將出錯(cuò)如果跳轉(zhuǎn)超出范圍可以把上面指令修改為下面的指令:條件轉(zhuǎn)移指令跳轉(zhuǎn)范圍限制194.2.1基本選擇結(jié)構(gòu)4.2.2單分支選擇結(jié)構(gòu)4.2.3復(fù)合選擇結(jié)構(gòu)4.2.4多分支選擇結(jié)構(gòu)4.2選擇結(jié)構(gòu)程序204.2.1基本選擇結(jié)構(gòu)if(條件){程序段A;}else{程序段B;}×√21CODE SEGMENT ASSUME CS:CODESTART: JMP BEGIN X DB ? ;被測(cè)試的數(shù),匯編之前置入

YES DB 0AH,0DH,“It’saevennumber.”,0AH,0DH,‘$’ NO DB 0AH,0DH,“It’saoddnumber.”,0AH,0DH,‘$’BEGIN:PUSH CS POP DS

TEST X,1 ;測(cè)試X的最低位,確定是否為偶數(shù)

JZ EVN ;ZF=1,該數(shù)是偶數(shù),轉(zhuǎn)向“EVN”O(jiān)DD: LEA DX,NO

;否則,該數(shù)是奇數(shù)

MOVAH,9INT21H

JMP DONE ;跳過(guò)偶數(shù)的處理EVN: LEA DX,YES MOV AH,9 INT 21H ;輸出偶數(shù)的相關(guān)信息DONE: MOV AX,4C00H INT 21HCODE ENDS END START[例4-2]判斷變量X的值是否為“偶數(shù)”22CODE SEGMENT ASSUME CS:CODE X DB ? ;被測(cè)試的數(shù),匯編之前置入

YES DB 0AH,0DH,“It’saevennumber.”,0AH,0DH,‘$’ NO DB 0AH,0DH,“It’saoddnumber.”,0AH,0DH,‘$’BEGIN:PUSH CS POP DS

TEST X,1 ;測(cè)試X的最低位,確定是否為偶數(shù)

JZ EVN ;ZF=1,該數(shù)是偶數(shù),轉(zhuǎn)向“EVN”O(jiān)DD: LEA DX,NO

;否則,該數(shù)是奇數(shù)

JMP DONE ;跳過(guò)偶數(shù)的處理EVN: LEA DX,YESDONE: MOV AH,9 INT 21H

;輸出偶數(shù)的相關(guān)信息

MOV AX,4C00H INT 21HCODE ENDS END BEGIN[例4-2]判斷變量X的值是否為“偶數(shù)”234.2.2單分支選擇結(jié)構(gòu)合理選用Jcc指令所使用的轉(zhuǎn)移條件,可以使程序更加簡(jiǎn)潔流暢。例如:當(dāng)求絕對(duì)值時(shí),應(yīng)選用JGE指令而不用JL指令(圖4-3)24例:X、Y、Z均為有符號(hào)字節(jié)變量,將X、Y中絕對(duì)值較大的數(shù)存入Z。

moval,x

cmpal,0

jgeskip1

negalskip1:

mov

bl,y

cmp

bl,0

jgeskip2

neg

blskip2:

cmpal,bl

jae

xtoz

moval,y

jmpsave

xtoz:moval,x

save:movz,al

hlt25例:在顯示器以16進(jìn)制形式顯示al中的值。將一個(gè)16進(jìn)制數(shù)位(0~F)調(diào)整為對(duì)應(yīng)ASCII碼的方法:方法1(基本選擇):

MOVDL,?;0~15CMPDL,9JAALPHADDDL,30HJMPDONEALPH:ADDDL,37HDONE:

寫出該例題的源程序片段。方法2(單分支選擇):

MOVDL,?;0~15ADDDL,30HCMPDL,‘9’JBEDONEADDDL,7DONE:26[例4-6]計(jì)算Y=SGN(X);方法a,逐項(xiàng)排除

CMP X,0JGE UN_MINUSMINUS:MOV Y,-1JMP DONEUN_MINUS:JE ZEROMOV Y,1JMP DONEZERO: MOV Y,0DONE: ……;方法b,逐項(xiàng)確認(rèn)

CMP X,0JG PLUSJEZEROMINUS:MOV Y,-1JMP DONEPLUS:MOV Y,1JMP DONEZERO:MOV Y,0DONE: ……4.2.3復(fù)合選擇結(jié)構(gòu)

1 (X>0)Y=0(X=0)

-1(X<0)

274.2.4多分支選擇結(jié)構(gòu)在選擇結(jié)構(gòu)程序里,如果可供選擇的程序塊多于兩個(gè),這樣的結(jié)構(gòu)稱為多分支選擇結(jié)構(gòu),如圖(a)所示,圖(b)是剛講過(guò)的復(fù)合選擇結(jié)構(gòu)的實(shí)現(xiàn)方法。28CODE SEGMENT ASSUMECS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV AX,4C00H INT 21HCODE ENDS END START[例4-7]從鍵盤上輸入數(shù)字“1”到“3”,根據(jù)輸入選擇顯示不同的信息。DATA SEGMENT PROMPT DB 0DH,0AH,“Inputanumber(1~3):$” MSG1 DB 0DH,0AH,“FUNCTION1EXECUTED.$” MSG2 DB 0DH,0AH,“FUNCTION2EXECUTED.$” MSG3 DB 0DH,0AH,“FUNCTION3EXECUTED.$”DATA ENDSC1(b)F1C2CnF2FnYYN---其它處理YNN---29INPUT: LEA DX,PROMPT MOV AH,9 INT 21H ;輸出提示信息

MOV AH,1 INT 21H ;等待從鍵盤輸入一個(gè)數(shù)字

CMP AL,‘1’ JB INPUT ;是“0”或非數(shù)字,重新輸入

JE F1 ;數(shù)字“1”,轉(zhuǎn)F1 CMP AL,‘2’ JE F2 ;數(shù)字“2”,轉(zhuǎn)F2 CMP AL,‘3’ JE F3 ;數(shù)字“3”,轉(zhuǎn)F3 JMP INPUT ;大于“3”,重新輸入F1: LEA DX,MSG1 ;F1程序塊

JMP OUTPUTF2: LEA DX,MSG2 ;F2程序塊

JMP OUTPUTF3: LEA DX,MSG3 ;F3程序塊

JMP OUTPUTOUTPUT:MOV AH,9 INT 21HC1(b)F1C2CnF2FnYYN---其它處理YNN---30把完成各分支的程序塊入口地址放在一張表格中,這個(gè)表叫地址表,根據(jù)輸入,計(jì)算出應(yīng)該執(zhí)行的分支程序塊入口地址在表中的位置,通過(guò)存儲(chǔ)器間接轉(zhuǎn)移轉(zhuǎn)入對(duì)應(yīng)位置執(zhí)行。方法2:按照流程a的方法實(shí)現(xiàn)CONDITIONF1(a)F2F3---=C1=C2=C3=CnFn31CODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXINPUT:LEADX,PROMPTMOVAH,9INT21H MOVAH,1INT21H CMPAL,‘1’JBINPUT CMPAL,‘3’JAINPUT SUBAL,‘1’ MOVAX,4C00HINT21HCODE ENDS END START SHL AL,1 ;轉(zhuǎn)換為0,2,4 MOV BL,AL MOV BH,0 ;轉(zhuǎn)入BX

JMP ADDTBL[BX] ;間接尋址,轉(zhuǎn)移到對(duì)應(yīng)程序塊F1: LEA DX,MSG1 ;F1程序塊 JMP OUTPUT F2: LEA DX,MSG2 ;F2程序塊 JMP OUTPUTF3: LEA DX,MSG3 ;F3程序塊

JMPOUTPUTOUTPUT: MOV AH,9 INT 21H多分支核心實(shí)現(xiàn)DATA SEGMENT PROMPT DB0DH,0AH,“Inputanumber(1~3):$” MSG1 DB0DH,0AH,“FUNCTION1EXECUTED.$” MSG2 DB0DH,0AH,“FUNCTION2EXECUTED.$” MSG3 DB0DH,0AH,“FUNCTION3EXECUTED.$”

ADDTBL DWF1,F2,F3DATA ENDS32

3X-5,|x|<=3【例4-4】計(jì)算分段函數(shù)Y=6,|x|>3MOVAX,X

CMPAX,3

JGGREATER

CMPAX,-3

JLGREATER

MOVBX,AX

SALAX,1

ADDAX,BX

SUBAX,5

JMPSAVE

GREATER:MOVAX,6

SAVE:MOVY,AX

HLT33補(bǔ)充例題:求有符號(hào)字變量X、Y、Z中的極值。(1)將最大值存入MAX(2)將最大值存入MAX,最小值存入MINMOVAX,XMOVBX,YMOVCX,ZCMPAX,BXJGGOONXCHGAX,BXGOON:CMPAX,CXJGISAXMOVMAX,CXJMPEXITISAX:MOVMAX,AXEXIT:HLTJLGOODMOVMAX,AXCMPBX,CXJLBMINMOVMIN,CXJMPQUITBMIN:MOVMIN,BXQUIT:JMPEXITGOOD:MOVMIN,BXMOVMAX,CXEXIT:HLT341、統(tǒng)計(jì)成績(jī)數(shù)組中各分?jǐn)?shù)段的人數(shù);2、從鍵盤輸入一個(gè)字符串,統(tǒng)計(jì)其中數(shù)字字符、字母字符和其它類型字符的個(gè)數(shù);3、求有/無(wú)符號(hào)數(shù)組中的最大、最小值。練習(xí):354.3.1循環(huán)指令4.3.2計(jì)數(shù)循環(huán)4.3.3條件循環(huán)4.3.4多重循環(huán)4.3循環(huán)結(jié)構(gòu)程序36計(jì)數(shù)循環(huán):循環(huán)的次數(shù)事先已知,用一個(gè)變量(寄存器

或存儲(chǔ)器單元)記錄循環(huán)的次數(shù)(稱為“循環(huán)計(jì)數(shù)

器”)。條件循環(huán):循環(huán)的次數(shù)事先并不確定,每次循環(huán)開始時(shí) 或結(jié)束后測(cè)試某個(gè)條件,根據(jù)這個(gè)條件是否滿足 來(lái)決定是否繼續(xù)下一次循環(huán)。按照循環(huán)結(jié)束的條件,有以下兩類循環(huán):37兩種結(jié)構(gòu)的循環(huán):384.3.1循環(huán)指令它們都不影響標(biāo)志位;轉(zhuǎn)移范圍:Label距離LOOP指令的下一條指令必須在-128~+127B之內(nèi)。指令操作碼指令格式功能描述LOOPLOOPlabelCX←CX-1,若(CX)≠0,轉(zhuǎn)移到LabelLOOPZ/LOOPELOOPZ/LOOPElabelCX←CX-1,若(CX)≠0且ZF=1,轉(zhuǎn)移到LabelLOOPNZ/LOOPNELOOPNZ/LOOPNElabelCX←CX-1,若(CX)≠0且ZF=0,轉(zhuǎn)移到LabelLOOPLabel與下面兩條指令功能相近:DEC CX ;CX←CX-1JNZ Label ;若(CX)≠0(也就是ZF=0),轉(zhuǎn)移到Label39[例4-8]從鍵盤上輸入一個(gè)字符串(不超過(guò)80個(gè)字符),將它逆序后輸出。4.3.2計(jì)數(shù)循環(huán)DATA SEGMENTBUFFERDB 81,?,81DUP(?)MESSDB 0AH,0DH,“Inputastringplease:$”DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX LEA DX,MESS MOV AH,09H INT 21H ;輸出提示信息

MOV AH,0AH LEA DX,BUFFER INT 21H ;輸入字符串

LEA BX,BUFFER ;緩沖區(qū)首地址送BX MOV CL,BUFFER+1 MOV CH,0 ;輸入字符個(gè)數(shù)送CX(循環(huán)次數(shù))40

JCXZEXIT

ADD BX,CX

INC BX ;計(jì)算字符串末地址送BX(指針)DISP: MOV DL,[BX] MOV AH,02H INT 21H ;逆序輸出一個(gè)字符

DEC BX ;修改指針

LOOP DISP ;計(jì)數(shù)循環(huán)EXIT:MOV AX,4C00H INT 21HCODE ENDS END START41[例4-9]在顯示器以十六進(jìn)制形式顯示BX寄存器的內(nèi)容

BX是一個(gè)16位寄存器二進(jìn)制1010100100111110

用十六進(jìn)顯示時(shí),每4位用一個(gè)字符顯示,共4個(gè)其中:0000→’0’30H,1010→’A’41H

0001→’1’31H

,1011→’B’42H

、、、、

1001→’9’39H

,1111→’F’46H?十六進(jìn)制A93E屏幕上的顯示‘A’‘9’‘3’‘E’對(duì)應(yīng)的ASCII41H39H33H45H42例4-9算法取出要顯示的某4位,轉(zhuǎn)換為對(duì)應(yīng)的ASCII碼,再調(diào)用DOS系統(tǒng)功能進(jìn)行顯示。

BXA93E93EAA93E

3EA9EA9343(1)對(duì)于0000~1001(0~9),先擴(kuò)展成一個(gè)字節(jié),高4位清0,加上30H后,即可得字符’0’~’9’對(duì)應(yīng)的ASCII碼。

00000001B+30H=31H00001001B+30H=39H

0001B‘1’1001B‘9’(2)對(duì)于1010~1111(A~F),先擴(kuò)展成一個(gè)字節(jié),高4位清0,

加上30H后,還要再加上07H,才能得到’A’~’F’對(duì)應(yīng)的ASCII碼

00001010B+30H+07H=41H00001111B+30H+07H=46H

1010B‘A’1111B‘F’44codeSEGMENT

ASSUMECS:codestart:MOVBX,1234HMOVCH,4;字符個(gè)數(shù)

MOVCL,4;循環(huán)移位次數(shù)

next:ROLBX,CL

;取顯示位的值

MOVDL,BL

;保存在DL中

ANDDL,0FH;清除高4位

ADDDL,30H;轉(zhuǎn)變?yōu)閿?shù)字的ASCIICMPDL,39H;大于39H,則應(yīng)轉(zhuǎn)變

JBEprint;為字母A~F的ASCIIADDDL,07Hprint:MOVAH,2H;顯示DL中的字符

INT21H

DECCH;顯示結(jié)束?

JNZnext

MOVAH,4CH;返回DOSINT21HcodeENDSENDstart顯示字符個(gè)數(shù)CH=4循環(huán)移位次數(shù)CL=4BX循環(huán)左移4位,將要顯示的值移至低4位,保存在DL中清DL的高4位,只保留要顯示位的值DL←DL+30H完成數(shù)值0~9的ASCII碼轉(zhuǎn)換YNDL←DL+07H完成數(shù)值A(chǔ)~F的ASCII碼轉(zhuǎn)換用02功能顯示DL中的字符YN返回DOSDL超出39H?CH←CH-1轉(zhuǎn)換結(jié)束?開始例4-9程序計(jì)數(shù)控制法45思考例4-9采用的是大寫字母A~F進(jìn)行顯示,若采用小寫字符a~f進(jìn)行顯示,程序如何改寫?1010001110011110‘A39E’或‘a(chǎn)39e小寫a~f的ASCII碼在61~6FH,比大寫字母A~F的ACII碼多20H,判斷是字母的數(shù)字后,加27H即可。也可以用查表的方法形成十六進(jìn)制數(shù)位的ASCII碼。(參見教材例[4.9])46DATA SEGMENT STRING DB“Astringfortesting.”,0 LENGTH DW?DATA ENDS[例4-10]字符串STRING以代碼0結(jié)束,求它的長(zhǎng)度(字符個(gè)數(shù))。4.3.3條件循環(huán)CODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX LEA SI,STRING ;裝載字符串指針

MOV CX,0 ;設(shè)置計(jì)數(shù)器初值TST: CMP BYTEPTR[SI],0;比較

JE DONE ;字符串結(jié)束,轉(zhuǎn)向DONE保存結(jié)果

INC SI ;修改指針

INC CX ;計(jì)數(shù)

JMP TST

;轉(zhuǎn)向TST,繼續(xù)循環(huán)DONE: MOV LENGTH,CX ;保存結(jié)果

MOV AX,4C00H INT 21HCODE ENDS END START47[例題4-11]從鍵盤以10進(jìn)制格式輸入一個(gè)無(wú)符號(hào)字節(jié)數(shù)(0~255)存入result,回車結(jié)束輸入。方法1:先利用0AH號(hào)dos功能調(diào)用獲得各個(gè)數(shù)據(jù)位和結(jié)束標(biāo)志(回車鍵),然后調(diào)用算法將數(shù)據(jù)位組合成十進(jìn)制數(shù)。屬于計(jì)數(shù)控制的循環(huán)。方法2:利用01H號(hào)dos功能調(diào)用,每輸入一個(gè)數(shù)位時(shí)調(diào)用一次算法,直到輸入回車鍵。屬于條件控制的循環(huán)。

(編寫匯編語(yǔ)言程序)思考1:通過(guò)方法2,從鍵盤輸入一個(gè)無(wú)符號(hào)字整數(shù),保存到字變量NUM。當(dāng)檢測(cè)到非法字符或超出范圍時(shí)重新輸入。

思考2:通過(guò)方法2,從鍵盤輸入一個(gè)有符號(hào)字整數(shù),保存到字變量NUM。當(dāng)檢測(cè)到非法字符時(shí)重新輸入。(參考教材例4.15)

48[例題4-12]向顯示器以10進(jìn)制格式輸出一個(gè)無(wú)符號(hào)字節(jié)數(shù)(0~255)。方法:先利用除法指令從低位開始分離出各個(gè)數(shù)據(jù)位并保存,分離結(jié)束后再利用02號(hào)dos功能調(diào)用逆序顯示。

1。計(jì)數(shù)控制循環(huán)的次數(shù):已介紹

2。條件控制循環(huán)的次數(shù):當(dāng)某次除法結(jié)束后商為0,結(jié)束循環(huán)。

思考:如何輸出一個(gè)有符號(hào)數(shù)據(jù)?

49[例題4-13]統(tǒng)計(jì)字變量var中二進(jìn)制位‘1’的個(gè)數(shù)方法1:計(jì)數(shù)控制的循環(huán)(已講解)方法2:條件控制的循環(huán)50有時(shí)循環(huán)的控制既需要次數(shù)控制,又需要條件控制(如等長(zhǎng)字符串的比較),但通過(guò)設(shè)置輔助變量后可以簡(jiǎn)化。編寫程序時(shí)的技巧:51[例4-14]將變量var中的正數(shù)插入一個(gè)已整序的字?jǐn)?shù)組(各元素均為正數(shù))的正確位置。

xdw?array_headdw3,5,15,23,37,49,52,65,78,99array_enddw105

var

dw32

-1x

movax,var

movarray_head-2,0ffffh

mov

si,0Compare:

cmp

array_end[si],ax

jleinsert

mov

bx,array_end[si]

movarray_end[si+2],bxsubsi,2

jmpcompareInsert:movarray_end[si+2],ax

32

3

5

49

15

52

23

37

105

99

78

65vararray_headarray_end52[例4-15]邏輯尺的用法設(shè)有數(shù)組x(x1,…,x10)和y(y1,…,y10),編程計(jì)算

z1=x1+y1z2=x2+y2z3=x3-y3z4=x4-y4z5=x5-y5z6=x6+y6z7=x7-y7z8=x8-y8z9=x9+y9z10=x10+y10

邏輯尺:0011011100

1減法

0加法53xdwx1,x2,x3,x4,x5,x6,x7,x8,x9,x10ydwy1,y2,y3,y4,y5,y6,y7,y8,y9,y10zdwz1,z2,z3,z4,z5,z6,z7,z8,z9,z10logic_ruledw00dch

mov

bx,0

mov

cx,10

mov

dx,logic_rulenext:movax,x[bx]

shr

dx,1

jcsubtractaddax,y[bx]

jmp

result;向前引用subtract:subax,y[bx]

result:mov

z[bx],axaddbx,2loopnext

邏輯尺程序54用總分減去最高分、最低分,最后除以5,得到需要的成績(jī)。求N個(gè)數(shù)據(jù)中最大值的方法:

預(yù)設(shè)一個(gè)“最大值”,

取出一個(gè)數(shù)據(jù)與這個(gè)“最大值”進(jìn)行比較,

如果數(shù)據(jù)大于“最大值”,則將該數(shù)據(jù)作為新的“最大值”。

進(jìn)行N次比較之后留下的就是這N個(gè)數(shù)據(jù)的最大值。預(yù)設(shè)的“最大值”的初值可以從N個(gè)數(shù)據(jù)中任取一個(gè),也可以根

據(jù)數(shù)據(jù)的范圍,取一個(gè)該范圍內(nèi)的最小的數(shù)。計(jì)算最小值的方法與此類似。[例4-16]從鍵盤上輸入七名裁判的評(píng)分(0~10),扣除一個(gè)最

高分,一個(gè)最低分,計(jì)算出其它五項(xiàng)評(píng)分的平均值(保留

一位小數(shù)),在顯示器上輸出。55INCLUDE YLIB.HDATA SEGMENT MESS1 DB 0DH,0AH,“Inputascore(0~10):$” MESS2 DB 0DH,0AH,“Thefinalscoreis:$” C5 DB 5 MAX DB ? MIN DB ? SUM DB ?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX56

MOV SUM,0 ;累加器清零

MOV MAX,0 ;“最大值”預(yù)設(shè)為0 MOV MIN,255 ;“最小值”預(yù)設(shè)為255 MOV CX,7 ;循環(huán)計(jì)數(shù)器,初值7ONE: LEA DX,MESS1 CALL READDEC ;鍵盤輸入一個(gè)分?jǐn)?shù)

ADD SUM,AL ;累加

CMP MAX,AL ;與“最大值”比較

JA L1 MOV MAX,AL ;大于“最大值”則保留L1: CMP MIN,AL ;與“最小值”比較

JB L2 MOV MIN,AL ;小于“最小值”則保留L2: LOOP ONE ;計(jì)數(shù)循環(huán)57

MOV AL,SUM SUB AL,MAX SUB AL,MIN ;從總分中減去最大、最小值

MOV SUM,AL XOR AH,AH ;高8位清零

DIV C5 ;求平均值

PUSH AX ;保留余數(shù)(在AH中)

MOV AH,0 ;清余數(shù)

LEA DX,MESS2 CALL WRITEDEC ;輸出結(jié)果的整數(shù)部分58

MOV DL,‘.’ MOV AH,2 INT 21H ;輸出小數(shù)點(diǎn)

POP AX ;從堆棧彈出余數(shù)

SHL AH,1 ;計(jì)算小數(shù)部分:(AH÷5)×10=AH×2 MOV DL,AH OR DL,30H ;轉(zhuǎn)換成ASCII代碼

MOV AH,2 INT 21H ;輸出結(jié)果的小數(shù)部分

CALL CRLF ;輸出回車換行,結(jié)束本行

MOV AX,4C00H INT 21HCODE ENDS END START59LOOPZ/LOOPE及LOOPNZ/LOOPNE的功能及應(yīng)用指令操作碼指令格式功能描述LOOPLOOPlabelCX←CX-1,若(CX)≠0,轉(zhuǎn)移到LabelLOOPZ/LOOPELOOPZ/LOOPElabelCX←CX-1,若(CX)≠0且ZF=1,轉(zhuǎn)移到LabelLOOPNZ/LOOPNELOOPNZ/LOOPNElabelCX←CX-1,若(CX)≠0且ZF=0,轉(zhuǎn)移到Label60[例4-17]判斷兩個(gè)字符串是否完全匹配。Datasegmentmess1db0dh,0ah,“Pleaseinputstring1:$”string1db20,?,20dup(?)mess2db0dh,0ah,“Pleaseinputstring2:$”string2db20,?,20dup(?)yesdb0dh,0ah,“string1=string2$”nodb0dh,0ah,“string1!=string2$”Dataends61用LOOP指令控制循環(huán):代碼段:

MOVAX,DATAMOVDS,AXLEADX,MESS1MOVAH,9INT21HLEADX,STRING1MOVAH,0AHINT21HLEADX,MESS2MOVAH,9INT21HLEADX,STRING2MOVAH,0AHINT21HMOVCL,STRING1+1MOVAL,STRING2+1CMPCL,ALJNZNMATMOVCH,0JCXZMATMOVBX,2NEXT:MOVAL,STRING1[BX]CMPAL,STRING2[BX]JNZNMATINCBXLOOPNEXTMAT:LEADX,YESJMPDISPNMAT:LEADX,NO

DISP:MOVAH,9INT21HMOVAH,4CHINT21H用LOOPZ指令控制循環(huán):MOVCL,STRING1+1MOVAL,STRING2+1CMPCL,ALJNZNMATMOVCH,0JCXZMATMOVBX,1NEXT:INCBX

MOVAL,STRING1[BX]CMPAL,STRING2[BX]LOOPZNEXTJNZNMATMAT:LEADX,YESJMPDISPNMAT:LEADX,NO

DISP:MOVAH,9INT21HMOVAH,4CHINT21H62DATA SEGMENT STRING DB“Thisisastringforexample.”LENDW$-STRINGPOSITION DW ?MESSDB“Thefirstpositionofais:$”FLAGDB0DATA ENDS[例4-18]以十進(jìn)制形式輸出字母’a’在字符串STRING中第一次出現(xiàn)的位置,如果未出現(xiàn),則位置為-1。方法1:用LOOP指令控制循環(huán),請(qǐng)自己編程實(shí)現(xiàn).63

MOV AX,DATA MOV DS,AX MOV SI,-1 ;SI用作字符串字符指針

MOV CX,LEN ;字符串長(zhǎng)度L0: INC SI ;修改指針

CMP STRING[SI],‘a(chǎn)’ ;一個(gè)字符與’a’進(jìn)行比較

LOOPNZ L0 ;字

溫馨提示

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