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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

4、 ; 定義目的串定義目的串 bb ENDS cc SEGMENT ;代碼段;代碼段 ASSUME CS:cc, DS:aa, ES:bb ;分配段寄存器;分配段寄存器 start : CLD ;設置傳送方向;設置傳送方向 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 ;調用調用4CH系統(tǒng)功能,返回

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

6、H ; AA DB 23H ; 被加數被加數 BB DB 18H BB DB 18H ;加數;加數 CC DB 2 DUP(?) ;CC DB 2 DUP(?) ;結果單元結果單元 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 ;取被加數取被加數 ADD AL, BB ;ADD

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

8、其平方值。 分析:因為平方表已順序排放在內存中。 又已知首地址為SQREA,只要把給定單 元的內容作位移量與表首址相加,就指 向了表中要求值的地址,取其內容即為 該數的平方值。 源程序源程序: 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、取給定單元中數取給定單元中數 MOV BH,0 MOV SI,OFFSET SQREA ;平方表首地址指針平方表首地址指針 MOV AL,SI+BX ;取給定數的平方值取給定數的平方值 MOV ABB,AL ;存回原單元存回原單元 RETF START ENDP CODE ENDS END START 條件滿足條件滿足 ? 處理處理P1處理處理P2 標號標號1: 標號標號2: NY 1. 簡單分支結構簡單分支結構 4.2 分支程序分支程序 分支結構程序設計的關鍵在于準確地知道分支結構程序設計的關鍵在于準確地知道 操作結果影響的標志位狀態(tài)和正確地使用操作結果影響的標志位狀態(tài)和正確地使用 條件轉移

10、指令。根據對條件的判斷而選擇條件轉移指令。根據對條件的判斷而選擇 不同的處理方法是人的基本智能體現。不同的處理方法是人的基本智能體現。 2. 多種分支結構多種分支結構 標號標號1: 條件條件1成立成立 ? P1 N Y 條件條件2成立成立 ? 條件條件n成立成立 ? Pn+1 標號標號2: 標號標號n: 標號標號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 程程 序序 ;- 數據段定義數據段定義 - 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) 則跳轉至則跳轉至C1 JAC2; (AL) (BL) 則跳轉至則跳轉至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 分支程序設計分支程序設計 例例4.2.1 設在A、B兩個存貯單元各有一個無符號數,比較 兩個無符號數的大小,并根據判斷結果,在屏幕顯示 AB或BA或A=B。 分析:兩個無符號數比較大小,使用比較指令CMP,產 生標志位,然后根據標志位,使用無符號條件轉移指 令實現轉移。 源程序: 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中數中數 CMP B,AL ;ACMP B,AL ;A與與B B比較比較 JAE BGA JAE BGA ;BA,BA,轉轉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碼,看做是 一個無符號數。這樣,就轉化為在一組 數中查找一個最大數的操作。通常使用 逐個比較法,即把第一個數作比較標準, 與其后的數比較。如標準數大,則再與 下一個數比較。如標準數小,則將大數 做為新的標準數,再與下一個數比較。 依此類推,逐個比較,直到最后一個標 準的數,就是要找的最大數,即值為最 大的字符。 源程序: 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 ;調整指針 COMP: CMP AL,SI ;字符比較 JA NEXT ;若AL值大,轉NEXT MOV AL,SI ;否則,取大值到AL NEXT: INC SI ; 調整指針 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)程序是在滿足某些條件時對一段程 序的重復執(zhí)行,一般由四部分組成。序的重復執(zhí)行,一般由四部分組成。 4.3 循環(huán)程序循環(huán)程序 (1)循環(huán)初值部分:這是為了保證循環(huán)程序能正常)循環(huán)初值部分:這是為了保證循環(huán)程序能正常 進行循環(huán)操作而必須做的準備工作。循環(huán)初值分兩進行循環(huán)操作而必須做的準備工作。循環(huán)初值分兩 類:一類是循環(huán)工作部分的初值,別一類是控制循類:一類是循環(huán)工作部分的初值,別一類是控制循 環(huán)結束條件的初值。環(huán)結束條件的初值。 (2)工作部分:即需要重復執(zhí)行的程序段。這是循)

18、工作部分:即需要重復執(zhí)行的程序段。這是循 環(huán)的中心,稱之為循環(huán)體。環(huán)的中心,稱之為循環(huán)體。 (3)修改部分:按一定規(guī)律修改操作數地址及控制)修改部分:按一定規(guī)律修改操作數地址及控制 變量,以便每次執(zhí)行循環(huán)體時得到新的數據。變量,以便每次執(zhí)行循環(huán)體時得到新的數據。 (4)控制部分:用來保證循環(huán)程序按規(guī)定的次數或)控制部分:用來保證循環(huán)程序按規(guī)定的次數或 特寫條件正常循環(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. 基本結構形式基本結構形式 (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)程序設計、循環(huán)程序設計 (1)循環(huán)的控制方法)循環(huán)的控制方法 下面介紹最常見的兩種控制方法:計數控制和條件控制。下面介紹最常見的兩種控制方法:計數控制和條件控制。 計數控制計數控制 當循環(huán)次數已知時,

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

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

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

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

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

25、)最大循環(huán)次數未知的循程序設計)最大循環(huán)次數未知的循程序設計 對于循環(huán)次數未知的情況,常用條件來控制循環(huán)。對于循環(huán)次數未知的情況,常用條件來控制循環(huán)。 3、多重循環(huán)程序設計、多重循環(huán)程序設計 多重循環(huán)即循環(huán)體內套有循環(huán)。設計多重循環(huán)程序多重循環(huán)即循環(huán)體內套有循環(huán)。設計多重循環(huán)程序 時,可以從外層循環(huán)到內層循環(huán)一層一層地進行。時,可以從外層循環(huán)到內層循環(huán)一層一層地進行。 4.3 4.3 循環(huán)程序設計循環(huán)程序設計 例例4.3.1 在BUFFER開始的地址處,有一組有符號數。要 求統(tǒng)計其中負數的個數。 程序: 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個 無序的無符號數。要求按降序排列(大數在前、 小數在后),結果仍存放到原地址區(qū)。 分析:在前面的例子中,已討論過求最大值的問題, 現在要求是在找到最大值后再找次大數,且置 于最大數后,以此類推,直到將所有的數都按降 序排列完為止。所以,這是一個重復尋找最大 數問題。每找一個最大數,要逐個與數列比較, 將其作為內循環(huán)處理。當找到一個最大數后, 還要在數列中找下一個次大的數,要重復使用 循環(huán)程序,用控制重復執(zhí)行內循環(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 ;置計數器初值 MOV SI,OFFSET ADDR ;取數據序列首指針 LP1: MOV DX,CX ;置內循環(huán)計數器 MOV DI,SI ;置內循環(huán)地址指針 MOV AL,DI ;取數 LP2: INC DI ;指向下一個數地址 CMP AL,DI ;判大小 JAE NEXT ;AL大,轉NEXT MOV BL,A

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

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

31、址)尋址) 4.4 4.4 子程序子程序 例例4.4.2 對存于ADD1地址起的20個非壓縮 的十進制數,要求用十進制數轉ASCII碼 的子程序完成代碼轉換,并存于ADD2地 址起的單元中,轉換后的字符在屏幕上 進行顯示。十進制數轉ASCII碼子程序使 用段間調用。 源程序: 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 ;段間調用 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 調用程序和子程序間的參數傳遞調用程序和子程序間的參數傳遞 一、子程序說明文件一、子程序說明文件 子程序說明文件子程序說明文件主要信息: ()子程序的名稱及其功能; ()子程序的入口參

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

35、之中。 分析:為實現N 位帶符號的十進制數轉換為二進 制數,將十進制數表示為下式: d0、d1、d2、 d3、d4、d(n-1),其中d0為符號位。 考慮相鄰位數權值相差10倍,則該十進制數的二 進制數值可用下式表示: (d1*1O+d2)*1O+d3)*10+)*10+d(n-1) 若符號位為正,則該值即為二進制正數值。若符 號位為負,則應將該數轉為負數的補碼。 為了實現存儲器參數傳遞,由SI作十進制數 地址指針,DI作二進制數地址指針,CX指示十 進制數位長。子程序返回參數由AX提供, AX=0, 表示十進制數有錯或結果溢出。AX0,表示 其內容為正確的二進制數結果。 源程序: 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 ;置數據地址指針(含符號位) LEA DI,ABIN ;置結果數據地址指針 (含符號 位) MOV CX,N-1 ;置計數器初值 CALL DTOB ;調用 DTOB子程序 CM

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

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

39、R ;進位,轉EROR LOOP NEXT ;未處理完循環(huán) CMP BYTE PTR DI,OFFH ;判結果符號 JNZ DONE ;非負數,結束 NEG AX ;負數,取補 MOV WORD PTR DI,AX ;補碼送回 JMP DONE EROR:MOV AX,0 ;置錯誤返回碼 DONE:POP BX POP DX RET DTOB ENDP CODE ENDS END START 利用堆棧傳遞參數舉例利用堆棧傳遞參數舉例 例例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 ;取低位數 DIS AH ;顯示低位數 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 ;取數據項數N MOV BX,BP+8 ;取數據首地址 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調用調用 4 45 51 8088/

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

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

45、 ;開中斷,適合嵌套方式 PUSH DS ;保護現場 PUSH DX PUSH AX PUSH BX PUSH DI ;中斷處理指令序列(略) POP DI ;恢復現場 POP BX POP AX POP DX POP DS IRET ;中斷返回 INTPRG ENDP 三、三、 填寫中斷矢量表填寫中斷矢量表 中斷處理程序的入口地址,存放在中斷 矢量表中的4n地址處。 DOS系統(tǒng)25H調用填寫中斷矢量表的填寫中斷矢量表的方法: (1)AH25H,AL中斷類型號n; (2) DS:DX中斷處理程序的入口地址(段 地址:段內偏移量); (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調用功能號 INT 21H INTP PROC ;中斷處理程序 IRET INTP ENDP CODE ENDS END

溫馨提示

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

最新文檔

評論

0/150

提交評論