




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第8章匯編語言程序設(shè)計(jì)8.1
順序程序設(shè)計(jì)8.2
分支程序設(shè)計(jì)8.3
循環(huán)程序設(shè)計(jì)8.4
子程序設(shè)計(jì)(自學(xué))天酬勤道
順序程序是最簡(jiǎn)單的程序,它的執(zhí)行順序和程序中指令的順序完全一致。8.1順序程序設(shè)計(jì)(1)格式:MULsource
IMULsource;符號(hào)整數(shù)乘法8.1.1乘除法指令1.乘法指令MUL和符號(hào)整數(shù)乘法指令I(lǐng)MUL源操作數(shù)source可以是字節(jié)、字或雙字,可為REG或MEM,不能為立即數(shù)目的操作數(shù)是AL、AX或EAX,視source的類型屬性決定是AL、AX還是EAX在乘法指令之前必須將目的操作數(shù)送AL(字節(jié)乘)或AX(字乘)或EAX(雙字乘)(2)操作:8位或16位:AL或AX乘以source,乘積放回到AX或DX和AX,如下圖所示:ALsourc8AX×AXsourc16AX×DX32位:EAX乘以source,乘積放回到EDX和EAX,如下圖所示:EAXsourc32EAX×EDX乘法指令對(duì)CF和OF以外的狀態(tài)標(biāo)志位無定義。對(duì)于MUL指令,如果乘積的高一半為0,則CF和OF均為0,;否則,CF和OF均為1。對(duì)于IMUL指令,如果乘積的高一半是低一半的符號(hào)擴(kuò)展,則CF和OF均為0,;否則,CF和OF均為1??捎贸朔ㄟ\(yùn)算將BCD數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)(3)對(duì)狀態(tài)標(biāo)志位的影響(1)格式:
DIVsource
IDIVsource;符號(hào)整數(shù)除法源操作數(shù)source可以是字節(jié)、字或雙字,可為REG或MEM,不能為立即數(shù)目的操作數(shù)是AX或DX和AX或EDX和EAX所有標(biāo)志位為任意值2.除法指令DIV和符號(hào)整數(shù)除法指令I(lǐng)DIV(2)操作:8位或16位除法指令所執(zhí)行的操作如下圖所示ALsourc8AXAXsourc16AXDXAHDX……32位除法指令所執(zhí)行的操作如下圖所示EAXsourc32EAXEDXEDX…可用除法運(yùn)算(除10取余)將二進(jìn)制數(shù)轉(zhuǎn)換為BCD數(shù)3.擴(kuò)展指令要把一個(gè)8位二進(jìn)制數(shù)除以另一個(gè)8位二進(jìn)制數(shù),要有一個(gè)16位二進(jìn)制數(shù)在AX中,所以做8位除以8位的除法前先要把8位被除數(shù)擴(kuò)展為16位。同樣做16位除以16位的除法前要把16位被除數(shù)擴(kuò)展為32位,做32位除以32位的除法前要把32位被除數(shù)擴(kuò)展為64位。這種擴(kuò)展對(duì)于無符號(hào)數(shù)除法只需將AH或DX或EDX清0,而對(duì)符號(hào)整數(shù)除法則要通過擴(kuò)展符號(hào)位來把被除數(shù)擴(kuò)展。指令都隱含操作數(shù)在做8位除以8位、16位除以16位、32位除以32位的符號(hào)整數(shù)除法之前,應(yīng)先擴(kuò)展AL或AX或EAX中的被除數(shù)。擴(kuò)展指令和符號(hào)整數(shù)除法僅對(duì)補(bǔ)碼數(shù)適用。不影響標(biāo)志位格式:CBW
;AL的最高位→AH
CWD
;AX的最高位→DX
CWDE
;AX的最高位→EAX的高16位
CDQ
;EAX的最高位→EDX如:有一符號(hào)字?jǐn)?shù)組變量ARRAY,第1個(gè)字是被除數(shù),第2個(gè)字是除數(shù),接著存放商和余數(shù),其程序段為:
MOVSI,OFFSETARRAYMOVAX,[SI]CWDIDIVWORDPTR[SI+2]MOV[SI+4],AXMOV[SI+6],DX;設(shè)置指針;將被除數(shù)送入AX;將AX中的符號(hào)位擴(kuò)展到DX;進(jìn)行除法運(yùn)算;存商;存余數(shù)二進(jìn)制編碼的十進(jìn)制數(shù)—BCD碼
Binary-CodedDecimal?)
用二進(jìn)制數(shù)表示一位十進(jìn)制數(shù)。有兩種表示法:壓縮BCD碼和非壓縮BCD碼。壓縮BCD碼的每一位用4位二進(jìn)制表示,0000-1001表示0-9,一個(gè)字節(jié)表示兩位十進(jìn)制數(shù)。非壓縮BCD碼用一個(gè)字節(jié)表示一位十進(jìn)制數(shù),高4位總是0000,低4位的0000-1001表示0-9。十進(jìn)制數(shù)8421碼5421碼2421碼余3碼000000000000000111000100010001010020010001000100101300110011001101104010001000100011150101100010111000601101001110010017011110101101101081000101111101011910011100111111008.1.2BCD數(shù)調(diào)整指令用二進(jìn)制數(shù)算術(shù)運(yùn)算指令對(duì)BCD數(shù)進(jìn)行運(yùn)算,會(huì)得到一個(gè)非BCD數(shù)或不正確的BCD數(shù)。如:
00000011B+00001001B=00001100B00001001B+00000111B=00010000B第一個(gè)結(jié)果是非BCD數(shù);第二個(gè)結(jié)果是不正確的BCD數(shù)。若再加上6,就可以得到正確的BCD數(shù):
00001100B+00000110B=00010010B00010000B+00000110B=00010110B對(duì)BCD數(shù)使用二進(jìn)制數(shù)算術(shù)運(yùn)算指令進(jìn)行運(yùn)算,然后執(zhí)行一條專用調(diào)整指令來處理BCD數(shù)的結(jié)果。1.BCD數(shù)加法調(diào)整指令DAA和AAA格式:
DAA功能:將AL中的和調(diào)整為正確的壓縮BCD數(shù)調(diào)整規(guī)則:(AL&0FH)>9或AF=1,則AL加6;
(AL&0F0H)>90H或CF=1,則AL加60H.(1)壓縮BCD數(shù)加法調(diào)整
注:該指令操作數(shù)隱含為AL,即只能對(duì)AL中的操作數(shù)據(jù)進(jìn)行調(diào)整對(duì)結(jié)果調(diào)整時(shí)要用到CF和AF兩個(gè)標(biāo)志位,所以調(diào)整指令應(yīng)緊跟BCD數(shù)加法指令DAA指令對(duì)OF未定義,影響其余標(biāo)志如:MOVAX,3456HADDAL,AH;AL=8AH,AF=0,CF=0DAA;AL=90H
00110100
+0101011010001010
+011010010000[例1]求兩個(gè)字變量W1和W2中壓縮BCD數(shù)之和,存入字節(jié)變量SUM中。(完整程序見P196【例8.1】)如:8931+5678=14609,程序段如下:W1DW8931HW2DW5678HSUMDB3DUP(0)MOVAL,BYTEPTRW1
;AL=31HADD
AL,BYTEPTRW2
;AL=A9H,CF=0,AF=0DAA
;AL=09H,CF=1
MOVSUM,AL;存?zhèn)€位和十位MOVAL,BYTEPTRW1+1
;AL=89HADCAL,BYTEPTRW2+1;AL=E0H,CF=0,AF=1DAA
;AL=46H,CF=1MOVSUM+1,AL;存百位和千位ADCSUM+2,0;處理向萬位的進(jìn)位格式:
AAA功能:將AL中的和調(diào)整為正確的非壓縮BCD數(shù)送AX調(diào)整規(guī)則:(AL&0FH)>9或AF=1,則(AL+6)&0FH→AL,AH+1→AH;否則,AL&0FH→AL,AH不變.(2)非壓縮BCD數(shù)加法調(diào)整注:同DAA指令,AAA指令的操作數(shù)也隱含為AL,且要緊跟加法指令A(yù)AA調(diào)整后的存放規(guī)律:個(gè)位數(shù)送AL,十位數(shù)(即進(jìn)位)加到AH中,故執(zhí)行該指令前應(yīng)注意AH是否清0。如:將兩個(gè)BCD數(shù)(5和9)的ASCII碼相加,得到和的ASCII碼:
MOVAL,35H;’5’
ADDAL,39H;’9’,AL=6EH
MOVAH,0
AAA;AX=0104H
ORAX,3030H;AX=3134H即’14’[例2]求兩個(gè)字變量W1和W2中非壓縮BCD數(shù)之和,存入字節(jié)變量SUM中。(自學(xué),完整程序見P197【例8.2】)如:89+67=156,程序段如下:W1DW0809HW2DW0607HSUMDB3DUP(0)MOVAX,W1
;AX=0809HADDAL,BYTEPTRW2
;AL=10H,AF=1AAA
;AX=0906H
MOVSUM,AL
;存?zhèn)€位MOVAL,AHADDAL,BYTEPTRW2+1
;AL=0FH,AF=0MOVAH,0AAA
;AL=05H,AH=01HMOVWORDPTRSUM+1,AX
;存十位和百位19格式:DAS功能:將AL中的差調(diào)整為正確的壓縮BCD數(shù)調(diào)整規(guī)則:(AL&0FH)>9或AF=1,則AL減6;
(AL&0F0H)>90H或CF=1,則AL減60H.如:
MOVAX,5634HSUBAL,AH
;AL=DEH,有借位
DAS
;AL=78H,保持借位,即134-562.BCD數(shù)減法調(diào)整指令DAS和AAS(1)壓縮BCD數(shù)減法調(diào)整格式:AAS功能:將AL中的差調(diào)整為正確的非壓縮BCD數(shù)送AX調(diào)整規(guī)則:(AL&0FH)>9或AF=1,則(AL-6)&0FH→AL,AH-1→AH;否則,AL&0FH→AL,AH不變.如:
MOVAX,0806HSUBAL,07H
;AX=08FFH
AAS
;AX=0709H(2)非壓縮BCD數(shù)減法調(diào)整21格式:
AAM功能:將AL中小于64H的二進(jìn)制數(shù)→非壓縮BCD數(shù)送AX調(diào)整規(guī)則:AL/0AH→AH(十位),
ALMOD0AH→AL(個(gè)位)如:MOVAL,63HAAM
;AX=0909H3.非壓縮BCD數(shù)乘除法調(diào)整指令A(yù)AM和AAD(自學(xué))(1)乘法調(diào)整格式:
AAD功能:將AX中的兩位非壓縮BCD數(shù)→二進(jìn)制數(shù)集中放在AL中。如:96÷6MOVAX,0906HMOVDL,06H
AAD
;AX=0060HDIVDL;AL=10H,AH=0MOVDL,AH;存余數(shù)
AAM
;AX=0106H(2)除法調(diào)整注:此指令可對(duì)被除數(shù)進(jìn)行預(yù)調(diào)整加、減和乘法調(diào)整在相應(yīng)運(yùn)算操作之后進(jìn)行,而除法的調(diào)整在除法操作之前進(jìn)行[例3]:將AX中的3位(小于等于255大于零)BCD數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)存入字節(jié)變量SB中。(P192)(1)思路:N2×102+N1×10+N0=(N2×10+N1)×10+N0(2)說明:AL:被乘數(shù)CH:乘數(shù)10CL:移位次數(shù)SB:暫存器(3)繪制程序流程圖(4)編寫程序開始初始化返回暫存十位和個(gè)位→SB百位→ALAL×10→AX取十位→AHAL+AH→AL取各位→SBSB+AL→SBAL×10→AX8.1.3順序程序設(shè)計(jì)舉例程序段如下:MOVAX,0126HM0VCH,10MOVCL,4MOVSB,AL
;暫存十位和個(gè)位MOVAL,AH;百位存入AL中MULCH;百位×10→AXMOVAH,SB;取十位SHRAH,CLADDAL,AH;百位×10+十位→ALMULCH;AL×10→AXANDSB,0FH;取個(gè)位ADDSB,AL;AL+個(gè)位→SB開始初始化返回暫存十位和個(gè)位→SB百位→ALAL×10→AX取十位→AHAL+AH→AL取各位→SBSB+AL→SBAL×10→AX[例4]將AL中的8位無符號(hào)二進(jìn)制數(shù)轉(zhuǎn)換為BCD數(shù)放入AX中(P194)(1)思路:“除10取余”法(2)說明:BL:除數(shù)10
BH:暫存器CL:移位次數(shù)AX:被除數(shù)(3)繪制程序流程圖(4)編寫程序開始初始化返回AX÷10,余數(shù)(個(gè)位)→AH暫存?zhèn)€位→BH商÷10,余數(shù)(十位)→AH商(百位)→AL合并十位與個(gè)位→BH商(百位)→AH十位與各位BH→AL程序如下:MOVAL,7EH(126)MOVCL,4MOVBL,10MOVAH,0;將8位二進(jìn)制數(shù)擴(kuò)展為16位DIVBL
;商→AL,余數(shù)→AH(個(gè)位數(shù))MOVBH,AH;個(gè)位暫存MOVAH,0DIVBL
;商(百位數(shù))→AL,余數(shù)→AH(十位數(shù))SHLAH,CLORBH,AH;BCD數(shù)十位與個(gè)位合并MOVAH,AL;百位數(shù)送AHMOVAL,BH
;BCD數(shù)十位與個(gè)位送AL開始初始化返回AX÷10,余數(shù)(個(gè)位)→AH暫存?zhèn)€位→BH商÷10,商(百位)→AL余數(shù)(十位)→AH合并十位與個(gè)位→BH商(百位)→AH十位與各位(BH)→AL[例5]從鍵盤鍵入0~9的任一自然數(shù)N,求其立方值并將其送顯示器顯示.(完整程序見P201【例8.5】)鍵入N—將字符變成數(shù)N—用乘法求N3—用除法將N3二進(jìn)制數(shù)變成其十進(jìn)制數(shù)字符—顯示輸出INPUTDB’PleaseInputN(0—9),$’
LFZDB0,0,0,'$'
MOVBL,10MOVDX,OFFSETINPUT;顯示提示信息MOVAH,9INT21H
MOVAH,1INT21H可用乘法運(yùn)算實(shí)現(xiàn),也可用查表法實(shí)現(xiàn)。用乘法實(shí)現(xiàn)思路:?MOVAH,2MOVDL,0AHINT21HANDAL,0FHMULALMULALDIVBLORAH,30HMOVLFZ+2,AHMOVAH,0DIVBLORAX,3030HMOVWORDPTRLFZ,AXLEADX,LFZMOVAH,9INT21Hret開始定義提示信息返回定義立方值數(shù)據(jù)區(qū)9號(hào)顯示提示信息鍵入自然數(shù)N將字符N變成數(shù)N求N3將個(gè)位變成字符→LFZ+2將百位十位變成字符→LFZN3÷10,商(百十位)→AL,余數(shù)(個(gè)位)→AH百十位÷10,商(百位)→AL,余數(shù)(十位)→AH流程圖:9號(hào)顯示立方值INPUTDB’PleaseInputN(0~9):$’LFBDB’0$1$8$27$64$’
DB’125$216$343$512$729$’NDB0MOVDX,OFFSETINPUT;顯示提示信息MOVAH,9INT21HMOVAH,1;鍵入并回顯NINT21H
查表法程序段如下:
MOVN,AL
MOVAH,2;換行
MOVDL,0AH
INT21H
MOVDL,N;將字符N轉(zhuǎn)化為數(shù)字N
ANDDL,0FH
MOVCL,2;確定立方表中的位置
SHLDL,CL
MOVDH,0
ADDDX,OFFSETLFB;顯示N的立方值
MOVAH,9
INT21H本節(jié)課要求掌握乘除法指令會(huì)編寫簡(jiǎn)單的順序程序本節(jié)課作業(yè)P260:習(xí)題8.28.2分支程序設(shè)計(jì)分支程序通常是利用條件轉(zhuǎn)移指令,使程序執(zhí)行到某一指令后,根據(jù)條件是否滿足,來改變程序執(zhí)行的次序。它經(jīng)常是先用比較指令或數(shù)據(jù)操作及位檢測(cè)指令來改變標(biāo)志寄存器各個(gè)標(biāo)志位。然后用條件轉(zhuǎn)移指令進(jìn)行分支。圖1分支程序結(jié)構(gòu)流程圖通用格式:Jcondshort_lable操作:若滿足條件,則
將short_lableOFFSET→IP,實(shí)現(xiàn)轉(zhuǎn)移;否則順序執(zhí)行.short_lable→短標(biāo)號(hào),條件轉(zhuǎn)移是相對(duì)轉(zhuǎn)移指令,即從當(dāng)前地址到目標(biāo)地址的偏移量為-128~+127(從本指令則為-126~+129,因?yàn)闂l件轉(zhuǎn)移指令均為雙字節(jié)指令),故只能實(shí)現(xiàn)段內(nèi)轉(zhuǎn)移.8.2.1條件轉(zhuǎn)移指令僅判斷一個(gè)標(biāo)志位實(shí)現(xiàn)轉(zhuǎn)移.P205表8-1PF=0奇轉(zhuǎn)移JNP/JPOPF=1偶轉(zhuǎn)移
JP/JPEOF=0無溢出轉(zhuǎn)移JNOOF=1溢出轉(zhuǎn)移JOSF=0為正轉(zhuǎn)移JNSSF=1為負(fù)轉(zhuǎn)移JSCF=0無進(jìn)(借)位轉(zhuǎn)移JNCCF=1有進(jìn)(借)位轉(zhuǎn)移JCZF=0不相等/不等于0轉(zhuǎn)移JNE/JNZZF=1相等/等于0轉(zhuǎn)移JE/JZ標(biāo)志設(shè)置功能指令助記符1.簡(jiǎn)單條件轉(zhuǎn)移指令2.無符號(hào)數(shù)條件轉(zhuǎn)移指令
條件轉(zhuǎn)移常依據(jù)兩個(gè)數(shù)的關(guān)系來決定,兩個(gè)數(shù)的關(guān)系除相等與否,還有大小之分,比較大小時(shí),要區(qū)分是無符號(hào)數(shù)還是符號(hào)數(shù),否則答案不明確.如:0FFH>00H?
視為無符號(hào)數(shù)0FFH=255>00H;
視為符號(hào)數(shù)0FFH=-1﹤00H.所以,應(yīng)將兩種類型的數(shù)分開比較:對(duì)無符號(hào)數(shù)使用術(shù)語:低于/高于
Below/Above;對(duì)帶符號(hào)數(shù)使用術(shù)語:小于/大于
Less/Greater
無符號(hào)數(shù)條件轉(zhuǎn)移指令有4條(P206,表8-2):
指令助記符功能
JB/JNAE
JNB/JAE
JA/JNBE
JNA/JBE低于/不高于等于轉(zhuǎn)移不低于/高于等于轉(zhuǎn)移高于/不低于等于轉(zhuǎn)移不高于/低于等于轉(zhuǎn)移3.符號(hào)數(shù)條件轉(zhuǎn)移指令
符號(hào)數(shù)條件轉(zhuǎn)移指令有4條(P206,表8-3):指令助記符功能
JL/JNGE
JNL/JGE
JG/JNLE
JNG/JLE小于/不大于等于轉(zhuǎn)移不小于/大于等于轉(zhuǎn)移大于/不小于等于轉(zhuǎn)移不大于/小于等于轉(zhuǎn)移格式:JMPtarget操作:將控制轉(zhuǎn)向目的標(biāo)號(hào)target:
target在段內(nèi):target的偏移地址→IPtarget在段外:target的偏移地址→IPtarget的段基址→CS
條件轉(zhuǎn)移范圍為-128~+127,而無條件轉(zhuǎn)移指令沒有范圍限制。在分支程序中往往需要它將各分支重新匯集到一起.1.無條件直接轉(zhuǎn)移指令8.2.2無條件轉(zhuǎn)移指令格式:
JMPdest
操作:
目的操作數(shù)為寄存器→寄存器內(nèi)容送IP
目的操作數(shù)為字變量→字變量?jī)?nèi)容送IP
目的操作數(shù)為雙字變量→雙字變量?jī)?nèi)容送CS和IP如:JMPNEXT;無條件轉(zhuǎn)移到NEXT…NEXT:…如:JMPWORDPTR[BX];即[BX]→IPJMPDWORDPTR[BX];即[BX]→IP;[BX+2]→CS
2.無條件間接轉(zhuǎn)移指令[例6]編程計(jì)算下面函數(shù)值(X,Y均為字節(jié)符號(hào)數(shù))P207例8.7X、Y
(1)分析題目:同號(hào)異號(hào)>0<0(2)繪制程序流程圖:開始XY相異?AL←XX≥0Z←-1Z←0Z←1返回NYNYLP1LP2BACK8.2.3分支程序設(shè)計(jì)舉例XDB-5YDB20ZDB0
MOVZ,0MOVAL,XXORAL,YJSBACKMOVZ,1CMPX,0JNSBACKNEGZBACK:ret;根據(jù)X、Y的符號(hào)置SF,相同為0;相異為1,X、Y相異結(jié)束;Z賦1;相同后,判斷其中某數(shù)的符號(hào);大于等于0,結(jié)束;小于0,求補(bǔ)得1(3)程序設(shè)計(jì):[例7]無符號(hào)數(shù)字節(jié)變量X,判斷其值是否在10和20之間,即10≤X<20。如果M≥20,則送0FFH給ALH;如果M<10,則送00H給AL;如果10≤M<20,則送88H給AL。(1)分析題目:1020FFH88H00H(2)繪制程序流程圖:開始BL≥10BL←XBL<20AL←88HAL←00HAL←FFH返回NYNYLP1LP2LP3(3)編制的程序如下:START:MOVBL,XCMPBL,10;將BL的內(nèi)容和10相比較
JCLP1;小于10轉(zhuǎn)LP1 CMPBL,20;將BL的內(nèi)容和20相比較
JNCLP2;
AL≥20轉(zhuǎn)LP2
MOVAL,88H;將0FFH送入AL寄存器LP3: RET;返回LP1: MOVAL,00
JMPLP3LP2:MOVAL,0FFHJMPLP344[例8]從鍵盤上鍵入2位十六進(jìn)制數(shù)將其拼合成一個(gè)字節(jié)存入字節(jié)變量SB中。P209例8.9(1)思路:判斷字符為“0-9”還是“A-F”,如是“0-9”,則減去30H,否則減去37H,將字符變成數(shù)字。(2)畫流程圖:(3)編寫程序
開始AL<10鍵入2位16進(jìn)制數(shù)AH←AH-7返回YLNSUB7HNSUB7兩個(gè)字符送AXAL←AL-7HAH<10AX←AX-3030H將AX中的數(shù)拼合成一個(gè)字節(jié)送SBYNNIBUFDB3,0,3DUP(0)SBDB0 MOVDX,OFFSETIBUF;鍵入2位十六進(jìn)制數(shù) MOVAH,10 INT21H
MOVAX,WORDPTRIBUF+2
;鍵入字符送AX
SUBAX,3030H ;字符變?yōu)槭M(jìn)制數(shù) CMPAL,0AH
JBLNSUB7;鍵入的字符為0--9
SUBAL,7;鍵入的字符為A--F
LNSUB7: CMPAH,0AH
JBHNSUB7
SUBAH,7HNSUB7: MOVCL,4;將AX中的數(shù)拼合成一個(gè)字節(jié) SHLAL,CL ORAL,AH MOVSB,AL
ret[例9]某工廠的產(chǎn)品有8種不同的加工處理程序P0~P7,根據(jù)鍵盤輸入,做不同的處理,若是0~7以外的鍵,則退出加工處理(1)分析:可以用兩種方法實(shí)現(xiàn):用逐一比較判斷,逐次比較轉(zhuǎn)移實(shí)現(xiàn)二叉分支、整體上實(shí)現(xiàn)多分支;另一種是跳轉(zhuǎn)表法,直接實(shí)現(xiàn)多分支。(2)編寫程序47方法一︰逐一比較法.簡(jiǎn)單,條理清楚,易于實(shí)現(xiàn),但轉(zhuǎn)移范圍只能是:-128~+127INPUTDB’Input(0~7):$’AGAIN:MOVDX,OFFSETINPUT;顯示提示MOVAH,9INT21HMOVAH,1;等待鍵入一個(gè)字符INT21H
CMPAL,‘0’;為0字符則轉(zhuǎn)P0JEP0CMPAL,‘1’;為1字符則轉(zhuǎn)P1JEP148
CMPAL,‘2’JEP2CMPAL,‘3’JEP3CMPAL,‘4’JEP4CMPAL,‘5’JEP5CMPAL,‘6’JEP6CMPAL,‘7’JEP7RET;不是0~7則退出程序
P0:::JMPAGAINP1:::JMPAGAIN
::P7:::JMPAGAIN49
方法二:跳轉(zhuǎn)表法
利用無條件的間接轉(zhuǎn)移指令可實(shí)現(xiàn)遠(yuǎn)距離的多分支,間接跳轉(zhuǎn)至不同分支的入口處。在數(shù)據(jù)區(qū)造一地址表,存放不同的分支入口地址;設(shè)表的首地址為PTAB,每一個(gè)入口地址占一個(gè)字單元,∴Pi的入口地址=PTAB+(2*i)若將(2*i)→BX,則JMPPTAB[BX]可轉(zhuǎn)到Pi入口處PTABP0+2P1+4P250
INPUTDB’INPUT(0~7):$’
PTABDWP0,P1,P2,P3,P4,P5,P6,P7;定義地址表AGAIN:MOVDX,OFFSETINPUT;顯示提示MOVAH,9INT21H
MOVAH,1
;等待鍵入0~7的數(shù)字
INT21H
CMPAL,‘0’;檢查輸入數(shù)據(jù),不是0~7則退出JBEXITCMPAL,‘7’JAEXIT
ANDAX,0FH;i*2→BXADDAX,AXMOVBX,AXJMPPTAB[BX]
;(PTAB+2*i)=Pi→IPEXIT:RET51
P0::JMPAGAINP1::JMPAGAIN
:P7::JMPAGAIN鍵入的ASCⅡ碼為無符號(hào)數(shù),所以,用JB、JA等指令而不能用JG、JL等。?若為跨段標(biāo)號(hào),應(yīng)修改哪些地方?注:只需修改:DW→DD(存IP、CS)、i*2→i*4即可52分支實(shí)現(xiàn)的基本方法有兩種,一種是利用比較轉(zhuǎn)移指令實(shí)現(xiàn)分支,一種是利用跳轉(zhuǎn)表實(shí)現(xiàn)分支。視比較對(duì)象,正確選擇合適的轉(zhuǎn)移指令。要為每個(gè)分支安排正確出口。凡是可共用的部分,應(yīng)盡量放在公共程序段中以使程序簡(jiǎn)短。在調(diào)試分支程序時(shí),應(yīng)使用多組數(shù)據(jù),分別對(duì)各種分支進(jìn)行反復(fù)測(cè)試??偨Y(jié):分支程序設(shè)計(jì)時(shí)應(yīng)注意的事項(xiàng)本節(jié)課要求掌握無條件轉(zhuǎn)移指令和條件轉(zhuǎn)移指令掌握分支程序的結(jié)構(gòu)會(huì)編制簡(jiǎn)單分支程序本節(jié)課作業(yè)從鍵盤接收一個(gè)按鍵,如果為小寫字母則輸出"L",是大寫字母,則輸出"U",如果為數(shù)字則輸出"N",都不是則輸出"*"。循環(huán)程序的四部分:(1)循環(huán)準(zhǔn)備(循環(huán)初始化)
建地址指針、置計(jì)數(shù)初值、設(shè)置必要的常數(shù)、對(duì)工作寄存器及工作單元置初值或清0等.(2)循環(huán)體
重復(fù)執(zhí)行的部分,循環(huán)的核心.(3)循環(huán)的修改
修改計(jì)數(shù)器、寄存器、地址指針、恢復(fù)某些參數(shù).(4)循環(huán)控制
判斷控制循環(huán)是否結(jié)束或繼續(xù).8.3循環(huán)程序設(shè)計(jì)循環(huán)程序的具體結(jié)構(gòu)流程有兩種:初始化循環(huán)體修改結(jié)束循環(huán)?YN(a)先執(zhí)行,后判斷→至少執(zhí)行一次循環(huán)體初始化循環(huán)體修改進(jìn)入循環(huán)?YN(b)先判斷,后執(zhí)行→可以不執(zhí)行循環(huán)體8.3.1循環(huán)程序的基本結(jié)構(gòu)如:編程統(tǒng)計(jì)字變量W中有多少位1,并將結(jié)果存入字節(jié)變量N中。方法一:先執(zhí)行,后判斷
MOVN,0MOVCX,16LOP:SHLW,1JNCNOINCINCNNOINC:DECCX
JNZLOP
ret方法二:先判斷,后執(zhí)行
MOVN,0LOP:CMPW,0JZDONE
SHLW,1JNCLOP
INCN
JMPLOPDONE:ret思路:用移位指令將一位移入CF,CF=1,則N+1后移下一位,負(fù)責(zé)不加1,繼續(xù)移下一位。循環(huán)控制方法最常見的有兩種:⒈計(jì)數(shù)控制→
循環(huán)次數(shù)已知,故可用某個(gè)寄存器或單元作為計(jì)數(shù)器,用計(jì)數(shù)器的值來控制循環(huán)的結(jié)束與否.如上例,方法一⒉條件控制→
循環(huán)次數(shù)未知,即循環(huán)次數(shù)與循環(huán)體的執(zhí)行情況有關(guān),通過條件測(cè)試指令來測(cè)試是否滿足循環(huán)條件,以控制循環(huán)是否結(jié)束.如上例,方法二⒈LOOP指令格式:
LOOPshort-lable操作:CX-1→CX,當(dāng)CX≠0則轉(zhuǎn)short-lable所指指令;否則順序執(zhí)行.注:在使用LOOP指令前,必須把循環(huán)次數(shù)送入CX。LOOPshotr-lable=若CX=0,則循環(huán)要進(jìn)行65536次。
DECCXJNZshort-lable8.3.2重復(fù)控制指令⒉LOOPZ/LOOPE指令格式:
LOOPZ/LOOPEshort-lable操作:CX-1→CX,
當(dāng)CX≠0,且ZF=1則轉(zhuǎn)移;否則順序執(zhí)行.注:本指令不影響ZF,ZF由前面指令設(shè)定.即前面比較結(jié)果相等。格式:JCXZshort-lable操作:CX=0轉(zhuǎn)移,否則順序執(zhí)行.注:指令本身不作減操作,本指令一般用在循環(huán)的開始處,當(dāng)CX=0,則跳過循環(huán).⒊LOOPNZ/LOOPNE指令⒋JCXZ指令格式:
LOOPNZ/LOOPNEshort-lable操作:CX-1→CX,
當(dāng)CX≠0,且ZF=0則轉(zhuǎn)移;否則順序執(zhí)行。此類指令的特點(diǎn)是:循環(huán)次數(shù)由CX計(jì)數(shù)器控制。循環(huán)指令本身不影響標(biāo)志。同條件轉(zhuǎn)移指令一樣,重復(fù)控制指令也是相對(duì)轉(zhuǎn)移指令,重復(fù)控制指令的目的地址必須在本指令地址的-126~129字節(jié)的范圍之內(nèi)。[例9]編寫將某數(shù)據(jù)區(qū)十六進(jìn)制數(shù)加密的程序。每個(gè)數(shù)字占一個(gè)字節(jié)。P216例8.12(1)分析:16進(jìn)制數(shù)的加密數(shù)和相應(yīng)的解密數(shù)十六數(shù):0123456789ABCDEF
加密數(shù):A98EF10B25D3746C
解密數(shù):658BD9EC2107FA34
即發(fā)0,則發(fā)A;發(fā)3,則發(fā)E;發(fā)A,則發(fā)D解密規(guī)律→解密數(shù)的位移量=加密數(shù)的數(shù)值如:解密數(shù)0的位移量是=0AH
如:解密數(shù)4的位移量是=0FH8.3.3單重循環(huán)程序設(shè)計(jì)舉例1.計(jì)數(shù)控制的循環(huán)程序開始定義待發(fā)數(shù)存區(qū)返回統(tǒng)計(jì)待發(fā)數(shù)個(gè)數(shù)CX≠0給加密數(shù)分配存區(qū)YN存加密表初始化:設(shè)置計(jì)數(shù)器、指針BL←取待發(fā)數(shù)加密存加密數(shù)修改指針(2)說明:CX:計(jì)數(shù)器SI:待發(fā)數(shù)和加密數(shù)存儲(chǔ)器地址指針BX:加密表地址指針AL:累加器(3)繪制程序流程圖(4)編寫程序加密程序如下:HEXSDB1,2,…,0EH
;待發(fā)數(shù)
NEQU$-HEXS
;統(tǒng)計(jì)待發(fā)數(shù)個(gè)數(shù)JMHDBNDUP(0)
;給加密數(shù)分配存儲(chǔ)區(qū)域JMBDB0AH,9,8,0EH,0FH,1,0,0BH,2,5,0DH,3,7,4,6,0CH
MOVCX,N MOVSI,0MOVBH,0初始化AGN:MOVBL,HEXS[SI]
;取待發(fā)數(shù)
MOVAL,JMB[BX]
;[BX+JMB]→AL,即加密
MOVJMH[SI],AL
;存加密數(shù)
INCSI;指向下一數(shù)
LOOPAGN;計(jì)數(shù)控制
ret加密表解密程序:JMHDB0FH,0EH,8,9,0AH;加密數(shù)NEQU$-JMH;統(tǒng)計(jì)加密數(shù)個(gè)數(shù)KMBDB6,5,8,0BH,0DH,9,0EH,0CH,2,1,0,7,0FH,0AH,3,4KMHDBNDUP(0)
;存解密數(shù)
MOVCX,NMOVBX,OFFSETKMBMOVSI,0NEXT:MOVAL,JMH[SI]XLATMOVKMH[SI],AL
INCSI
LOOPNEXT ret初始化查表解密解密表[例10]將字節(jié)變量SB中的8位二進(jìn)數(shù)送顯示器顯示.P217例8.13分析:先將字節(jié)變量中的1位二進(jìn)制數(shù)移入AH中,再將移入的二進(jìn)制數(shù)變?yōu)锳SCII碼。SBDB9AHOBUFDB9DUP(0)MOVCX,8MOVBX,0MOVAL,SBAGAIN:MOVAH,0SHLAX,1ADDAH,30HMOVOBUF[BX],AH
INCBXLOOPAGAINMOV0BUF[BX],$
MOVDX,OFFSETOBUFMOVAH,9INT21HretSBDB9AHOBUFDB3DUP(0)MOVCX,204HMOVBX,0MOVAL,SBAGAIN:MOVAH,3SHLAX,CLCMPAH,39HJBENAD7ADDAH,7NAD7:MOVOBUF[BX],AH
INCBXDECCHJNZAGAINMOV0BUF[BX],$
MOVDX,OFFSETOBUFMOVAH,9INT21Hret以16進(jìn)制數(shù)顯示的程序(P218)2.條件控制的循環(huán)程序
[例11]將存儲(chǔ)器中的16位無符號(hào)二進(jìn)制數(shù)(65535)轉(zhuǎn)換成BCD數(shù),并以十進(jìn)制數(shù)在顯示器上顯示出來。P227例8.19(1)分析:N/10取其余數(shù),則為十進(jìn)制數(shù),重復(fù)直到商為0。它是次數(shù)未知的循環(huán),為條件控制循環(huán)。將余數(shù)→ASCⅡ,送顯示緩沖區(qū),用9號(hào)功能顯示即可.(2)說明:被除數(shù)DXAX
除數(shù)10:CX ASCII區(qū)指針:BX(3)繪流程圖(4)編寫程序binarydw1255hobufdb6dup(0)MOVBX,OFFSETOBUF+5;MOVBYTEPTR[BX],‘$’
MOVCX,10
MOVAX,BINARYAGN:MOVDX,0;被除數(shù)擴(kuò)展
DIVCX;余數(shù)→DX,商→AX
ADDDL,30H;十進(jìn)制數(shù)轉(zhuǎn)換為ASCⅡDECBX;修改地址指針
MOV[BX],DL
;存十進(jìn)制數(shù)字符
ORAX,AX;商為0?JNZAGN
MOVDX,BX;顯示MOVAH,9
INT21Hret開始定義16位數(shù)返回定義ASCII區(qū)CX=0初始化YNDX清零AX←取數(shù)據(jù)除以10,DX←個(gè)位個(gè)位數(shù)變成ASCII碼修改指針存字符顯示開始D
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 加盟健康中心合作合同范本
- 初創(chuàng)公司分紅合同范本
- 保證合同范本單方
- 醫(yī)用合同范本
- 單位和個(gè)人合伙合同范本
- 勞務(wù)門店合同范本
- 書畫居間合同范本
- 供用熱力合同范本
- 關(guān)聯(lián)交易合同范本
- 會(huì)展活動(dòng)合同范本
- 《當(dāng)代網(wǎng)絡(luò)文學(xué)作品發(fā)展研究6300字(論文)》
- 孟氏骨折與蓋氏骨折講解學(xué)習(xí)
- GB/T 9386-2008計(jì)算機(jī)軟件測(cè)試文檔編制規(guī)范
- GB/T 25137-2010鈦及鈦合金鍛件
- 第2課《說和做》課件(共30張ppt) 部編版語文七年級(jí)下冊(cè)
- 2022年廉政談話公司紀(jì)委書記對(duì)干部任前廉潔警示談話講話范文集團(tuán)國(guó)有企業(yè)國(guó)企新任職
- 《鐵道車輛工程》第05章鐵道車輛的運(yùn)行性能課件
- 七上解一元一次方程100道練習(xí)題(有答案)
- 跨境電商推廣(EDM、SEO、SEM、Facebook、YouTube、Twitter等)課件
- 中國(guó)古代服飾文化135張課件
- 《道德與法治》五下第一單元《我們一家人》教案
評(píng)論
0/150
提交評(píng)論