版權(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í)行?;仡櫍?086/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)開(kāi)始時(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é)束?開(kāi)始例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碼。(參見(jiàn)教材例[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)。方法:先利用除法指令從低位開(kāi)始分離出各個(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《302不銹鋼管件三輥冷軋工藝研究》
- 《2022冬奧會(huì)背景下北京市滑雪指導(dǎo)員發(fā)展現(xiàn)狀研究》
- 《復(fù)方黃柏液涂劑對(duì)腹腔感染模型大鼠干預(yù)作用及機(jī)制研究》
- 壓力管理與健康生活的結(jié)合
- 《基于改進(jìn)YOLOv4的林業(yè)害蟲檢測(cè)研究》
- 產(chǎn)品創(chuàng)新設(shè)計(jì)及用戶體驗(yàn)研究
- 如何利用家教資源提高孩子能力
- 《工業(yè)機(jī)器人企業(yè)跨國(guó)并購(gòu)動(dòng)因、整合效率與績(jī)效研究》
- 抽樣定理仿真課程設(shè)計(jì)
- BIM施工方案及技術(shù)實(shí)施保障措施
- 2023年山西大同平城區(qū)司法協(xié)理員招聘考試試題及答案
- 年加工3萬(wàn)噸大米改建項(xiàng)目可行性實(shí)施報(bào)告
- 2.3.4病毒課件人教版生物七年級(jí)上冊(cè)2024新教材
- 基礎(chǔ)模塊3 Unit5 Natural Wonders in the World單元測(cè)試-2025年中職高考英語(yǔ)一輪復(fù)習(xí)講練測(cè)(高教版2023修訂版·全國(guó)用)
- 2024年新人教版一年級(jí)上冊(cè)數(shù)學(xué)全冊(cè)教案(新版教材)
- 2024年宜賓人才限公司招聘高頻考題難、易錯(cuò)點(diǎn)模擬試題(共500題)附帶答案詳解
- 2024年車輛牌照租賃協(xié)議標(biāo)準(zhǔn)版本(四篇)
- 2024年軍隊(duì)文職人員招聘考試公共科目真題
- 國(guó)家開(kāi)放大學(xué)本科《當(dāng)代中國(guó)政治制度》期末紙質(zhì)考試總題庫(kù)2025珍藏版
- 2024秋國(guó)家開(kāi)放大學(xué)《管理英語(yǔ)1》形考任務(wù)1-8參考答案
- 2024國(guó)家開(kāi)放大學(xué)電大本科《混凝土結(jié)構(gòu)設(shè)計(jì)原理》期末試題及答案試
評(píng)論
0/150
提交評(píng)論