1. 程式人生 > >實驗9 根據材料編程

實驗9 根據材料編程

執行 行號 註釋 不難 成功 任務 .com 結合 star

1. 補全程序 t1.asm,完成在屏幕上輸出內存單元中的十進制兩位數

補全得t1。asm如下:

 1 ; 在屏幕上輸出內存單元中的十進制兩位數
 2 assume cs:code, ds:data
 3 data segment
 4      db 12
 5      db 0h,0h ; 前一個字節用於保存商,後一個字節用於保存余數
 6 data ends
 7 code segment
 8 start:
 9       mov ax,data        ; 補全指令,使得ds <-- data段地址
10       mov ds,ax
11       
12       mov
ah,0 13 mov al,ds:[0] ; ax <-- data段字節單元的被除數12 14 mov bl,10 15 div bl 16 mov ds:[1],al ; 補全代碼,讓商保存到data段註釋中指定的單元 17 mov ds:[2],ah ; 補全代碼,讓余數保存到data段註釋中指定的單元 18 19 mov ah,2 20 mov dl,ds:[1] ; 補全代碼,使得dl <-- data段中保存的商的字節單元數值 21 add dl,30h ;
補全代碼,使得dl中的數值轉換為數字字符 22 int 21h 23 24 mov ah,2 25 mov dl,ds:[2] ; 補全代碼,使得dl <-- data段中保存余數的字節單元數值 26 add dl,30h ; 補全代碼,使得dl中的數值轉換為數字字符 27 int 21h 28 29 mov ax,4c00h 30 int 21h 31 code ends 32 end start

在此代碼段中,div指令使al/10,除數為八位,al存儲除法操作的商,ah存儲除法操作的余數,倘如為16位,ax,則存儲商,dx存儲余數。

mov ah,2 為二號功能調用,輸出dl內的字符格式內容

add dl,30h 意為把dl內容數字字符畫,數字與數字字符ASCII碼值間相差48,即30h

成功編譯連接:

技術分享圖片

可得如下結果,成功輸出“12”:

技術分享圖片

2. 補全程序 t2.asm,完成在屏幕上輸出 data 段定義的 5 個十進制兩位數,數據和數據
之間以空格間隔。

補全得t2.asm,如下:

 1 assume cs:code, ds:data
 2 data segment
 3      db 12,35,96,55,67
 4 data ends
 5 code segment
 6 start:
 7       mov ax,data; 補全程序,參考t1.asm,綜合應用以下知識完成:
 8       mov ds,ax  
 9       mov si,0
10       mov cx,0005
11       
12    s: mov ah,0
13       mov al,ds:[si] 
14       mov bl,10
15       div bl
16 
19       mov bh,ah   
20 
21       mov ah,2
22       mov dl,al
23       add dl,30h
24       int 21h
25 
26       ;mov ah,2
27       mov dl,bh  
28       add dl,30h        
29       int 21h
30       
31       ;mov ah,2
32       mov dl,32
33       int 21h
34       add si,1;
35       loop s
36       
37       ; (1) loop指令、內存單元地址的靈活表示
38       ; (2) div指令, 數字→數字字符的轉換
39       ; (3) int 21h的2號子功能,完成單個字符輸出的方法,即: 
40       ;     mov ah,2
41       ;     mov dl,待輸出字符或其ASCⅡ碼
42       ;     int 21h
43       ; (4) 數據和數據之間以空格間隔的實現: 使用(3)輸出空格字符
44       
45       mov ax,4c00h
46       int 21h
47 code ends
48 end start

原理同任務1,關於al和ah的數值移動,al保留,因為其它內容不曾動用ax的低八位寄存器,故可直接賦給dl,

ah中的數值則間接通過bh傳至dl;

空格則直接賦予dl=32,對應空格字符

成功編譯連接:

技術分享圖片

可得如下結果,成功輸出數字字符串:

技術分享圖片

3.編程:在屏幕中間分別顯示綠色、綠底紅色、白底藍色的字符串‘welcome to masm!‘

編寫代碼如下:

 1 ; p187 實驗9
 2 
 3 assume ds:data, cs:code
 4 data segment
 5        db welcome to masm!  
 6        db 2H,24H,71H          ;字符串屬性值
 7 data ends
 8 
 9 code segment
10 start:  mov ax,data
11         mov ds,ax            ;字符串及屬性值所在段的段地址送入ds
12         
13         mov ax,0b800H
14         mov es,ax            ;80×25彩色字符模式顯示緩沖區段地址送入es
15         
16         mov di,0
17         mov bx,1820
18         
19         mov cx,3
20         
21      s: push cx
22         mov si,0
23         mov cx,16
24     s0: mov al,ds:[si]
25         mov es:[bx],al
26         
27         mov al,ds:[16+di]
28         mov es:[bx+1],al
29         
30         inc si
31         add bx,2
32         loop s0
33         
34         add di,1
35         add bx,128
36         pop cx
37         loop s
38         ; 添加代碼,通過循環逐個將每個字符及其屬性送入相應的顯示緩沖區對應行
39         ; 即:將data段的字符及屬性通過循環逐個mov到顯示緩沖區(es)段相應的單元內
40         
41         ; 可以先嘗試分別寫三段代碼,每次完成一行的顯示
42         ; 程序運行起來後,再嘗試通過靈活的尋址方式和循環,對三段代碼修改和簡化
43         ; 學習第10章子程序後,還可以進一步完善優化,設計子程序,將行號、列號、顏色屬性設置成入口參數
44         
45 
46         mov ax,4c00h
47         int 21h
48 code ends
49 end start

代碼段中的顯示緩沖區位於B800H~BFFFFH共32KB的空間中,緩沖區分為25行,80列,代碼段中使用b800h為段地址,經過不斷調試與磨合,本人選區以偏移地址為1820(十進制)開始的區域寫入字符內容和屬性值,因為每行相差160個字節內容,而字符串為16個字節,又結合屬性值,總共占有16*2個字節,故本人通過add bx,160-16*2來換行對齊。

該代碼段使用雙重循環,共執行3*16次。

成功編譯連接:

技術分享圖片

可成功得如下執行結果:

技術分享圖片

本次實驗循序漸近,任務內容難度逐漸提高,但本質上大同小異,會做任務1,通過自我探索,不難實現任務2、3。

實驗9 根據材料編程