第3章 常用偽指令與匯編語言程序設(shè)計(jì)(2)-順序程序與分支程序_第1頁
第3章 常用偽指令與匯編語言程序設(shè)計(jì)(2)-順序程序與分支程序_第2頁
第3章 常用偽指令與匯編語言程序設(shè)計(jì)(2)-順序程序與分支程序_第3頁
第3章 常用偽指令與匯編語言程序設(shè)計(jì)(2)-順序程序與分支程序_第4頁
第3章 常用偽指令與匯編語言程序設(shè)計(jì)(2)-順序程序與分支程序_第5頁
已閱讀5頁,還剩50頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、GLUT_C 2013-08 J.CB13.3. 程序的基本結(jié)構(gòu)程序的基本結(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ù)程序是一種特殊的程序,它們也是由以上子程序、中斷服務(wù)程序是一種特殊的程序,它們也是由以上三種基本結(jié)構(gòu)構(gòu)成的。三種基本結(jié)構(gòu)構(gòu)成的。i=初值A(chǔ)修改并判斷i YN循環(huán)結(jié)構(gòu)BGLUT_C 2013-08 J.CB23.3.1 簡(jiǎn)單程序設(shè)計(jì)簡(jiǎn)單程序設(shè)計(jì)例:編寫程序?qū)⒆肿兞縒中的無符號(hào)數(shù)W=65525除以8,將商保存在字變量QOUT中,將余數(shù)保存在字節(jié)變量REMA中。算法分析:可以使用除法指令,也可以使用右移三

2、位實(shí)現(xiàn)除以8的運(yùn)算。65525 0FFF5H 1111 1111 1111 0101B(1)右移3位,移出的三位就是余數(shù),剩余的就是商。余數(shù)的保留:可以選擇兩種方法GLUT_C 2013-08 J.CB31111 1111 1111 0101CREMA01111 1111 1111 010C1000 0000001111 1111 1111 01C0100 0000000111 1111 1111 0C1010 00001010 0000右移右移5位位00000101GLUT_C 2013-08 J.CB4開始開始定義定義W、QOUT、REMAAXW, BL 0AX右移右移1位,最低位移進(jìn)位,

3、最低位移進(jìn)CBL右移右移1位,位,C移入它的最高位移入它的最高位AX右移右移1位,最低位亦如位,最低位亦如CBL右移右移1位,位,C移入最高位移入最高位AX右移右移1位,最低位亦如位,最低位亦如CBL右移右移1位,位,C移入最高位移入最高位QOUTAXBL右移右移5位位,REMA BL結(jié)束結(jié)束使用偽指令定義使用偽指令定義W、QOUT、REMA三個(gè)內(nèi)存三個(gè)內(nèi)存單元,單元,W、QOUT為為16位,位,REMA為為8位。位。這里的結(jié)束是結(jié)束這里的結(jié)束是結(jié)束應(yīng)用程序,返回操應(yīng)用程序,返回操作系統(tǒng)。作系統(tǒng)??梢允褂每梢允褂肐NT 21H的的 4CH號(hào)功能調(diào)號(hào)功能調(diào)用返回操作系統(tǒng)用返回操作系統(tǒng) MOV A

4、H,4CH INT 21HGLUT_C 2013-08 J.CB5DATA SEGMENT DATAWDW 65525QOUTDW?REMADB?DATA ENDSCODESEGMENT CODEASSUME CS:CODE, DS:DATASTART:MOVAX,DATA;取數(shù)據(jù)段開始地址MOVDS,AX;數(shù)據(jù)段開始地址送數(shù)據(jù)段基址寄存器MOVAX,W;從存儲(chǔ)器取出DS:WAXMOVBL,0;余數(shù)寄存器清0SHRAX,1;無符號(hào)數(shù),邏輯右移1位,高位移入0,;W最低位進(jìn)入CRCRBL,1;帶進(jìn)位循環(huán)右移1位,C進(jìn)入BL最高位SHRAX,1;邏輯右移1位,高位補(bǔ)0,W次低位進(jìn)入CRCRBL,1

5、;帶進(jìn)位循環(huán)右移1位SHRAX,1;邏輯右移1位,高位補(bǔ)0,W次低位進(jìn)入CRCRBL,1;帶進(jìn)位循環(huán)右移1位,余數(shù)在BL高3位MOVCL,5數(shù)據(jù)段結(jié)束數(shù)據(jù)段結(jié)束代碼段開始代碼段開始數(shù)據(jù)段開始數(shù)據(jù)段開始GLUT_C 2013-08 J.CB6SHRBL,CL;余數(shù)右移5位,將其移到BL低3位MOVQOUT,AX;保存商MOVREMA,BL;保存余數(shù)MOVAH, 4CHINT21HCODE ENDSEND本程序是返回操作系統(tǒng)本程序是返回操作系統(tǒng)代碼段結(jié)束代碼段結(jié)束匯編源程序結(jié)束匯編源程序結(jié)束GLUT_C 2013-08 J.CB7還有就是:還有就是:W直接取低直接取低3位作為余數(shù)位作為余數(shù)然后然后

6、W右移右移3位得到商位得到商開始開始定義定義W、QOUT、REMAAXW ,REMA 7REMA REMA AND ALAX右移右移3位位QOUT AX 開始開始AX右移右移3位:位:MOV CL ,3SHR AX , CL注意:如果是帶符號(hào)數(shù),注意:如果是帶符號(hào)數(shù),就要用算術(shù)右移就要用算術(shù)右移SAR,不要不要用邏輯右移用邏輯右移SHRGLUT_C 2013-08 J.CB8MOV AX,W;從變量從變量W取數(shù)據(jù)取數(shù)據(jù)MOV REMA, 7;余數(shù)變量余數(shù)變量REMAP賦值賦值00000111BANDREMA,AL;余數(shù)是余數(shù)是AL的的 最低最低3位,位,MOV CL,3;SHRAX, CL;邏

7、輯右移邏輯右移3位,位,AX中得到商中得到商MOV QOUT,AX;保存商保存商MOV AH, 4CHINT21H該程序結(jié)果相同,但程序代碼簡(jiǎn)單了,執(zhí)行速度也快了該程序結(jié)果相同,但程序代碼簡(jiǎn)單了,執(zhí)行速度也快了GLUT_C 2013-08 J.CB9(2) 使用除法指令使用除法指令DIV src注意:對(duì)于注意:對(duì)于8086處理器處理器為了商是字?jǐn)?shù)據(jù),為了商是字?jǐn)?shù)據(jù),被除數(shù)被除數(shù)32位:位:DXAX(DX0,AXW) 除數(shù)除數(shù)16位位 BX8DIV BX 商在商在AX,余數(shù)在余數(shù)在DX,對(duì)于本次運(yùn)算,余,對(duì)于本次運(yùn)算,余數(shù)為字節(jié)數(shù)據(jù),實(shí)際上只有數(shù)為字節(jié)數(shù)據(jù),實(shí)際上只有DL有效有效 .DATAW

8、DW 65525QOUT DW ?REMA DB ?.CODEMOVAX, DATAMOVDS, AXMOV DX,0MOV AX,WMOV BX,8DIV BXMOV QOUT, AXMOV REMA, DLMOVAH, 4CHINT 21HEND如果是帶符號(hào)數(shù),應(yīng)該使如果是帶符號(hào)數(shù),應(yīng)該使用符號(hào)擴(kuò)展指令用符號(hào)擴(kuò)展指令CWD和帶和帶符號(hào)除法指令符號(hào)除法指令I(lǐng)DIV由于題目指定是無符號(hào)數(shù),由于題目指定是無符號(hào)數(shù),這里可以將高這里可以將高16位擴(kuò)展為位擴(kuò)展為0,用,用DIV除法指令除法指令GLUT_C 2013-08 J.CB10例例 將將AXAX中的中的3 3位位BCDBCD數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)數(shù)

9、轉(zhuǎn)換為二進(jìn)制數(shù)存入字節(jié)變量存入字節(jié)變量SBSB中中(AX(AX中的數(shù)大于中的數(shù)大于0 0,小于,小于255)255)每位十進(jìn)制用一個(gè)每位十進(jìn)制用一個(gè)8421編碼(自然二進(jìn)制編碼)表示(即每編碼(自然二進(jìn)制編碼)表示(即每一位十進(jìn)制數(shù)都是用二進(jìn)制表示)一位十進(jìn)制數(shù)都是用二進(jìn)制表示)十進(jìn)制數(shù)的展開表達(dá)式十進(jìn)制數(shù)的展開表達(dá)式3位位BCD碼碼N2N1N00ALAH012012210)10(1010NNNNNNNGLUT_C 2013-08 J.CB11主要部分程序流程圖AL=AL+AHAL=AL*CHAHBLAL=百位百位*10既執(zhí)行既執(zhí)行AL=AL*CHAL=BL and 0FHAL=AL+BL因百

10、位因百位*10不會(huì)大于不會(huì)大于255,AH=0,可以,可以使用使用AH右移右移4位,高位位,高位補(bǔ)補(bǔ)0得到十位數(shù)得到十位數(shù)ALSB保留個(gè)位十位到保留個(gè)位十位到BL取百位到取百位到ALALAHCH 10,CL=4AH=BLAH右移右移4位得到十位位得到十位由于題目給出不大由于題目給出不大于于255,因此最后一,因此最后一次乘次乘10加個(gè)位也只加個(gè)位也只是一個(gè)字節(jié)相加是一個(gè)字節(jié)相加GLUT_C 2013-08 J.CB12M0V CH,10M0V CH,10MOV CL,4MOV CL,4MOV BL,AL MOV BL,AL ;暫存十位和個(gè)位到;暫存十位和個(gè)位到BL,BL,MOV AL,AH M

11、OV AL,AH ; ; 百位存入百位存入ALAL中中MUL CH MUL CH ;百位;百位1010AXAXMOV AH,BLMOV AH,BLSHR AH,CL SHR AH,CL ;取十位;取十位ADD AL,AH ADD AL,AH ;百位;百位10 + 10 + 十位十位ALALMUL CH MUL CH ;( (百位百位10 + 10 + 十位十位) )10 10 AXAXAND BL,0FH AND BL,0FH ;取個(gè)位;取個(gè)位ADD AL,BL ADD AL,BL ;( (百位百位10 + 10 + 十位十位)10 +10 +個(gè)位個(gè)位ALAL ;約定結(jié)果不大于約定結(jié)果不大于2

12、55255MOV SB,AL MOV SB,AL ; ALSB,ALSB,如果沒有明確結(jié)果不大于如果沒有明確結(jié)果不大于255255,則需要考慮,則需要考慮1616位結(jié)果位結(jié)果GLUT_C 2013-08 J.CB130999的的BCD數(shù)轉(zhuǎn)換為二進(jìn)制,主要部分程序流程圖數(shù)轉(zhuǎn)換為二進(jìn)制,主要部分程序流程圖AL取百位取百位AX百位百位*10AH取十位取十位百位百位*10+十位十位AL=AL+AHAX=AL*10BX=BX and 0FHAX=AX+BX因百位因百位*10不會(huì)大于不會(huì)大于255,AH=0,可以使用,可以使用AH右移右移4位,高位補(bǔ)位,高位補(bǔ)0得得到十位數(shù)到十位數(shù)AXSBSB應(yīng)該是字操作

13、數(shù)(應(yīng)該是字操作數(shù)(16位)位)加個(gè)位,加個(gè)位,BH要清要清0AX為為000999之間的之間的BCD數(shù)數(shù)(百位(百位*10+十位)十位)*10GLUT_C 2013-08 J.CB14M0V CH,10M0V CH,10MOV CL,4MOV CL,4MOV BL,AL MOV BL,AL ;暫存十位和個(gè)位到;暫存十位和個(gè)位到BL,BL,MOV AL,AH MOV AL,AH ; ; 百位存入百位存入ALAL中中MUL CH MUL CH ;百位;百位1010AXAXMOV AH,BLMOV AH,BLSHR AH,CL SHR AH,CL ;取十位;取十位ADD AL,AH ADD AL,A

14、H ;百位;百位10 + 10 + 十位十位ALALMUL CH MUL CH ;(;(百位百位10 + 10 + 十位十位)10 10 AXAXAND BX,0FH AND BX,0FH ;取個(gè)位;取個(gè)位ADD AX,BX ADD AX,BX ;( (百位百位10 + 10 + 十位十位)10 +10 +個(gè)位個(gè)位SBSB ;最后結(jié)果為;最后結(jié)果為1616位數(shù),不能簡(jiǎn)單位數(shù),不能簡(jiǎn)單+ +低低8 8位位MOV SB,AX MOV SB,AX ;AXAXSBSBGLUT_C 2013-08 J.CB15 簡(jiǎn)單程序設(shè)計(jì)簡(jiǎn)單程序設(shè)計(jì)例例下面再看幾個(gè)補(bǔ)充的例題。下面再看幾個(gè)補(bǔ)充的例題。例例 :將存儲(chǔ)器

15、單元:將存儲(chǔ)器單元DAT1中保存的一個(gè)組合中保存的一個(gè)組合BCD數(shù)轉(zhuǎn)換成兩個(gè)數(shù)轉(zhuǎn)換成兩個(gè)對(duì)應(yīng)對(duì)應(yīng)ASCII碼值,并存入碼值,并存入DAT2開始的兩個(gè)單元,低位在前,高開始的兩個(gè)單元,低位在前,高位在后。位在后。GLUT_C 2013-08 J.CB16BCD碼轉(zhuǎn)換成碼轉(zhuǎn)換成ASCII碼數(shù)據(jù):碼數(shù)據(jù):非壓縮非壓縮BCD數(shù)據(jù)在高半字節(jié)數(shù)據(jù)在高半字節(jié)+3.例如數(shù)字例如數(shù)字55:0000 0101 0011 0101 0000 0101 0011 0000 0011 0101 用邏輯或指令用邏輯或指令OR OR 0000 0101 0011 0000 0011 0101 用加法指令用加法指令OR +

16、得到的結(jié)果是相同的。都是在高半字節(jié)加得到的結(jié)果是相同的。都是在高半字節(jié)加3。GLUT_C 2013-08 J.CB17該問題算法就很簡(jiǎn)單:該問題算法就很簡(jiǎn)單: 從從DAT1取出取出BCD數(shù)據(jù),先將高數(shù)據(jù),先將高4位清位清“0”,與,與30H相加或相加或進(jìn)行邏輯或進(jìn)行邏輯或運(yùn)算運(yùn)算,存入,存入DAT2,再取出數(shù)據(jù),將數(shù)據(jù)邏輯右移,再取出數(shù)據(jù),將數(shù)據(jù)邏輯右移4位(高位位(高位BCD數(shù)移到低數(shù)移到低4位,高位,高4位變位變“0”,再與,再與30H相加(或相加(或進(jìn)行邏輯或),存入進(jìn)行邏輯或),存入DAT2+1單元。單元。程序流程圖:程序流程圖:GLUT_C 2013-08 J.CB18 程序流程圖程

17、序代碼DATA SEGMENT DAT1 DB 34H;待轉(zhuǎn)換的數(shù)DAT2 DB ?,?DATA ENDSCODE SEGMENTASSUME CS:CODE, DS:DATASTARA: MOV AX, DATA MOV DS, AX ;送段地址 LEA SI,DAT1 LEA DI,DAT2 MOV AL,SI AND AL, 0FH ADD AL,30H MOV DI,AL MOV AL,SI 開始段定義AL(SI )AL(AL)代碼段開始CODE SEGMENTASSUME CS:CODE, DS:DATA EXPRE PROC FAR ;過程定義,遠(yuǎn)過程START: PUSH DS

18、;DS:00保存的是一條返回 SUB AX,AX ;DOS 指令。 PUSH AX ;這里,將返回DOS的地址 ;壓入堆棧 MOV AX,DATA操作系統(tǒng)會(huì)自動(dòng)在操作系統(tǒng)會(huì)自動(dòng)在DS:00處安排一條返回操作系處安排一條返回操作系統(tǒng)的指令,故子程序開統(tǒng)的指令,故子程序開始處向堆棧中壓入始處向堆棧中壓入 DS:00執(zhí)行執(zhí)行RET指令,則就是指令,則就是轉(zhuǎn)到轉(zhuǎn)到DS:00返回返回DOSGLUT_C 2013-08 J.CB23MOV DS,AX;數(shù)據(jù)段首地址(基地址)MOV AL , X;取變量X MOV BL,ALMUL BL;X*X=X2MOV BX,AX MOV AL , Y;取變量YMOV

19、AH,0;正整數(shù),高字節(jié)直接擴(kuò)展0 MOV CX,AXADD AX ,CX;2YADD AX, CX;3YXCHG AX, BX SUB AX ,BX ;X2-3YSHR AX ,1; 右移一位 /2MOV Z , AXRET;將DS:00彈出到CS:IP EXPRE ENDP ;過程定義結(jié)束 CODE ENDSEND STARTRET 指令,轉(zhuǎn)到DS:00,對(duì)于EXE格式程序,它是一條返回DOS的指令。GLUT_C 2013-08 J.CB24;數(shù)據(jù)段定義DATA SEGMENTXDB 25YDB 32ZDW?DATA ENDS;代碼段開始CODE SEGMENTASSUME CS:CODE

20、, DS:DATA MOV AX , DATAMOV DS , AXMOV AL , XMOV BL , AL可以使用常規(guī)返回DOS方法 INT 21H的4CH功能調(diào)用GLUT_C 2013-08 J.CB25MUL BL;X*X=X2MOV BX , AX MOV AL , Y;YMOV AH , 0 MOV CX , AXADD AX , CX;2YADD AX , CX;3YXCHG AX , BX SUB AX , BX ;X2-3YSHR AX ,1; 右移一位 /2MOV Z , AXMOV AH , 4CHINT 21HEXPRE ENDP ;過程定義結(jié)束 CODE ENDSEN

21、D START用INT 21 的4CH號(hào)功能調(diào)用返回DOS。GLUT_C 2013-08 J.CB26例 BCD加法程序例如:已知字變量W1、W2分別存放兩個(gè)非壓縮的BCD數(shù),編寫程序求兩數(shù)之和,并將結(jié)果存入SUM字變量中。注意:W!,W2為2為字變量(2字節(jié))壓縮BCD數(shù),0099,它們的和則可能為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

22、)GLUT_C 2013-08 J.CB27l壓縮BCD加法后,用DAA調(diào)整l非壓縮BCD加法后,用AAA調(diào)整l壓縮BCD減法后,用DAS調(diào)整l非壓縮BCD加法后,用AAS調(diào)整l壓縮BCD加法后,用AAM調(diào)整l(壓縮的BCD乘法,不能調(diào)整)l除法指令前用AAD調(diào)整(存放在AX中的兩位非壓縮BCD數(shù))開始開始定義定義W1、W2、SUMALW1第一字節(jié)(個(gè)位)第一字節(jié)(個(gè)位)ADD AL,W2第一字節(jié),第一字節(jié),AAAC送送SUM+2最低位最低位 (百位)(百位)結(jié)束結(jié)束SUMALALW1第二字節(jié)(十位)第二字節(jié)(十位)ADC AL,W2第二字節(jié),第二字節(jié),AAASUM+1AL將將SUM+2清清0

23、,然后進(jìn),然后進(jìn)行帶進(jìn)位的循環(huán)左移,行帶進(jìn)位的循環(huán)左移,就可將就可將CY移進(jìn)移進(jìn)SUM+2最低位,其余位最低位,其余位=0GLUT_C 2013-08 J.CB28例如例如:0809+0607=01 05 060809+0607=01 05 06,程序段如下:,程序段如下:DATA SEGMENT DATA SEGMENT W1 DW 0809HW1 DW 0809HW2 DW 06078HW2 DW 06078HSUM DB 3 DUP(0)SUM DB 3 DUP(0)DATA ENDSDATA ENDSCODE SEGMENTCODE SEGMENT ASSUME CS:CODE,DS:

24、DATA,SS:STACK ASSUME CS:CODE,DS:DATA,SS:STACK MOV AX,DATA MOV AX,DATA MOV DS,AX MOV DS,AX ; ; MOV AL,BYTE PTR W1 MOV AL,BYTE PTR W1 ;取第一個(gè)數(shù),;取第一個(gè)數(shù),ALAL09H09H ADD ADD AL,BYTE PTR W2AL,BYTE PTR W2 ; AL; AL09H+07=10h,AF=109H+07=10h,AF=1 AAA AAA ;ALAL06H,06H,產(chǎn)生產(chǎn)生CF=1CF=1 MOV SUM,AL MOV SUM,AL ;保存?zhèn)€位,進(jìn)位信號(hào)在

25、;保存?zhèn)€位,進(jìn)位信號(hào)在CFCF MOV AL,BYTE PTR W1+1 MOV AL,BYTE PTR W1+1 ;ALAL08H08H GLUT_C 2013-08 J.CB29 ADC ADC AL,BYTE PTR W2+1 AL,BYTE PTR W2+1 ; AL; AL0FH, CF=00FH, CF=0 AAA AAA ;ALAL05H, CF=105H, CF=1 MOV SUM+1,AL MOV SUM+1,AL ;存百位和千位;存百位和千位 MOV SUM+2,0 MOV SUM+2,0 ; ;處理向百位的進(jìn)位,先將處理向百位的進(jìn)位,先將SUM+2SUM+2 RCL UM

26、+2,1 RCL UM+2,1 ; ;清清0 0,然后用帶進(jìn)位循環(huán)左移指,然后用帶進(jìn)位循環(huán)左移指 ; ;令將進(jìn)位位移到令將進(jìn)位位移到SUM+2SUM+2最低位最低位實(shí)際上,在實(shí)際上,在SUMSUM定義時(shí),已經(jīng)初始化為定義時(shí),已經(jīng)初始化為0 0,程序中可以不清,程序中可以不清0 0 定義的變量定義的變量W1W1,W2W2,SUMSUM在匯編語言源程序中可以直接使用,在匯編語言源程序中可以直接使用,匯編程序在對(duì)源程序進(jìn)行匯編時(shí),可以識(shí)別是從變量所存放的匯編程序在對(duì)源程序進(jìn)行匯編時(shí),可以識(shí)別是從變量所存放的存儲(chǔ)器中取出數(shù)據(jù)存儲(chǔ)器中取出數(shù)據(jù)實(shí)際上就是匯編程直接尋址指令實(shí)際上就是匯編程直接尋址指令 MO

27、V AL,W1MOV AL,W1,為了書寫簡(jiǎn)單,我們直接寫成為了書寫簡(jiǎn)單,我們直接寫成 MOV AL,W1.MOV AL,W1.GLUT_C 2013-08 J.CB30以上例子,有一些只給出了實(shí)現(xiàn)所要求功能的核心部分分代碼,沒有給出段定義的完整部分。有一些則給出了包含段定義的完整代碼;段定義的格式是相似的,可以參照教材上的例子和前面的段定義例子編寫。教材上還有一些順序程序的例子,由于時(shí)間關(guān)系,就不一一列舉了。GLUT_C 2013-08 J.CB31順序程序的結(jié)構(gòu)簡(jiǎn)單,但實(shí)際程序設(shè)計(jì)中,往往需要對(duì)某些條件進(jìn)行判斷,依據(jù)不同的條件執(zhí)行不同的分支,這樣,順序程序?qū)⒉荒軡M足要求。GLUT_C 20

28、13-08 J.CB323.3.2 分支程序的設(shè)計(jì)分支程序的設(shè)計(jì) 就是利用CPU的條件轉(zhuǎn)移指令,通過判斷某個(gè)標(biāo)志為的狀態(tài),控制程序的執(zhí)行過程。 PF=0PF=0奇轉(zhuǎn)移奇轉(zhuǎn)移JNP/JPOJNP/JPOPF=1PF=1偶轉(zhuǎn)移偶轉(zhuǎn)移 JP/JPEJP/JPEOF=0OF=0無溢出轉(zhuǎn)移無溢出轉(zhuǎn)移JNOJNOOF=1OF=1溢出轉(zhuǎn)移溢出轉(zhuǎn)移JOJOSF=0SF=0為正轉(zhuǎn)移為正轉(zhuǎn)移JNSJNSSF=1SF=1為負(fù)轉(zhuǎn)移為負(fù)轉(zhuǎn)移JSJSCF=0CF=0無進(jìn)無進(jìn)( (借借) )位轉(zhuǎn)移位轉(zhuǎn)移JNCJNCCF=1CF=1有進(jìn)有進(jìn)( (借借) )位轉(zhuǎn)移位轉(zhuǎn)移JCJCZF=0ZF=0不相等不相等/ /不等于不等于0

29、0轉(zhuǎn)移轉(zhuǎn)移JNE/JNZJNE/JNZZF=1ZF=1相等相等/ /等于等于0 0轉(zhuǎn)移轉(zhuǎn)移JE/JZJE/JZ標(biāo)志設(shè)置標(biāo)志設(shè)置功能功能指令助記符指令助記符GLUT_C 2013-08 J.CB33二分支結(jié)構(gòu)二分支結(jié)構(gòu)分支結(jié)構(gòu)判斷ABNYABC1ABC2ABC3分支結(jié)構(gòu)判斷BNYABC1ABC2GLUT_C 2013-08 J.CB34多分支結(jié)構(gòu)條件判斷1Y程序1N條件判斷2Y程序2條件判斷n程序nY程序n+1NNGLUT_C 2013-08 J.CB35也可以按照條件編碼實(shí)現(xiàn)多分枝轉(zhuǎn)移也可以按照條件編碼實(shí)現(xiàn)多分枝轉(zhuǎn)移例如段內(nèi)間接轉(zhuǎn)移指令例如段內(nèi)間接轉(zhuǎn)移指令JMP REG轉(zhuǎn)移到轉(zhuǎn)移到CS:AXJ

30、MP WORD PTR MEM轉(zhuǎn)移到轉(zhuǎn)移到CS:MEMAX條件編碼條件編碼CODAXAX*kJMP AX分支程序分支程序0 分支程序分支程序1分支程序分支程序nCOD=0COD=1COD=nK是一個(gè)不小于是一個(gè)不小于2的整數(shù)。的整數(shù)。GLUT_C 2013-08 J.CB36我們還是通過實(shí)例來討論。例:內(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_C 2013-08 J.CB37轉(zhuǎn)移目的轉(zhuǎn)移目的

31、指令給出指令給出標(biāo)號(hào)(符標(biāo)號(hào)(符號(hào)地址)號(hào)地址)開始設(shè)置DSSI M AX SIORL AX,AXSF=0NEG AXNYDONESI(AX)結(jié)束N_DATAN_DATA,負(fù),負(fù)數(shù),該標(biāo)號(hào)數(shù),該標(biāo)號(hào)為了閱讀程為了閱讀程序方便序方便判斷數(shù)據(jù)的符號(hào),在判斷數(shù)據(jù)的符號(hào),在X86中中就是判斷就是判斷SF標(biāo)志位,數(shù)據(jù)標(biāo)志位,數(shù)據(jù)傳送指令不改變標(biāo)志位,因傳送指令不改變標(biāo)志位,因此用一條邏輯運(yùn)算指令此用一條邏輯運(yùn)算指令ORL Ax,AX,它不改變它不改變AX的值,但設(shè)置的值,但設(shè)置標(biāo)志位標(biāo)志位SFGLUT_C 2013-08 J.CB38 DATA SEGMENT M DW 789AH;可以任意輸入一個(gè)數(shù)

32、DATA ENDSCODE SEGMENT ASSUME CS:CODE2,DS:DATA2START: MOV AX,DATA MOV DS,AX LEA SI, M ;MOV SI,OFFSET M MOV AX,SI ORL AX,AX ;AND AX,AX JNS DONE ;符號(hào)為SF=0轉(zhuǎn)移到DONEN_DATA: NEG AX ;負(fù)數(shù),利用NEG指令求負(fù)DONE: MOV SI,AX MOV AH,4CH INT 21H CODE ENDS END GLUT_C 2013-08 J.CB39多分支程序?qū)Ψ种С绦颍梢杂蛇@種2分支程序構(gòu)成。滿足條件1?NYFUN1滿足條件2?滿足條

33、件3?分支4分支3分支2分支1YYNNFUN2FUN3FUN4FUN5TST2TST1TST3GLUT_C 2013-08 J.CB40計(jì)算函數(shù)的程序,x是十六位長(zhǎng)度字?jǐn)?shù)據(jù))0(1)0(0)0(1XXXY當(dāng)當(dāng)當(dāng)算法分析:取出數(shù)據(jù)X,判斷它的符號(hào),首先判斷是否=0,如果不是,則是負(fù)數(shù),Y=-1,如果是,還須再次判斷是否等于0。程序流程框圖為:GLUT_C 2013-08 J.CB41開始段定義及初始化取數(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í)好使用LP0GL

34、UT_C 2013-08 J.CB42DATA SEGMENT X DW -8 Y DB ?DATA ENDSCODE SEGMENT ASSUME CS:CODE3, DS:DATA3START: MOV AX, DATA3 ;設(shè)置段基址 MOV DS, AXLEA SI, X;取偏移地址MOV AX, SIAND AX,AXGLUT_C 2013-08 J.CB43JNS LP1 ;SF=0,轉(zhuǎn)到LP1LP0:MOV Y,0FFH ;=0,繼續(xù)判斷, ;=0轉(zhuǎn)到LP3LP2:MOV Y, 01H ;X0時(shí), y=1LJMP END1LP3:MOV Y,00H ;X=0時(shí),Y=0END1:

35、MOV AH,4CH ;返回操作系統(tǒng)INT 21H CODE ENDSEND STARTGLUT_C 2013-08 J.CB44教材上有一個(gè)例子(102頁例3.7)0Y01Y00Y01,異號(hào)、,XXXZ算法分析:取出數(shù)據(jù)X,Y,異或,判斷符號(hào),SF=1,表明符號(hào)異號(hào)Z=0;SF=0,表明符號(hào)相同,判斷是否X0,是,Z=1,否Z=-1。GLUT_C 2013-08 J.CB45多分支的另一種實(shí)現(xiàn)方法多分支的另一種實(shí)現(xiàn)方法除了用二分支指令實(shí)現(xiàn)多分支外,還可以用以下指令實(shí)現(xiàn):除了用二分支指令實(shí)現(xiàn)多分支外,還可以用以下指令實(shí)現(xiàn):JMP REG ;JMP WORD PTR MEM例如,我們要依據(jù)例如,

36、我們要依據(jù)AL中的低中的低4位數(shù)據(jù)(位數(shù)據(jù)(015)不同,分別轉(zhuǎn)移)不同,分別轉(zhuǎn)移到對(duì)應(yīng)的分支去執(zhí)行,每個(gè)分支約定占用到對(duì)應(yīng)的分支去執(zhí)行,每個(gè)分支約定占用200字節(jié)空間。字節(jié)空間。這類指令應(yīng)用方法如下:這類指令應(yīng)用方法如下:GLUT_C 2013-08 J.CB46ANLAL, 0FHMOV BL,100MULBLMOV AX, FUN0;JMPAXFUN0:.ORG FUN0+100FUN1:;FUN1-FUN0=100;可以用定位偽指令確定每個(gè);分支相距的距離ORG FUN14+100; 只要保證這段空間能存下FUN15:; 這段代碼。也可以是一個(gè)轉(zhuǎn)移表,也可以是一個(gè)轉(zhuǎn)移表,利用遠(yuǎn)轉(zhuǎn)移指令

37、轉(zhuǎn)到利用遠(yuǎn)轉(zhuǎn)移指令轉(zhuǎn)到各處理程序,這樣各各處理程序,這樣各功能分值的距離就比功能分值的距離就比較小,而且相距的字較小,而且相距的字節(jié)數(shù)也相同。節(jié)數(shù)也相同。GLUT_C 2013-08 J.CB47例例3.9 3.9 從鍵盤上鍵入從鍵盤上鍵入2 2位十六進(jìn)制數(shù)將其拼合成一個(gè)字節(jié)存入字節(jié)變量位十六進(jìn)制數(shù)將其拼合成一個(gè)字節(jié)存入字節(jié)變量SBSB中。中。DATA SEGMENTDATA SEGMENTIBUF IBUF DB 3,0,3 DUP(0)DB 3,0,3 DUP(0)SBSBDB 0DB 0DATA ENDSDATA ENDSCODE SEGMENTCODE SEGMENTASSUME CS

38、:CODE,DS:DATAASSUME CS:CODE,DS:DATAMOVMOVAX,DATAAX,DATAMOVMOVDS,AXDS,AXMOV DX, OFFSET IBUF MOV DX, OFFSET IBUF ;鍵入;鍵入2 2位十六進(jìn)制數(shù)位十六進(jìn)制數(shù)MOV AH, 10MOV AH, 10INT 21HINT 21HMOV AX, WORD PTR IBUF+2 MOV AX, WORD PTR IBUF+2 ;鍵入字符從;鍵入字符從+2+2單元開始,取出送單元開始,取出送AXAXSUB AX, 3030HSUB AX, 3030H ;字符變?yōu)槭M(jìn)制數(shù);字符變?yōu)槭M(jìn)制數(shù)CMP

39、 AL,0AHCMP AL,0AHJB LNSUB7JB LNSUB7;09,ASCII-30H09,ASCII-30H就是它對(duì)應(yīng)的就是它對(duì)應(yīng)的HEXHEX值值SUB AL,7SUB AL,7;AF;AF,ASCII-37HASCII-37H就是它對(duì)應(yīng)的就是它對(duì)應(yīng)的HEXHEX值值GLUT_C 2013-08 J.CB48LNSUB7:CMP AH,0AHLNSUB7:CMP AH,0AHJB LNSUB7JB LNSUB7SUB AH,7SUB AH,7HNSUB7:MOV CL, 4 HNSUB7:MOV CL, 4 ;將;將AXAX中的數(shù)拼合成一個(gè)字節(jié)中的數(shù)拼合成一個(gè)字節(jié)SHL AL ,

40、CLSHL AL ,CLOR AL, AHOR AL, AHMOV SBMOV SB,ALALMOV AH,4CHMOV AH,4CHINT 21HINT 21HCODE ENDSCODE ENDSENDENDGLUT_C 2013-08 J.CB49例例3.10 3.10 某工廠的產(chǎn)品有某工廠的產(chǎn)品有8 8種不同的加工處理程序種不同的加工處理程序P0P0P7P7,根據(jù)鍵,根據(jù)鍵盤輸入,做不同的處理,若是盤輸入,做不同的處理,若是0 07 7以外的鍵,則退出加工處理以外的鍵,則退出加工處理 此例可以用兩種方法實(shí)現(xiàn)此例可以用兩種方法實(shí)現(xiàn): :一種是用逐一比較判斷一種是用逐一比較判斷, ,逐次比較

41、轉(zhuǎn)移實(shí)現(xiàn)二叉分支、整體上逐次比較轉(zhuǎn)移實(shí)現(xiàn)二叉分支、整體上實(shí)現(xiàn)多分支實(shí)現(xiàn)多分支; ; 另一種是跳轉(zhuǎn)表法另一種是跳轉(zhuǎn)表法, ,直接實(shí)現(xiàn)多分支直接實(shí)現(xiàn)多分支. .GLUT_C 2013-08 J.CB50 方法一逐一比較法方法一逐一比較法. .簡(jiǎn)單,條理清楚,易于實(shí)現(xiàn),但轉(zhuǎn)移簡(jiǎn)單,條理清楚,易于實(shí)現(xiàn),但轉(zhuǎn)移范圍只能是:范圍只能是:128128127127DATADATASEGMENTSEGMENTINPUT DB Input( 0INPUT DB Input( 07): $7): $DATA ENDSDATA ENDSCODE SEGMENTCODE SEGMENTMOVMOVAX, DATAAX,

42、 DATAMOVMOVDS,AXDS,AX MOV DX , OFFSET INPUTMOV DX , OFFSET INPUT ; ;顯示提示符顯示提示符 MOV AH , 9MOV AH , 9;0909號(hào)功能是顯示字符串,號(hào)功能是顯示字符串,$ $是字符串結(jié)束符是字符串結(jié)束符 INT 21HINT 21H; MOV AH , 1MOV AH , 1 ;等待鍵入一個(gè)字符到;等待鍵入一個(gè)字符到ALAL, INT 21HINT 21H CMP AL , CMP AL , 0 0 ;為;為0 0字符則轉(zhuǎn)字符則轉(zhuǎn)P0P0 JE P0JE P0 CMP AL , CMP AL , 1 1 ;為;為1

43、 1字符則轉(zhuǎn)字符則轉(zhuǎn)P1P1 JE P1JE P1GLUT_C 2013-08 J.CB51CMP AL ,CMP AL ,2 2JE P2 JE P2 CMP AL ,CMP AL ,3 3JE P3 JE P3 CMP AL ,CMP AL ,4 4 JE P4JE P4CMP AL ,CMP AL ,5 5JE P5JE P5CMP AL ,CMP AL ,6 6JE P6JE P6CMP AL ,CMP AL ,7 7JE P7JE P7JMP DOWNJMP DOWN ;不是;不是0 07 7則退出程序則退出程序 GLUT_C 2013-08 J.CB52P0: MOV DL ,P0

44、: MOV DL , 0 0 ;鍵入;鍵入0 0則執(zhí)行則執(zhí)行P0P0程序規(guī)定的功能程序規(guī)定的功能 JMP EXITJMP EXITP1: MOV DL ,P1: MOV DL , 1 1 ;鍵入;鍵入1 1則執(zhí)行則執(zhí)行P1P1程序規(guī)定的功能程序規(guī)定的功能 JMP EXITJMP EXIT P7: MOV DL ,P7: MOV DL , 7 7 ;鍵入;鍵入7 7則執(zhí)行則執(zhí)行P7P7程序規(guī)定的功能程序規(guī)定的功能 JMP EXIT JMP EXITEXIT: MOV AH ,4CH EXIT: MOV AH ,4CH ;分支程序一定要注意匯合到結(jié)束處;分支程序一定要注意匯合到結(jié)束處 INT 21HINT 21HCODE ENDSCODE ENDSENDEND轉(zhuǎn)移到匯

溫馨提示

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