第8章-匯編語言程序設(shè)計(jì)(第4版)課件_第1頁
第8章-匯編語言程序設(shè)計(jì)(第4版)課件_第2頁
第8章-匯編語言程序設(shè)計(jì)(第4版)課件_第3頁
第8章-匯編語言程序設(shè)計(jì)(第4版)課件_第4頁
第8章-匯編語言程序設(shè)計(jì)(第4版)課件_第5頁
已閱讀5頁,還剩71頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論