




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
3.3.程序的基本結(jié)構(gòu)最基本的程序結(jié)構(gòu):順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)。AB順序結(jié)構(gòu)分支結(jié)構(gòu)判斷ABNYABC1ABC2ABC3子程序、中斷服務(wù)程序是一種特殊的程序,它們也是由以上三種基本結(jié)構(gòu)構(gòu)成的。i=初值A(chǔ)修改并判斷iYN循環(huán)結(jié)構(gòu)BGLUT_C2013-08J.CB13.3.1簡(jiǎn)單程序設(shè)計(jì)例:編寫程序?qū)⒆肿兞縒中的無(wú)符號(hào)數(shù)W=65525除以8,將商保存在字變量QOUT中,將余數(shù)保存在字節(jié)變量REMA中。算法分析:可以使用除法指令,也可以使用右移三位實(shí)現(xiàn)除以8的運(yùn)算。65525→0FFF5H11111111
11110101B(1)右移3位,移出的三位就是余數(shù),剩余的就是商。余數(shù)的保留:可以選擇兩種方法GLUT_C2013-08J.CB211111111
11110101CREMA→→0111111111111010C10000000→→0011111111111101C01000000→→000111111111110C10100000→→10100000右移5位00000101GLUT_C2013-08J.CB3開始定義W、QOUT、REMAAX←W,BL←0AX右移1位,最低位移進(jìn)CBL右移1位,C移入它的最高位AX右移1位,最低位亦如CBL右移1位,C移入最高位AX右移1位,最低位亦如CBL右移1位,C移入最高位QOUT←AXBL右移5位,REMA←BL結(jié)束使用偽指令定義W、QOUT、REMA三個(gè)內(nèi)存單元,W、QOUT為16位,REMA為8位。這里的結(jié)束是結(jié)束應(yīng)用程序,返回操作系統(tǒng)。可以使用INT21H的4CH號(hào)功能調(diào)用返回操作系統(tǒng)
MOV AH,4CHINT 21HGLUT_C2013-08J.CB4DATASEGMENTDATAW DW 65525QOUT DW ?REMA DB ?DATAENDSCODE SEGMENTCODEASSUMECS:CODE,DS:DATASTART:MOV AX,DATA ;取數(shù)據(jù)段開始地址
MOV DS,AX ;數(shù)據(jù)段開始地址送數(shù)據(jù)段基址寄存器
MOV AX,W ;從存儲(chǔ)器取出DS:WAX MOV BL,0 ;余數(shù)寄存器清0 SHR AX,1 ;無(wú)符號(hào)數(shù),邏輯右移1位,高位移入0, ;W最低位進(jìn)入C RCR BL,1 ;帶進(jìn)位循環(huán)右移1位,C進(jìn)入BL最高位
SHR AX,1 ;邏輯右移1位,高位補(bǔ)0,W次低位進(jìn)入C RCR BL,1 ;帶進(jìn)位循環(huán)右移1位
SHR AX,1 ;邏輯右移1位,高位補(bǔ)0,W次低位進(jìn)入C RCR BL,1 ;帶進(jìn)位循環(huán)右移1位,余數(shù)在BL高3位
MOV CL,5數(shù)據(jù)段結(jié)束代碼段開始數(shù)據(jù)段開始GLUT_C2013-08J.CB5
SHR BL,CL ;余數(shù)右移5位,將其移到BL低3位
MOV QOUT,AX ;保存商
MOV REMA,BL ;保存余數(shù)
MOV AH,4CH INT 21HCODEENDS END本程序是返回操作系統(tǒng)代碼段結(jié)束匯編源程序結(jié)束GLUT_C2013-08J.CB6還有就是:W直接取低3位作為余數(shù)然后W右移3位得到商開始定義W、QOUT、REMAAX←W,REMA←7REMA←REMAANDALAX右移3位QOUT←AX開始AX右移3位:MOVCL,3SHRAX,CL注意:如果是帶符號(hào)數(shù),就要用算術(shù)右移SAR,不要用邏輯右移SHRGLUT_C2013-08J.CB7
…… MOV AX,W ;從變量W取數(shù)據(jù)
MOVREMA,7 ;余數(shù)變量REMAP賦值00000111B AND REMA,AL ;余數(shù)是AL的最低3位,
MOVCL,3 ; SHR AX,CL ;邏輯右移3位,AX中得到商
MOV QOUT,AX ;保存商
MOV AH,4CH INT 21H該程序結(jié)果相同,但程序代碼簡(jiǎn)單了,執(zhí)行速度也快了GLUT_C2013-08J.CB8(2)使用除法指令
DIVsrc注意:對(duì)于8086處理器為了商是字?jǐn)?shù)據(jù),被除數(shù)32位:DXAX(DX=0,AX=W)除數(shù)16位BX=8DIVBX商在AX,余數(shù)在DX,對(duì)于本次運(yùn)算,余數(shù)為字節(jié)數(shù)據(jù),實(shí)際上只有DL有效.DATAW DW65525QOUTDW?REMADB?.CODE MOV AX,DATA MOV DS,AX MOV DX,0 MOV AX,W MOV BX,8 DIV BX MOV QOUT,AX MOV REMA,DL MOV AH,4CH INT 21H END如果是帶符號(hào)數(shù),應(yīng)該使用符號(hào)擴(kuò)展指令CWD和帶符號(hào)除法指令I(lǐng)DIV由于題目指定是無(wú)符號(hào)數(shù),這里可以將高16位擴(kuò)展為0,用DIV除法指令GLUT_C2013-08J.CB9例將AX中的3位BCD數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)存入字節(jié)變量SB中(AX中的數(shù)大于0,小于255)每位十進(jìn)制用一個(gè)8421編碼(自然二進(jìn)制編碼)表示(即每一位十進(jìn)制數(shù)都是用二進(jìn)制表示)十進(jìn)制數(shù)的展開表達(dá)式3位BCD碼N2N1N00ALAHGLUT_C2013-08J.CB10主要部分程序流程圖AL=AL+AHAL=AL*CHAHBLAL=百位*10既執(zhí)行AL=AL*CHAL=BLand0FHAL=AL+BL因百位*10不會(huì)大于255,AH=0,可以使用AH右移4位,高位補(bǔ)0得到十位數(shù)ALSB保留個(gè)位十位到BL取百位到ALALAHCH10,CL=4AH=BLAH右移4位得到十位由于題目給出不大于255,因此最后一次乘10加個(gè)位也只是一個(gè)字節(jié)相加GLUT_C2013-08J.CB11
M0VCH,10 MOVCL,4 MOVBL,AL ;暫存十位和個(gè)位到BL, MOVAL,AH ;百位存入AL中
MULCH ;百位×10→AX MOVAH,BL SHRAH,CL ;取十位
ADDAL,AH ;百位×10+十位→AL MULCH ;(百位×10+十位)×10→AX ANDBL,0FH ;取個(gè)位
ADDAL,BL ;(百位×10+十位)×10+個(gè)位→AL
;約定結(jié)果不大于255 MOV[SB],AL;AL→SB,如果沒(méi)有明確結(jié)果不大于255,則需要考慮16位結(jié)果GLUT_C2013-08J.CB120~999的BCD數(shù)轉(zhuǎn)換為二進(jìn)制,主要部分程序流程圖AL取百位AX百位*10AH取十位百位*10+十位AL=AL+AHAX=AL*10BX=BXand0FHAX=AX+BX因百位*10不會(huì)大于255,AH=0,可以使用AH右移4位,高位補(bǔ)0得到十位數(shù)AXSBSB應(yīng)該是字操作數(shù)(16位)加個(gè)位,BH要清0AX為000~999之間的BCD數(shù)(百位*10+十位)*10GLUT_C2013-08J.CB13
M0VCH,10 MOVCL,4 MOVBL,AL;暫存十位和個(gè)位到BL, MOVAL,AH;百位存入AL中
MULCH;百位×10→AX MOVAH,BL SHRAH,CL;取十位
ADDAL,AH;百位×10+十位→AL MULCH;(百位×10+十位)×10→AX ANDBX,0FH;取個(gè)位
ADDAX,BX;(百位×10+十位)×10+個(gè)位→SB
;最后結(jié)果為16位數(shù),不能簡(jiǎn)單+低8位
MOV[SB],AX;AXSBGLUT_C2013-08J.CB14
簡(jiǎn)單程序設(shè)計(jì)例下面再看幾個(gè)補(bǔ)充的例題。例
:將存儲(chǔ)器單元DAT1中保存的一個(gè)組合BCD數(shù)轉(zhuǎn)換成兩個(gè)對(duì)應(yīng)ASCII碼值,并存入DAT2開始的兩個(gè)單元,低位在前,高位在后。GLUT_C2013-08J.CB15BCD碼轉(zhuǎn)換成ASCII碼數(shù)據(jù):非壓縮BCD數(shù)據(jù)在高半字節(jié)+3.例如數(shù)字55:0000010100110101000001010011000000110101用邏輯或指令OROR000001010011000000110101用加法指令OR+得到的結(jié)果是相同的。都是在高半字節(jié)加3。GLUT_C2013-08J.CB16該問(wèn)題算法就很簡(jiǎn)單:從DAT1取出BCD數(shù)據(jù),先將高4位清“0”,與30H相加或進(jìn)行邏輯或運(yùn)算,存入DAT2,再取出數(shù)據(jù),將數(shù)據(jù)邏輯右移4位(高位BCD數(shù)移到低4位,高4位變“0”,再與30H相加(或進(jìn)行邏輯或),存入DAT2+1單元。程序流程圖:GLUT_C2013-08J.CB17程序流程圖程序代碼DATASEGMENT DAT1DB34H
;待轉(zhuǎn)換的數(shù) DAT2DB?,?DATAENDSCODESEGMENTASSUMECS:CODE,
DS:DATASTARA:
MOVAX,DATA MOVDS,AX
;送段地址
LEASI,DAT1LEADI,DAT2 MOVAL,[SI] ANDAL,0FH ADDAL,30H MOV[DI],AL MOVAL,[SI]
開始段定義AL(SI)AL(AL)FH(DI)(AL)+30HAL(SI)結(jié)束AL(AL)右移4位(DI+1)(AL)+30H設(shè)置DS,SIDAT1DIDAT2顯示:MOVDL,ALMOVAH,02HINT21HGLUT_C2013-08J.CB18
MOVCL,4SHRAL,CLORLAL,30H MOV[DI+1],AL MOVAH,4CH INT21HCODEENDS ENDSTART如果要送到屏幕顯示,則將轉(zhuǎn)換結(jié)果先送DL,02送AH,調(diào)用DOS功能。送ASCII字符顯示的系統(tǒng)調(diào)用: 功能AH=02H,
需要顯示的字符ASCII碼DL
, 執(zhí)行INT21H顯示:MOVDL,ALMOVAH,02HINT21HAH=4CH功能調(diào)用。功能是結(jié)束本程序,返回DOSGLUT_C2013-08J.CB19再看一個(gè)順序程序:
編寫一個(gè)計(jì)算Z=(x2-3y)/2的程序,x,y為單字節(jié)正整數(shù),Z用2字節(jié)保存。這是一個(gè)算術(shù)運(yùn)算程序,算法設(shè)計(jì):首先計(jì)算X2=X*X,暫存該結(jié)果,其次計(jì)算3*y,第三步計(jì)算X2-3*y第四步計(jì)算(x2-3y)/2。該步使用算術(shù)右移實(shí)現(xiàn)除2運(yùn)算,比用除法指令執(zhí)行速度快。依據(jù)該算法,可以畫出程序流程框圖。GLUT_C2013-08J.CB20開始計(jì)算Z=x*x計(jì)算Z=(X*X-3Y)/2結(jié)束計(jì)算3*yX2的計(jì)算,可以分解為3*Y的計(jì)算,可以分解為ALxMULALBXAXCXAXADDAX,CXADDAX,CXALY,AH=0GLUT_C2013-08J.CB21;數(shù)據(jù)段定義
DATA SEGMENT X DB25 Y DB32 Z DW ? DATAENDS;代碼段開始
CODE SEGMENT ASSUMECS:CODE,DS:DATA
EXPREPROCFAR
;過(guò)程定義,遠(yuǎn)過(guò)程 START:PUSHDS;DS:00保存的是一條返回
SUBAX,AX ;DOS指令。
PUSHAX ;這里,將返回DOS的地址
;壓入堆棧
MOVAX,DATA操作系統(tǒng)會(huì)自動(dòng)在DS:00處安排一條返回操作系統(tǒng)的指令,故子程序開始處向堆棧中壓入DS:00執(zhí)行RET指令,則就是轉(zhuǎn)到DS:00——返回DOSGLUT_C2013-08J.CB22 MOVDS,AX
;數(shù)據(jù)段首地址(基地址) MOVAL
,
X
;取變量X
MOVBL,AL
MULBL ;X*X=X2
MOVBX,AX
MOVAL,
Y
;取變量Y
MOVAH,0 ;正整數(shù),高字節(jié)直接擴(kuò)展0
MOVCX,AX ADDAX,CX ;2Y ADDAX,CX ;3Y
XCHGAX,BX
SUB
AX,BX
;X2-3Y SHR
AX,1
;右移一位/2 MOV
Z,
AX RET ;將DS:00彈出到CS:IP
EXPREENDP;過(guò)程定義結(jié)束CODEENDS ENDSTARTRET指令,轉(zhuǎn)到DS:00,對(duì)于EXE格式程序,它是一條返回DOS的指令。GLUT_C2013-08J.CB23;數(shù)據(jù)段定義
DATA SEGMENT X DB25 Y DB32 Z DW ? DATAENDS;代碼段開始
CODE SEGMENT ASSUMECS:CODE,DS:DATAMOVAX,DATA MOVDS
,
AX MOVAL
,
X MOV BL,AL可以使用常規(guī)返回DOS方法——INT21H的4CH功能調(diào)用GLUT_C2013-08J.CB24
MULBL ;X*X=X2
MOVBX,AX
MOVAL,
Y
;Y
MOVAH,0
MOVCX,AX ADDAX,CX ;2Y ADDAX,CX ;3Y
XCHGAX,BX
SUB
AX,
BX
;X2-3Y SHR
AX,1
;右移一位/2 MOV
Z,
AX MOVAH,4CH INT21H EXPREENDP;過(guò)程定義結(jié)束
CODEENDS ENDSTART用INT21的4CH號(hào)功能調(diào)用返回DOS。GLUT_C2013-08J.CB25例BCD加法程序例如:已知字變量W1、W2分別存放兩個(gè)非壓縮的BCD數(shù),編寫程序求兩數(shù)之和,并將結(jié)果存入SUM字變量中。注意:W!,W2為2為字變量(2字節(jié))壓縮BCD數(shù),00~99,它們的和則可能為3位BCD數(shù),故SUM應(yīng)該定義3個(gè)字節(jié)(用DB定義三個(gè)字節(jié))。計(jì)算機(jī)內(nèi)部只有二進(jìn)制運(yùn)算指令,對(duì)于BCD數(shù)運(yùn)算,是十進(jìn)制數(shù),用二進(jìn)制運(yùn)算指令運(yùn)算,需要進(jìn)行調(diào)整。 加法、減法、乘法在運(yùn)算后進(jìn)行調(diào)整 除法在運(yùn)算前先進(jìn)行調(diào)整。只有字節(jié)運(yùn)算才能進(jìn)行調(diào)整
非壓縮BCD數(shù)加法調(diào)整AAA(壓縮BCD數(shù)加法用DAA)GLUT_C2013-08J.CB26壓縮BCD加法后,用DAA調(diào)整非壓縮BCD加法后,用AAA調(diào)整壓縮BCD減法后,用DAS調(diào)整非壓縮BCD加法后,用AAS調(diào)整壓縮BCD加法后,用AAM調(diào)整(壓縮的BCD乘法,不能調(diào)整)除法指令前用AAD調(diào)整(存放在AX中的兩位非壓縮BCD數(shù))開始定義W1、W2、SUMAL←W1第一字節(jié)(個(gè)位)ADDAL,W2第一字節(jié),AAAC送SUM+2最低位(百位)結(jié)束SUMALAL←W1第二字節(jié)(十位)ADCAL,W2第二字節(jié),AAASUM+1AL將SUM+2清0,然后進(jìn)行帶進(jìn)位的循環(huán)左移,就可將CY移進(jìn)SUM+2最低位,其余位=0GLUT_C2013-08J.CB27例如:0809+0607=010506,程序段如下:DATASEGMENTW1DW0809HW2DW06078HSUMDB3DUP(0)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKMOVAX,DATAMOVDS,AX ;MOVAL,BYTEPTRW1
;取第一個(gè)數(shù),AL=09HADD
AL,BYTEPTRW2
;AL=09H+07=10h,AF=1AAA
;AL=06H,產(chǎn)生CF=1
MOV[SUM],AL;保存?zhèn)€位,進(jìn)位信號(hào)在CFMOVAL,BYTEPTRW1+1;AL=08H
GLUT_C2013-08J.CB28
ADCAL,BYTEPTRW2+1;AL=0FH,CF=0AAA
;AL=05H,CF=1MOVSUM+1,AL;存百位和千位
MOVSUM+2,0;處理向百位的進(jìn)位,先將SUM+2RCLUM+2,1 ;清0,然后用帶進(jìn)位循環(huán)左移指
;令將進(jìn)位位移到SUM+2最低位實(shí)際上,在SUM定義時(shí),已經(jīng)初始化為0,程序中可以不清0定義的變量W1,W2,SUM在匯編語(yǔ)言源程序中可以直接使用,匯編程序在對(duì)源程序進(jìn)行匯編時(shí),可以識(shí)別是從變量所存放的存儲(chǔ)器中取出數(shù)據(jù)——實(shí)際上就是匯編程直接尋址指令
MOVAL,[W1],為了書寫簡(jiǎn)單,我們直接寫成MOVAL,W1.GLUT_C2013-08J.CB29以上例子,有一些只給出了實(shí)現(xiàn)所要求功能的核心部分分代碼,沒(méi)有給出段定義的完整部分。有一些則給出了包含段定義的完整代碼;段定義的格式是相似的,可以參照教材上的例子和前面的段定義例子編寫。教材上還有一些順序程序的例子,由于時(shí)間關(guān)系,就不一一列舉了。GLUT_C2013-08J.CB30順序程序的結(jié)構(gòu)簡(jiǎn)單,但實(shí)際程序設(shè)計(jì)中,往往需要對(duì)某些條件進(jìn)行判斷,依據(jù)不同的條件執(zhí)行不同的分支,這樣,順序程序?qū)⒉荒軡M足要求。GLUT_C2013-08J.CB313.3.2
分支程序的設(shè)計(jì)
就是利用CPU的條件轉(zhuǎn)移指令,通過(guò)判斷某個(gè)標(biāo)志為的狀態(tài),控制程序的執(zhí)行過(guò)程。PF=0奇轉(zhuǎn)移JNP/JPOPF=1偶轉(zhuǎn)移
JP/JPEOF=0無(wú)溢出轉(zhuǎn)移JNOOF=1溢出轉(zhuǎn)移JOSF=0為正轉(zhuǎn)移JNSSF=1為負(fù)轉(zhuǎn)移JSCF=0無(wú)進(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è)置功能指令助記符GLUT_C2013-08J.CB32二分支結(jié)構(gòu)分支結(jié)構(gòu)判斷ABNYABC1ABC2ABC3分支結(jié)構(gòu)判斷BNYABC1ABC2GLUT_C2013-08J.CB33多分支結(jié)構(gòu)條件判斷1Y……程序1N條件判斷2Y程序2條件判斷n程序nY程序n+1NNGLUT_C2013-08J.CB34也可以按照條件編碼實(shí)現(xiàn)多分枝轉(zhuǎn)移例如段內(nèi)間接轉(zhuǎn)移指令JMPREG轉(zhuǎn)移到CS:AXJMPWORDPTRMEM轉(zhuǎn)移到CS:[MEM]AX←條件編碼CODAX←AX*kJMPAX分支程序0分支程序1分支程序nCOD=0COD=1COD=nK是一個(gè)不小于2的整數(shù)。GLUT_C2013-08J.CB35我們還是通過(guò)實(shí)例來(lái)討論。例:內(nèi)存單元M中有一個(gè)16位的帶符號(hào)數(shù),求它的絕對(duì)值,并將結(jié)果放回原處。
算法:求一個(gè)數(shù)的絕對(duì)值時(shí),如果是正數(shù),絕對(duì)值不變,如果是負(fù)數(shù),則求它的機(jī)器負(fù)數(shù)(連同符號(hào)位一起每位取反,最低位+1,就是使用NEG指令)。有了算法,可以畫出程序流程圖。GLUT_C2013-08J.CB36轉(zhuǎn)移目的指令給出標(biāo)號(hào)(符號(hào)地址)開始設(shè)置DSSIMAX[SI]ORLAX,AXSF=0NEGAXNYDONE[SI](AX)結(jié)束N_DATAN_DATA,負(fù)數(shù),該標(biāo)號(hào)為了閱讀程序方便判斷數(shù)據(jù)的符號(hào),在X86中就是判斷SF標(biāo)志位,數(shù)據(jù)傳送指令不改變標(biāo)志位,因此用一條邏輯運(yùn)算指令ORLAx,AX,它不改變AX的值,但設(shè)置標(biāo)志位SFGLUT_C2013-08J.CB37
DATASEGMENT
MDW789AH ;可以任意輸入一個(gè)數(shù)
DATAENDSCODESEGMENT
ASSUMECS:CODE2,DS:DATA2START:MOVAX,DATA MOVDS,AX LEASI,M;MOVSI,OFFSETM MOVAX,[SI] ORLAX,AX;ANDAX,AX JNSDONE
;符號(hào)為SF=0轉(zhuǎn)移到DONEN_DATA:NEGAX
;負(fù)數(shù),利用NEG指令求負(fù)DONE:MOV[SI],AX MOVAH,4CH INT21HCODEENDSEND
GLUT_C2013-08J.CB38多分支程序?qū)Ψ种С绦?,可以由這種2分支程序構(gòu)成。滿足條件1?NYFUN1滿足條件2?滿足條件3?分支4分支3分支2分支1YYNNFUN2FUN3FUN4FUN5TST2TST1TST3GLUT_C2013-08J.CB39計(jì)算函數(shù)的程序,x是十六位長(zhǎng)度字?jǐn)?shù)據(jù)算法分析:取出數(shù)據(jù)X,判斷它的符號(hào),首先判斷是否>=0,如果不是,則是負(fù)數(shù),Y=-1,如果是,還須再次判斷是否等于0。程序流程框圖為:GLUT_C2013-08J.CB40開始段定義及初始化取數(shù)據(jù)-->AX(AX)≥0?(AX)=0?Y=-1Y=0Y=1結(jié)束YYNNLP1LP3LP2END1畫流程圖的時(shí)候,對(duì)轉(zhuǎn)移目標(biāo)地址(最好是分支程序的兩個(gè)分支點(diǎn))都給出一個(gè)標(biāo)號(hào),在寫代碼時(shí)好使用LP0GLUT_C2013-08J.CB41DATASEGMENT
XDW-8
YDB?DATAENDSCODESEGMENT
ASSUMECS:CODE3,DS:DATA3START: MOVAX,DATA3;設(shè)置段基址
MOVDS,AX LEASI,X ;取偏移地址
MOVAX,[SI] ANDAX,AXGLUT_C2013-08J.CB42
JNSLP1 ;SF=0,轉(zhuǎn)到LP1LP0:
MOVY,0FFH ;<0,Y=-1的補(bǔ)碼
JMPEND1LP1:
JZLP3
;X>=0,繼續(xù)判斷,
;=0轉(zhuǎn)到LP3LP2:
MOVY,01H ;X>0時(shí),y=1 LJMPEND1LP3:
MOV Y,00H ;X=0時(shí),Y=0END1:
MOVAH,4CH ;返回操作系統(tǒng) INT21HCODEENDS ENDSTARTGLUT_C2013-08J.CB43教材上有一個(gè)例子(102頁(yè)例3.7)算法分析:取出數(shù)據(jù)X,Y,異或,判斷符號(hào),SF=1,表明符號(hào)異號(hào)Z=0;SF=0,表明符號(hào)相同,判斷是否X>0,是,Z=1,否Z=-1。GLUT_C2013-08J.CB44多分支的另一種實(shí)現(xiàn)方法除了用二分支指令實(shí)現(xiàn)多分支外,還可以用以下指令實(shí)現(xiàn):
JMPREG ;
JMPWORDPTRMEM例如,我們要依據(jù)AL中的低4位數(shù)據(jù)(0~15)不同,分別轉(zhuǎn)移到對(duì)應(yīng)的分支去執(zhí)行,每個(gè)分支約定占用200字節(jié)空間。這類指令應(yīng)用方法如下:GLUT_C2013-08J.CB45
ANL AL,0FH MOVBL,100 MUL BL MOV AX,FUN0 ; JMP AXFUN0: ….
ORGFUN0+100
FUN1: … ;FUN1-FUN0=100
;可以用定位偽指令確定每個(gè)… ;分支相距的距離
ORGFUN14+100 ;只要保證這段空間能存下FUN15: … ;這段代碼。也可以是一個(gè)轉(zhuǎn)移表,利用遠(yuǎn)轉(zhuǎn)移指令轉(zhuǎn)到各處理程序,這樣各功能分值的距離就比較小,而且相距的字節(jié)數(shù)也相同。GLUT_C2013-08J.CB46例3.9從鍵盤上鍵入2位十六進(jìn)制數(shù)將其拼合成一個(gè)字節(jié)存入字節(jié)變量SB中。DATASEGMENT IBUF DB3,0,3DUP(0) SB DB0DATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATA MOV AX,DATA MOV DS,AX MOVDX,OFFSETIBUF;鍵入2位十六進(jìn)制數(shù)
MOVAH,10 INT21H MOVAX,WORDPTRIBUF+2;鍵入字符從+2單元開始,取出送AX
SUBAX,3030H ;字符變?yōu)槭M(jìn)制數(shù)
CMPAL,0AH JBLNSUB7 ;0·9,ASCII-30H就是它對(duì)應(yīng)的HEX值
SUBAL,7 ;A·F,ASCII-37H就是它對(duì)應(yīng)的HEX值GLUT_C2013-08J.CB47LNSUB7:CMPAH,0AH JBLNSUB7 SUBAH,7HNSUB7:MOVCL,4 ;將AX中的數(shù)拼合成一個(gè)字節(jié)
SHLAL,CL ORAL,AH MOVSB,AL MOVAH,4CH INT21HCODEENDS ENDGLUT_C2013-08J.CB48例3.10某工廠的產(chǎn)品有8種不同的加工處理程序P0~P7,根據(jù)鍵盤輸入,做不同的處理,若是0~7以外的鍵,則退出加工處理
此例可以用兩種方法實(shí)現(xiàn):一種是用逐一比較判斷,逐次比較轉(zhuǎn)移實(shí)現(xiàn)二叉分支、整體上實(shí)現(xiàn)多分支;另一種是跳轉(zhuǎn)表法,直接實(shí)現(xiàn)多分支.GLUT_C2013-08J.CB49方法一︰逐一比較法.簡(jiǎn)單,條理清楚,易于實(shí)現(xiàn),但轉(zhuǎn)移范圍只能是:-128~+127DATA SEGMENT INPUTDB’Input(0~7):$’DATAENDSCODESEGMENT MOV AX,DATA MOV DS,AX
MOVDX,OFFSETINPUT
;顯示提示符
MOVAH,9 ;09號(hào)功能是顯示字符串,$是字符串結(jié)束符
INT21H ;
MOVAH,1
;等待鍵入一個(gè)字符到AL,
INT21HCMPAL,’0’
;為0字符則轉(zhuǎn)P0
JEP0CMPAL,’1’
;為1字符則轉(zhuǎn)P1
JEP1GLUT_C2013-08J.CB50
CMPAL,’2’ JEP2 CMPAL,’3’ JEP3 CMPAL,’4’
JEP4 CMPAL,’5’ JEP5 CMPAL,’6’ JEP6 CMPAL,’7’ JEP7 JMPDOWN
;
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 農(nóng)牧工廠養(yǎng)殖合同范本
- 2025年中國(guó)婚介網(wǎng)站行業(yè)市場(chǎng)發(fā)展監(jiān)測(cè)及投資潛力預(yù)測(cè)報(bào)告
- 農(nóng)村自建橋拆除合同范本
- 科技創(chuàng)新在商業(yè)領(lǐng)域的應(yīng)用與推廣-以科技中心為例
- 上海五金倉(cāng)儲(chǔ)托管合同范本
- 農(nóng)村漁塘養(yǎng)殖合同范本
- 修車配件出售合同范本
- 介紹工作合同范本
- 環(huán)保產(chǎn)業(yè)創(chuàng)新與技術(shù)發(fā)展報(bào)告
- 代理用電收費(fèi)合同范本
- 《社區(qū)康復(fù)》課件-第五章 脊髓損傷患者的社區(qū)康復(fù)實(shí)踐
- 2024年01月北京市地質(zhì)礦產(chǎn)勘查院所屬事業(yè)單位招考聘用筆試歷年高頻考題(難、易錯(cuò)點(diǎn)薈萃)答案帶詳解附后
- 新產(chǎn)品開發(fā)(toshiba案例分析組)
- 網(wǎng)絡(luò)傳播概論(彭蘭第5版) 課件全套 第1-8章 網(wǎng)絡(luò)媒介的演變-網(wǎng)絡(luò)傳播中的“數(shù)字鴻溝”
- 4.1.1 有理數(shù)指數(shù)冪-參考課件
- 雷達(dá)簡(jiǎn)介講解課件
- 人教版六年級(jí)數(shù)學(xué)下冊(cè)全冊(cè)大單元教學(xué)任務(wù)單
- JJF(新) 112-2023 微量殘?zhí)繙y(cè)定儀校準(zhǔn)規(guī)范
- 超載限位器調(diào)試報(bào)告
- 2024銷售人員年終工作總結(jié)2篇
- 2024年牛排行業(yè)分析報(bào)告及未來(lái)發(fā)展趨勢(shì)
評(píng)論
0/150
提交評(píng)論