第四章 匯編語言程序設(shè)計_第1頁
第四章 匯編語言程序設(shè)計_第2頁
第四章 匯編語言程序設(shè)計_第3頁
第四章 匯編語言程序設(shè)計_第4頁
第四章 匯編語言程序設(shè)計_第5頁
已閱讀5頁,還剩61頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第四章 匯編語言程序設(shè)計 順序程序設(shè)計順序程序設(shè)計 分支程序設(shè)計分支程序設(shè)計 循環(huán)程序設(shè)計循環(huán)程序設(shè)計 子程序子程序 軟中斷和軟中斷和BIOSBIOS調(diào)用調(diào)用 1.設(shè)計步驟: 根據(jù)實際問題抽象出數(shù)學(xué)模型 確定算法 畫程序流程圖 分配內(nèi)存工作單元和寄存器 程序編碼 調(diào)試 2.2.繪制程序流程圖繪制程序流程圖 (1)(1)用方框表示工作框用方框表示工作框 N Y ? (4)(4)各框之間用直線連起來表示程序走向。各框之間用直線連起來表示程序走向。 。 3. 源程序的基本結(jié)構(gòu):源程序的基本結(jié)構(gòu): 順序、分支、循環(huán)、子程序順序、分支、循環(huán)、子程序 程序流程圖符號 起始:起始: 功能:功能: 判斷:判斷

2、: 子過程:子過程: 順序程序設(shè)計,又叫直接程序設(shè)計。它是相對順序程序設(shè)計,又叫直接程序設(shè)計。它是相對 于分支程序和循環(huán)程序設(shè)計而言的。因此,可于分支程序和循環(huán)程序設(shè)計而言的。因此,可 以說順序程序是既不包含分支,又不包含循環(huán)以說順序程序是既不包含分支,又不包含循環(huán) 的程序,順序程序是從第一條指令開始,按其的程序,順序程序是從第一條指令開始,按其 自然順序,一條指令一條指令地執(zhí)行,在運行自然順序,一條指令一條指令地執(zhí)行,在運行 期間,期間,CPU既不跳過某些指令,也不重復(fù)執(zhí)行既不跳過某些指令,也不重復(fù)執(zhí)行 某些指令,一直執(zhí)行到最后一條指令為止。某些指令,一直執(zhí)行到最后一條指令為止。 4.1 順

3、序結(jié)構(gòu)程序順序結(jié)構(gòu)程序 例:例:將某段中的字符串將某段中的字符串“Hello!”傳送到另一段中(內(nèi)傳送到另一段中(內(nèi) 存數(shù)據(jù)塊的傳送)。存數(shù)據(jù)塊的傳送)。 開始開始 建立傳送方向建立傳送方向 DS: SI 源串首地址源串首地址 ES: DI 目的串首地址目的串首地址 CX 串長度串長度 串傳送串傳送 返回返回 DOS 4.1 4.1 順序結(jié)構(gòu)程序順序結(jié)構(gòu)程序( (順序執(zhí)行,無轉(zhuǎn)移、無循環(huán)順序執(zhí)行,無轉(zhuǎn)移、無循環(huán)) ) aa SEGMENT ;數(shù)據(jù)段;數(shù)據(jù)段1 xx DB Hello! ;定義源串;定義源串 aa ENDS bb SEGMENT ;數(shù)據(jù)段;數(shù)據(jù)段2 yy DB 6 dup (?)

4、 ; 定義目的串定義目的串 bb ENDS cc SEGMENT ;代碼段;代碼段 ASSUME CS:cc, DS:aa, ES:bb ;分配段寄存器;分配段寄存器 start : CLD ;設(shè)置傳送方向;設(shè)置傳送方向 MOV AX , aa ;DS: SI 源串首地址源串首地址 MOV DS , AX LEA SI , xx MOV AX , yy ;ES:DI 目的串首地址目的串首地址 MOV ES , AX MOV DI , OFFSET yy MOV CX , 6 ;CX 串的長度串的長度 REP MOVSB ;串傳送;串傳送 MOV AH , 4CH ;調(diào)用調(diào)用4CH系統(tǒng)功能,返回

5、系統(tǒng)功能,返回DOS INT 21H cc ENDS END start ;程序結(jié)束;程序結(jié)束 4.1 順序程序設(shè)計順序程序設(shè)計 例例411 把在字節(jié)存儲單元AA和BB中的兩個 壓縮BCD數(shù)相加,結(jié)果存到字節(jié)單元CC中。 分析:實現(xiàn)BCD碼相加,要通過二進(jìn)制數(shù)加法指 令實現(xiàn)。然后再用十進(jìn)制調(diào)整指令進(jìn)行調(diào)整, 以獲得正確的BCD結(jié)果。因為是單字節(jié)相加, 只用一條二進(jìn)制加法指令即可。如果考慮相加 結(jié)果有進(jìn)位,則可以將表示進(jìn)位的CF標(biāo)志位存 入單元CC+1中。為此,在存儲單元CC處留有 兩個字節(jié),用來存放相加的結(jié)果。 程序程序: : DATA SEGMENTDATA SEGMENT AA DB 23

6、H ; AA DB 23H ; 被加數(shù)被加數(shù) BB DB 18H BB DB 18H ;加數(shù);加數(shù) CC DB 2 DUP(?) ;CC DB 2 DUP(?) ;結(jié)果單元結(jié)果單元 DATA ENDSDATA ENDS BCDADD SEGMENTBCDADD SEGMENT ASSUME CS:BCDADD,DS:DATA ASSUME CS:BCDADD,DS:DATA START: MOV AX, DATASTART: MOV AX, DATA MOV DS, AX MOV DS, AX MOV AL, AA ; MOV AL, AA ;取被加數(shù)取被加數(shù) ADD AL, BB ;ADD

7、AL, BB ;二數(shù)相加二數(shù)相加 DAA ;DAA ;調(diào)整為十進(jìn)制結(jié)果調(diào)整為十進(jìn)制結(jié)果 MOV CC, AL MOV CC, AL LAHF ; LAHF ;取標(biāo)志位取標(biāo)志位 AND AH, 01 ;AND AH, 01 ;取取CFCF位位 MOV CC+1, AH ;MOV CC+1, AH ;存進(jìn)位到存進(jìn)位到C+1C+1單元單元 MOV AH, 4CHMOV AH, 4CH INT 21H INT 21H BCDADD ENDSBCDADD ENDS END START END START 例例414 在內(nèi)存地址SQREA起有015 的平方數(shù)表。在ABB單元任給-個小于 等于15的整數(shù),求

8、其平方值。 分析:因為平方表已順序排放在內(nèi)存中。 又已知首地址為SQREA,只要把給定單 元的內(nèi)容作位移量與表首址相加,就指 向了表中要求值的地址,取其內(nèi)容即為 該數(shù)的平方值。 源程序源程序: DATA SEGMENT SQREA DB 0,1,4,9,16,25,36,49,64,81 DB 100,121,144,169,196,225 ABB DB 8 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START PROCFAR PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX MOV BL,ABB ;

9、取給定單元中數(shù)取給定單元中數(shù) MOV BH,0 MOV SI,OFFSET SQREA ;平方表首地址指針平方表首地址指針 MOV AL,SI+BX ;取給定數(shù)的平方值取給定數(shù)的平方值 MOV ABB,AL ;存回原單元存回原單元 RETF START ENDP CODE ENDS END START 條件滿足條件滿足 ? 處理處理P1處理處理P2 標(biāo)號標(biāo)號1: 標(biāo)號標(biāo)號2: NY 1. 簡單分支結(jié)構(gòu)簡單分支結(jié)構(gòu) 4.2 分支程序分支程序 分支結(jié)構(gòu)程序設(shè)計的關(guān)鍵在于準(zhǔn)確地知道分支結(jié)構(gòu)程序設(shè)計的關(guān)鍵在于準(zhǔn)確地知道 操作結(jié)果影響的標(biāo)志位狀態(tài)和正確地使用操作結(jié)果影響的標(biāo)志位狀態(tài)和正確地使用 條件轉(zhuǎn)移

10、指令。根據(jù)對條件的判斷而選擇條件轉(zhuǎn)移指令。根據(jù)對條件的判斷而選擇 不同的處理方法是人的基本智能體現(xiàn)。不同的處理方法是人的基本智能體現(xiàn)。 2. 多種分支結(jié)構(gòu)多種分支結(jié)構(gòu) 標(biāo)號標(biāo)號1: 條件條件1成立成立 ? P1 N Y 條件條件2成立成立 ? 條件條件n成立成立 ? Pn+1 標(biāo)號標(biāo)號2: 標(biāo)號標(biāo)號n: 標(biāo)號標(biāo)號n+1: P2 Pn N N Y Y 用比較指令用比較指令 CMP DEST,SRC JE EQUL EQUL: 用測試指令用測試指令 TEST DEST,SRC JNZ NEXT NEXT: 用邏輯指令用邏輯指令 SHR DEST,CL JC NEXT NEXT: 例:例: 。 YX

11、 YX YX Z 1 0 1 程程 序序 ;- 數(shù)據(jù)段定義數(shù)據(jù)段定義 - DATSEGMENT XDB242 YDB67 ZDB? DATENDS ;- 代碼段定義代碼段定義 - COD SEGMENT ASSUME DS: DAT, CS: COD START:MOV AX, DAT MOV DS, AX; 初始化初始化DS MOV AL, X MOV BL, Y ;- CMP AL, BL JEC1; (AL)(BL) 則跳轉(zhuǎn)至則跳轉(zhuǎn)至C1 JAC2; (AL) (BL) 則跳轉(zhuǎn)至則跳轉(zhuǎn)至C2 MOV AL, -1 JMP EXT C1:MOV AL, 0 JMPEXT C2:MOV AL

12、, 1 EXT: MOV Z, AL MOV AH, 4CH INT 21H ; 返回返回DOS ;- COD ENDS ENDSTART 4.2 分支程序設(shè)計分支程序設(shè)計 例例4.2.1 設(shè)在A、B兩個存貯單元各有一個無符號數(shù),比較 兩個無符號數(shù)的大小,并根據(jù)判斷結(jié)果,在屏幕顯示 AB或BA或A=B。 分析:兩個無符號數(shù)比較大小,使用比較指令CMP,產(chǎn) 生標(biāo)志位,然后根據(jù)標(biāo)志位,使用無符號條件轉(zhuǎn)移指 令實現(xiàn)轉(zhuǎn)移。 源程序: DATA SEGMENT A DB 3BH B DB 8EH ASTR DB AB $ BSTR DB BA $ CSTR DB A=B $ DATA ENDS CODE

13、 SEGMENT CODE SEGMENT ASSUME CS:CODE,DS:DATA ASSUME CS:CODE,DS:DATA MOV AX,DATA MOV AX,DATA MOV DS,AX MOV DS,AX MOV AL MOV AL,A ;A ;取取A A中數(shù)中數(shù) CMP B,AL ;ACMP B,AL ;A與與B B比較比較 JAE BGA JAE BGA ;BA,BA,轉(zhuǎn)轉(zhuǎn)BGA BGA MOV DX,OFFSET ASTR ; MOV DX,OFFSET ASTR ;顯示顯示ABAB MOV AH,9 MOV AH,9 INT 21H INT 21H JMP COM J

14、MP COM BGA: JZ AEBBGA: JZ AEB MOV DX,OFFSET BSTR ; MOV DX,OFFSET BSTR ;顯示顯示BABA MOV AH,9 MOV AH,9 INT 21H INT 21H JMP COM JMP COM AEB: MOV DX,OFFSET CSTR ;AEB: MOV DX,OFFSET CSTR ;顯示顯示A=BA=B MOV AH,9 MOV AH,9 INT 21H INT 21H COM: MOV AH,4CHCOM: MOV AH,4CH INT 21H INT 21H CODE ENDSCODE ENDS 例例4.2.2 在

15、一個字符串中,找出其ASCII碼 值最大的字符,并顯示在屏幕上。 分析:可以把每個字符的ASCII碼,看做是 一個無符號數(shù)。這樣,就轉(zhuǎn)化為在一組 數(shù)中查找一個最大數(shù)的操作。通常使用 逐個比較法,即把第一個數(shù)作比較標(biāo)準(zhǔn), 與其后的數(shù)比較。如標(biāo)準(zhǔn)數(shù)大,則再與 下一個數(shù)比較。如標(biāo)準(zhǔn)數(shù)小,則將大數(shù) 做為新的標(biāo)準(zhǔn)數(shù),再與下一個數(shù)比較。 依此類推,逐個比較,直到最后一個標(biāo) 準(zhǔn)的數(shù),就是要找的最大數(shù),即值為最 大的字符。 源程序: DATA SEGMENT BLOK DB Search a character to have ;字符串 DB the largest value$ COUNT EQU $-BL

16、OK ;串長 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV SI,OFFSET BLOK MOV CX,COUNT-1 MOV AL,SI ;取一個字符, INC SI ;調(diào)整指針 COMP: CMP AL,SI ;字符比較 JA NEXT ;若AL值大,轉(zhuǎn)NEXT MOV AL,SI ;否則,取大值到AL NEXT: INC SI ; 調(diào)整指針 LOOP COMP ;循環(huán)查找 MOV DL,AL ;顯示所找到的最大字符 MOV AH,2 INT 21H MOV AH,4CH INT

17、 21H CODE ENDS END START 循環(huán)程序的組成:循環(huán)程序的組成:循環(huán)程序是在滿足某些條件時對一段程循環(huán)程序是在滿足某些條件時對一段程 序的重復(fù)執(zhí)行,一般由四部分組成。序的重復(fù)執(zhí)行,一般由四部分組成。 4.3 循環(huán)程序循環(huán)程序 (1)循環(huán)初值部分:這是為了保證循環(huán)程序能正常)循環(huán)初值部分:這是為了保證循環(huán)程序能正常 進(jìn)行循環(huán)操作而必須做的準(zhǔn)備工作。循環(huán)初值分兩進(jìn)行循環(huán)操作而必須做的準(zhǔn)備工作。循環(huán)初值分兩 類:一類是循環(huán)工作部分的初值,別一類是控制循類:一類是循環(huán)工作部分的初值,別一類是控制循 環(huán)結(jié)束條件的初值。環(huán)結(jié)束條件的初值。 (2)工作部分:即需要重復(fù)執(zhí)行的程序段。這是循)

18、工作部分:即需要重復(fù)執(zhí)行的程序段。這是循 環(huán)的中心,稱之為循環(huán)體。環(huán)的中心,稱之為循環(huán)體。 (3)修改部分:按一定規(guī)律修改操作數(shù)地址及控制)修改部分:按一定規(guī)律修改操作數(shù)地址及控制 變量,以便每次執(zhí)行循環(huán)體時得到新的數(shù)據(jù)。變量,以便每次執(zhí)行循環(huán)體時得到新的數(shù)據(jù)。 (4)控制部分:用來保證循環(huán)程序按規(guī)定的次數(shù)或)控制部分:用來保證循環(huán)程序按規(guī)定的次數(shù)或 特寫條件正常循環(huán)。特寫條件正常循環(huán)。 循環(huán)體循環(huán)體 循環(huán)控制循環(huán)控制 繼續(xù)循環(huán)?繼續(xù)循環(huán)? 初始化初始化 Y N (2) 先判斷后執(zhí)行先判斷后執(zhí)行 循環(huán)體可能一次都不循環(huán)體可能一次都不 執(zhí)行執(zhí)行 初始化初始化 循環(huán)體循環(huán)體 循環(huán)控制循環(huán)控制 繼續(xù)

19、循環(huán)?繼續(xù)循環(huán)? Y N 2. 基本結(jié)構(gòu)形式基本結(jié)構(gòu)形式 (1) 先執(zhí)行后判斷先執(zhí)行后判斷 (dowhile) 至少執(zhí)行一次循環(huán)體至少執(zhí)行一次循環(huán)體 MOV CX,COUNT AGAIN: LOOP AGAIN MOV CX,COUNT AGAIN: DEC CX JNZ AGAIN MOV CX,COUNT AGAIN: JCXZ NEXT DEC CX JMP AGAIN NEXT: 2、循環(huán)程序設(shè)計、循環(huán)程序設(shè)計 (1)循環(huán)的控制方法)循環(huán)的控制方法 下面介紹最常見的兩種控制方法:計數(shù)控制和條件控制。下面介紹最常見的兩種控制方法:計數(shù)控制和條件控制。 計數(shù)控制計數(shù)控制 當(dāng)循環(huán)次數(shù)已知時,

20、通常使用計數(shù)控制法。假設(shè)循環(huán)次數(shù)為當(dāng)循環(huán)次數(shù)已知時,通常使用計數(shù)控制法。假設(shè)循環(huán)次數(shù)為n, 常常用以下三種方法實現(xiàn)計數(shù)控制和條件控制常常用以下三種方法實現(xiàn)計數(shù)控制和條件控制 先將循環(huán)次數(shù)先將循環(huán)次數(shù)n送入循環(huán)體計數(shù)器中,然后,每循環(huán)一次,計數(shù)送入循環(huán)體計數(shù)器中,然后,每循環(huán)一次,計數(shù) 器減器減1,直至循環(huán)計數(shù)器中的內(nèi)容為,直至循環(huán)計數(shù)器中的內(nèi)容為0時結(jié)束循環(huán)。如:時結(jié)束循環(huán)。如: MOV CX,n ;循環(huán)初值部分;循環(huán)初值部分 LOOPA: ;工作部分;工作部分 ;修改部分;修改部分 DEC CX ;控制部分;控制部分 JNZ LOOPA: 其中工作部分、修改部分被重復(fù)執(zhí)行其中工作部分、修改部

21、分被重復(fù)執(zhí)行n次,即當(dāng)(次,即當(dāng)(CX) =n,n-1,1時,重復(fù)執(zhí)行循環(huán)體,當(dāng)(時,重復(fù)執(zhí)行循環(huán)體,當(dāng)(CX) =0時,結(jié)束循環(huán)。時,結(jié)束循環(huán)。 先將循環(huán)次數(shù)的負(fù)值送入循環(huán)計數(shù)器中,然后每循環(huán)先將循環(huán)次數(shù)的負(fù)值送入循環(huán)計數(shù)器中,然后每循環(huán) 一次,計數(shù)器加一次,計數(shù)器加1,直至計數(shù)器中的內(nèi)容為零時結(jié),直至計數(shù)器中的內(nèi)容為零時結(jié) 束循環(huán)。例如:束循環(huán)。例如: MOV CX,n ;循環(huán)初值部分;循環(huán)初值部分 LOOPA: ;工作部分;工作部分 ;修改部分;修改部分 INC CX ;控制部分;控制部分 JNZ LOOPA 其中工作部分、修改部分被重復(fù)執(zhí)行其中工作部分、修改部分被重復(fù)執(zhí)行n次,即當(dāng)(次

22、,即當(dāng)(CX) =n,(n1),1時重復(fù)執(zhí)行,當(dāng)(時重復(fù)執(zhí)行,當(dāng)(CX)=0時時 結(jié)束循環(huán)。結(jié)束循環(huán)。 先將先將0送入循環(huán)計數(shù)器中,然后每循環(huán)一次,計數(shù)器加送入循環(huán)計數(shù)器中,然后每循環(huán)一次,計數(shù)器加1, 直到循環(huán)計數(shù)器的內(nèi)容與循環(huán)次數(shù)直到循環(huán)計數(shù)器的內(nèi)容與循環(huán)次數(shù)n相等時退出循環(huán)。相等時退出循環(huán)。 例如:例如: MOV CX,0 ;循環(huán)初值部分;循環(huán)初值部分 LOOPA: ;工作部分;工作部分 ;修改部分;修改部分 INC CX ;修改部分;修改部分 CMP CX,n JNE LOOPA 其中工作部分、修改部分重復(fù)執(zhí)行其中工作部分、修改部分重復(fù)執(zhí)行n次,即當(dāng)(次,即當(dāng)(CX)=0, 1,n1時

23、重復(fù)執(zhí)行,當(dāng)(時重復(fù)執(zhí)行,當(dāng)(CX)=n時結(jié)束循環(huán)。時結(jié)束循環(huán)。 條件控制條件控制 有些情況下,循環(huán)次數(shù)事先無法確定,但它與問題的某有些情況下,循環(huán)次數(shù)事先無法確定,但它與問題的某 些條件有關(guān)。這些條件可以通過指令來測試。若測試比些條件有關(guān)。這些條件可以通過指令來測試。若測試比 較的結(jié)果表明滿足循環(huán)條件,則繼續(xù)循環(huán),否則結(jié)束循較的結(jié)果表明滿足循環(huán)條件,則繼續(xù)循環(huán),否則結(jié)束循 環(huán)。環(huán)。 例例:統(tǒng)計:統(tǒng)計AX寄存器中寄存器中1的個數(shù),并將結(jié)果存放在的個數(shù),并將結(jié)果存放在CL寄存寄存 器中。器中。 MOV CL,0 L: AND AX,AX JZ EXIT SAL AX,1 ;將;將AX中的最高位移

24、入中的最高位移入CF中中 JNC L ;如果;如果CF=0,轉(zhuǎn),轉(zhuǎn)L INC CL ;如果;如果CF=1,則(,則(CL)+1CL JMP L ;轉(zhuǎn);轉(zhuǎn)L處繼續(xù)循環(huán)處繼續(xù)循環(huán) EXIT: 2、單重循環(huán)程序設(shè)計、單重循環(huán)程序設(shè)計 所謂單重循環(huán)指循環(huán)體內(nèi)不再包含循環(huán)結(jié)構(gòu)。下面所謂單重循環(huán)指循環(huán)體內(nèi)不再包含循環(huán)結(jié)構(gòu)。下面 分循環(huán)次數(shù)已知和未知兩種情況討論其程序設(shè)計方分循環(huán)次數(shù)已知和未知兩種情況討論其程序設(shè)計方 法。法。 (1)循環(huán)次數(shù)已知的循環(huán)程序設(shè)計)循環(huán)次數(shù)已知的循環(huán)程序設(shè)計 對于循環(huán)次數(shù)已知的情況,通常采用計數(shù)控制方法對于循環(huán)次數(shù)已知的情況,通常采用計數(shù)控制方法 來實現(xiàn)循環(huán)。來實現(xiàn)循環(huán)。 (2

25、)最大循環(huán)次數(shù)未知的循程序設(shè)計)最大循環(huán)次數(shù)未知的循程序設(shè)計 對于循環(huán)次數(shù)未知的情況,常用條件來控制循環(huán)。對于循環(huán)次數(shù)未知的情況,常用條件來控制循環(huán)。 3、多重循環(huán)程序設(shè)計、多重循環(huán)程序設(shè)計 多重循環(huán)即循環(huán)體內(nèi)套有循環(huán)。設(shè)計多重循環(huán)程序多重循環(huán)即循環(huán)體內(nèi)套有循環(huán)。設(shè)計多重循環(huán)程序 時,可以從外層循環(huán)到內(nèi)層循環(huán)一層一層地進(jìn)行。時,可以從外層循環(huán)到內(nèi)層循環(huán)一層一層地進(jìn)行。 4.3 4.3 循環(huán)程序設(shè)計循環(huán)程序設(shè)計 例例4.3.1 在BUFFER開始的地址處,有一組有符號數(shù)。要 求統(tǒng)計其中負(fù)數(shù)的個數(shù)。 程序: DATA SEGMENT BUFFER DB 2,-3,18,-24,87,-98 N E

26、QU $-BUFFER RESLT DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START PROCFAR PUSH DS XOR AX,AX PUSH AX MOV AX,DATA MOV DS,AX MOV BX,OFFSET BUFFER MOV CX,N MOV DL,0 LOP:MOV AL,BX AND AL,AL JNS NEXT INC DL NEXT:INC BX LOOP LOP MOV RESLT,DL ADD DL,30H MOV AH,2 INT 21H RET START ENDP CODE ENDS END

27、 START 例例4.3.2 在地址ADDR開始處,存放有100個 無序的無符號數(shù)。要求按降序排列(大數(shù)在前、 小數(shù)在后),結(jié)果仍存放到原地址區(qū)。 分析:在前面的例子中,已討論過求最大值的問題, 現(xiàn)在要求是在找到最大值后再找次大數(shù),且置 于最大數(shù)后,以此類推,直到將所有的數(shù)都按降 序排列完為止。所以,這是一個重復(fù)尋找最大 數(shù)問題。每找一個最大數(shù),要逐個與數(shù)列比較, 將其作為內(nèi)循環(huán)處理。當(dāng)找到一個最大數(shù)后, 還要在數(shù)列中找下一個次大的數(shù),要重復(fù)使用 循環(huán)程序,用控制重復(fù)執(zhí)行內(nèi)循環(huán)的程序部分 作為外循環(huán)程序,這是一個二重循環(huán)程序。 源程序: DATA SEGMENT ADDR DB 4AH,63H

28、,27H,48H,22H,39H, DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START PROC FAR PUSH DS XOR AX,AX PUSH AX MOV AX,DATA MOV DS,AX MOV CX,100-1 ;置計數(shù)器初值 MOV SI,OFFSET ADDR ;取數(shù)據(jù)序列首指針 LP1: MOV DX,CX ;置內(nèi)循環(huán)計數(shù)器 MOV DI,SI ;置內(nèi)循環(huán)地址指針 MOV AL,DI ;取數(shù) LP2: INC DI ;指向下一個數(shù)地址 CMP AL,DI ;判大小 JAE NEXT ;AL大,轉(zhuǎn)NEXT MOV BL,A

29、L ;否則,交換數(shù)據(jù) MOV AL,DI MOV DI,BL NEXT: DEC DX ;本遍比較完? JNZ LP2 ;未完,轉(zhuǎn)LP2 MOV SI,AL ;完,存最大數(shù) INC SI ;調(diào)整外循環(huán)地址指針 LOOP LP1 ;未排完隊列,轉(zhuǎn)LP1 RET ;排完,返回 CODE ENDS END START 子程序:重復(fù)使用的程序段或具有通用性便于共享的子程序:重復(fù)使用的程序段或具有通用性便于共享的 程序段程序段 1.1.調(diào)用子程序用調(diào)用子程序用CALLCALL指令,返回調(diào)用程序用指令,返回調(diào)用程序用RETRET指令指令 2. 現(xiàn)場的保護(hù)和恢復(fù)現(xiàn)場的保護(hù)和恢復(fù) 現(xiàn)場:現(xiàn)場:指轉(zhuǎn)向子程序執(zhí)行

30、時主程序的狀態(tài),包括當(dāng)指轉(zhuǎn)向子程序執(zhí)行時主程序的狀態(tài),包括當(dāng) 時標(biāo)志寄存器、段寄存器、通用寄存器的內(nèi)容時標(biāo)志寄存器、段寄存器、通用寄存器的內(nèi)容 退出子程序前要退出子程序前要恢復(fù)現(xiàn)場恢復(fù)現(xiàn)場。 現(xiàn)場的保護(hù)和恢復(fù)分別用現(xiàn)場的保護(hù)和恢復(fù)分別用PUSH和和POP指令實現(xiàn)指令實現(xiàn) 調(diào)用前要預(yù)先確定子程序中要調(diào)用前要預(yù)先確定子程序中要使用哪些寄存使用哪些寄存 器,并定義入口參數(shù)和出口參數(shù)器,并定義入口參數(shù)和出口參數(shù)。 參數(shù)傳遞的方法:參數(shù)傳遞的方法: (1)使用約定的寄存器傳遞)使用約定的寄存器傳遞 (2)使用約定的存儲單元傳遞)使用約定的存儲單元傳遞 (3)使用堆棧傳遞)使用堆棧傳遞 (要用(要用BP尋

31、址)尋址) 4.4 4.4 子程序子程序 例例4.4.2 對存于ADD1地址起的20個非壓縮 的十進(jìn)制數(shù),要求用十進(jìn)制數(shù)轉(zhuǎn)ASCII碼 的子程序完成代碼轉(zhuǎn)換,并存于ADD2地 址起的單元中,轉(zhuǎn)換后的字符在屏幕上 進(jìn)行顯示。十進(jìn)制數(shù)轉(zhuǎn)ASCII碼子程序使 用段間調(diào)用。 源程序: NAME SUBPROG EXTRN ADD1:BYTE CODE2 SEGMENT PARA PUBLIC CODE SPRG PROC FAR ASSUME CS:CODE2 PUBLIC SPRG STT: MOV AL,ADD1SI ADD AL,30H RET SPRG ENDP CODE2 ENDS END

32、NAME EX DATA SEGMENT ADD1 DB 04H,05H,06H,02H,07H,05H,02H,03H,05H,08H DB 08H,07H,09H,04H,09H,08H,05H,06H,07H,06H ADD2 DB 20 DUP(?) ADD3 EQU 20 DATA ENDS STACK SEGMENT PARA STACK STACK DW 100 DUP(?) STACK ENDS PUBLIC ADD1 EXTRN SPRG:FAR CODE1 SEGMENT PARA PUBLIC CODE ASSUME CS:CODE1,DS:DATA,SS:STACK S

33、TART:MOV AX,DATA MOV DS,AX MOV DI,0 MOV SI,0 MOV CX,ADD3 LP: CALL SPRG ;段間調(diào)用 MOV ADD2DI,AL INC DI INC SI MOV DL,AL MOV AH,02 INT 21H MOV DL, INT 21H LOOP LP MOV AH,4CH INT 21H CODE1 ENDS END START 4.4.4 4.4.4 調(diào)用程序和子程序間的參數(shù)傳遞調(diào)用程序和子程序間的參數(shù)傳遞 一、子程序說明文件一、子程序說明文件 子程序說明文件子程序說明文件主要信息: ()子程序的名稱及其功能; ()子程序的入口參

34、數(shù)說明; ()子程序的出口參數(shù)說明; ()子程序所使用的寄存器及存儲區(qū); ()子程序調(diào)用其它子程序的方式及名稱。 二、主程序和子程序之間的參數(shù)傳遞方式二、主程序和子程序之間的參數(shù)傳遞方式 1利用寄存器傳遞參數(shù)利用寄存器傳遞參數(shù) 2利用存儲器傳遞參數(shù)利用存儲器傳遞參數(shù) 3利用堆棧傳遞參數(shù)利用堆棧傳遞參數(shù) 利用存儲器傳遞參數(shù)舉例利用存儲器傳遞參數(shù)舉例 例例4.4.4 在ABCD地址起有N位帶符號十進(jìn)制數(shù), 其首字符表示為符號(用全0、全1碼分別表示 正和負(fù))。數(shù)的高位在低地址,低位在高地址, 將其轉(zhuǎn)為對應(yīng)的二進(jìn)制數(shù)(負(fù)數(shù)用補(bǔ)碼表示), 并存于ABIN起的地址單元中,限定十進(jìn)制數(shù)在 士65535范圍

35、之中。 分析:為實現(xiàn)N 位帶符號的十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn) 制數(shù),將十進(jìn)制數(shù)表示為下式: d0、d1、d2、 d3、d4、d(n-1),其中d0為符號位。 考慮相鄰位數(shù)權(quán)值相差10倍,則該十進(jìn)制數(shù)的二 進(jìn)制數(shù)值可用下式表示: (d1*1O+d2)*1O+d3)*10+)*10+d(n-1) 若符號位為正,則該值即為二進(jìn)制正數(shù)值。若符 號位為負(fù),則應(yīng)將該數(shù)轉(zhuǎn)為負(fù)數(shù)的補(bǔ)碼。 為了實現(xiàn)存儲器參數(shù)傳遞,由SI作十進(jìn)制數(shù) 地址指針,DI作二進(jìn)制數(shù)地址指針,CX指示十 進(jìn)制數(shù)位長。子程序返回參數(shù)由AX提供, AX=0, 表示十進(jìn)制數(shù)有錯或結(jié)果溢出。AX0,表示 其內(nèi)容為正確的二進(jìn)制數(shù)結(jié)果。 源程序: STACK

36、 SEGMENTPARA STACK STACK DB 200 DUP(?) STACK ENDS DATA SEGMENT ABCD DB 0,0,0,3,4,5 ABIN DB 3 DUP(O) N EQU 6 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA ASSUME SS:STACK START: MOV AX,DATA MOV DS,AX LEA SI,ABCD ;置數(shù)據(jù)地址指針(含符號位) LEA DI,ABIN ;置結(jié)果數(shù)據(jù)地址指針 (含符號 位) MOV CX,N-1 ;置計數(shù)器初值 CALL DTOB ;調(diào)用 DTOB子程序 CM

37、P AX,O ;返回碼表錯? JNE FIN ;無錯,轉(zhuǎn) FIN MOV DL,0 ;顯示 0,表示結(jié)果有錯。 MOV AH,02H INT 21H FIN: MOV AH,4CH INT 21H CODE ENDS ;子程序名:DTOB ;功能:把由SI指出的存儲單元中的有符號十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù),結(jié)果存 于AX寄存器中。 ;入口參數(shù): SI指向十進(jìn)制數(shù)(非壓縮BCD數(shù))首址 ; DI指向二進(jìn)制數(shù)存儲區(qū)首址 ; CX十進(jìn)制數(shù)位長(含符號位) ;出口參數(shù):AX返回碼,AX=0,十進(jìn)制數(shù)有錯或結(jié)果溢出; AX0, AX 中為轉(zhuǎn)換后的二進(jìn)制數(shù)。 ;使用寄存器:BX為存放各十進(jìn)制數(shù)位運算值,DX存

38、放乘積運算的高位值。 DTOB PROC PUSH DX ;保護(hù)寄存器 PUSH BX MOV BL,SI ;取符號 CMP BL,0 JZ PLUS ;為正,轉(zhuǎn)PLUS CMP BL,OFFH ;為負(fù)嗎? JNZ EROR ;非負(fù)非正轉(zhuǎn)EROR處 PLUS:MOV DI,BL ;存結(jié)果的符號 DEC CX INC SI MOV AL,SI ;取十進(jìn)制數(shù)高位存AX中 MOV AH,0 MOV DX,10 NEXT:PUSH DX MUL DX ;AX*10AX POP DX INC SI MOV BL,SI ;取低位十進(jìn)制數(shù) MOV BH,0 ADD AX,BX ;AX加上低位數(shù) JC ERO

39、R ;進(jìn)位,轉(zhuǎn)EROR LOOP NEXT ;未處理完循環(huán) CMP BYTE PTR DI,OFFH ;判結(jié)果符號 JNZ DONE ;非負(fù)數(shù),結(jié)束 NEG AX ;負(fù)數(shù),取補(bǔ) MOV WORD PTR DI,AX ;補(bǔ)碼送回 JMP DONE EROR:MOV AX,0 ;置錯誤返回碼 DONE:POP BX POP DX RET DTOB ENDP CODE ENDS END START 利用堆棧傳遞參數(shù)舉例利用堆棧傳遞參數(shù)舉例 例例4.4.5 NUMB 開始的地址處,有5個壓縮型BCD碼, 將它們相加,其和在屏幕上顯示。 源程序: STACK SEGMENT PARA STACK STA

40、CK DW 50 DUP (?) TOP LABEL WORD STACK ENDS DATA SEGMENT NUMB DB 25H,36H,78H,49H,07H NOUT DB 5 DUP(?) N EQU 5 DATA ENDS EXTRN ADDS:FAR DIS MACRO X MOV DL,X OR DL,30H MOV AH,02 INT 21H ENDM MCODE SEGMENT PARA PUBLIC CODE ASSUME CS:MCODE,DS:DATA,SS:STACK START:MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,

41、AX MOV SP,OFFSET TOP MOV AX,OFFSET NUMB PUSH AX MOV AX,N PUSH AX CALL ADDS CALL DISP MOV AH,4CH INT 21H DISP PROC MOV BX,AX ;存累加和 MOV CL,4 SHR AH,CL ;右移叫工 DIS AH ;顯示高位值 MOV AH,BH AND AH,OFH ;取低位數(shù) DIS AH ;顯示低位數(shù) SHR AL,CL DIS AL MOV AL,BL AND AL,0FH DIS AL RET DISP ENDP MCODE ENDS END START NAME ADDSR

42、 SCODE SEGMENT PARA PUBLIC CODE ASSUME CS:SCODE ADDS PROC FAR PUBLIC ADDS PUSH BP MOV BP,SP PUSH CX PUSH BX MOV CX,BP+6 ;取數(shù)據(jù)項數(shù)N MOV BX,BP+8 ;取數(shù)據(jù)首地址 MOV AX,0 ADER:ADD AL,BX DAA ADC AH,0 INC BX LOOP ADER POP BX POP CX POP BP RET 4 ;退回到本例使用前的棧頂 ADDS ENDP SCODE ENDS END 45 軟中斷和軟中斷和BIOS調(diào)用調(diào)用 4 45 51 8088/

43、80861 8088/8086的中斷系統(tǒng)的中斷系統(tǒng) 一、一、8088/80868088/8086的中斷源的中斷源 軟中斷軟中斷 軟中斷指令格式:INT n n為中斷類型號, n 0 256。 07中 斷類型號做為內(nèi)部中斷不可屏蔽中斷的 類型號。80FH做為外部硬中斷。 內(nèi)部中斷 (1)除法溢出中斷)除法溢出中斷 (2)溢出中斷)溢出中斷 (3)單步中斷)單步中斷 二、二、 中斷矢量表中斷矢量表 1中斷矢量表結(jié)構(gòu)與功能中斷矢量表結(jié)構(gòu)與功能 中斷矢量表中斷矢量表 存256個中斷處理程序入 口地址的表,共占用 1024個字節(jié),位于物理 (0段)地址OOO0OH- 003FFH 。 每個入口地址占四個

44、字 節(jié),高兩個字節(jié)存放中 斷處理程序的段地址, 低兩個字節(jié)存放中斷處 理程序的段內(nèi)偏移量。 4.5.2 4.5.2 軟中斷程序設(shè)計及執(zhí)行過程軟中斷程序設(shè)計及執(zhí)行過程 一、一、用戶軟中斷設(shè)置的內(nèi)容用戶軟中斷設(shè)置的內(nèi)容 1.確定一個允許用戶使用的中斷類型號n。 2.編寫軟中斷的處理程序,明確其入口參數(shù)及出口參數(shù) 的規(guī)定。 3.將中斷處理程序入口地址寫入中斷矢量表。 二、中斷處理程序的結(jié)構(gòu)二、中斷處理程序的結(jié)構(gòu) 1.保護(hù)現(xiàn)場保護(hù)現(xiàn)場 2.中斷處理程序的主要內(nèi)容中斷處理程序的主要內(nèi)容 3.恢復(fù)現(xiàn)場恢復(fù)現(xiàn)場 4.中斷返回中斷返回 中斷處理程序的一般結(jié)構(gòu): INTPRG PROC FAR/NEAR STI

45、 ;開中斷,適合嵌套方式 PUSH DS ;保護(hù)現(xiàn)場 PUSH DX PUSH AX PUSH BX PUSH DI ;中斷處理指令序列(略) POP DI ;恢復(fù)現(xiàn)場 POP BX POP AX POP DX POP DS IRET ;中斷返回 INTPRG ENDP 三、三、 填寫中斷矢量表填寫中斷矢量表 中斷處理程序的入口地址,存放在中斷 矢量表中的4n地址處。 DOS系統(tǒng)25H調(diào)用填寫中斷矢量表的填寫中斷矢量表的方法: (1)AH25H,AL中斷類型號n; (2) DS:DX中斷處理程序的入口地址(段 地址:段內(nèi)偏移量); (3) 執(zhí)行INT 21H指令,即可將中斷處理程 序的入口地址寫入中斷矢量表。 例:例:將中斷處理程序的入口地址寫入中斷矢量表 CODE SEGMENT ASSUME CS:CODE ST: MOV AX,SEG INTP ;取中斷處理子程序段地址 MOV DS,AX MOV AX,OFFSET INTP ;取中斷處理子程序偏移量 MOV DX, AX MOV AL,n ;置中斷類型號 MOV AH,25H ;置DOS調(diào)用功能號 INT 21H INTP PROC ;中斷處理程序 IRET INTP ENDP CODE ENDS END

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論