第九章实验

实验结论

一、实验一:成在屏幕上输出内存单元中的十进制两位数

1、源代码

 

 1 ; 在屏幕上输出内存单元中的十进制两位数
 2 assume cs:code, ds:data
 3 data segment
 4      db 12
 5      db ?,?   ; 前一个字节用于保存商,后一个字节用于保存余数
 6 data ends
 7 code segment
 8 start:
 9       mov ax,data
10       mov ds,ax        ; 补全指令,使得ds <-- data段地址
11       
12       mov ah,0
13       mov al,ds:[0]   ; ax <-- data段字节单元的被除数12
14       mov bl,10;除数为16位,被除数应为32位,并没有设定高十六位的值给DX???(默认为0)?
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

2、运行结果

 二、实验二:屏幕上输出data段定义的5个十进制两位数,数据和数据之间以空格间隔。

1、源代码

 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
 8      mov ds,ax
 9      mov cx,5
10      mov si,0
11 s:    mov ah,0
12       mov al,ds:[si] ;不可使用ds:[bx],因为后面bx的值会被覆盖
13       inc si
14       mov bl,10
15       div bl
16       mov  ds:[6],al   
17       mov  ds:[7],ah   
18  
19       mov ah,2
20       mov dl,ds:[6]   
21       add dl,30h    
22       int 21h
23       mov ah,2
24       mov dl,ds:[7]   
25       add dl,30h    
26       int 21h
27       mov ah,2 
28       mov dl,20h
29       int 21h
30       loop s
31      
32       mov ax,4c00h
33       int 21h
34 code ends
35 end start

2、运行结果

 三、实验三:在屏幕中间分别显示不同颜色的要求字符串 

1、源代码

 ①初代

 1 assume ds:data, cs:code
 2 data segment
 3        db 'welcome to masm!'  
 4        db 2H,24H,71H          ;字符串属性值依次为:绿色、绿底红色、白底蓝色
 5 data ends
 6 
 7 code segment
 8 start:  mov ax,data
 9         mov ds,ax            ;字符串及属性值所在段的段地址送入ds
10         
11         mov ax,0b800H         ;0b800与b800的区别在哪儿?
12         mov es,ax            ;80×25彩色字符模式显示缓冲区段地址送入es
13         
14         mov cx,16
15         mov bx,0
16         mov si,64
17 s:      mov ah,ds:[bx]
18         mov es:[si],ah
19         inc si
20         mov al,2h
21         mov es:[si],al
22         inc si
23         inc bx
24         loop s
25                
26         mov cx,16
27         mov bx,0
28         mov si,224       ;64+160最简单的调整字符位置方法
29 s1:      mov ah,ds:[bx]
30         mov es:[si],ah
31         inc si
32         mov al,24h
33         mov es:[si],al
34         inc si
35         inc bx
36         loop s1
37         
38                        
39         mov cx,16
40         mov bx,0
41         mov si,384        ;224+160调整字符位置,有点过于直白
42 s2:      mov ah,ds:[bx]
43         mov es:[si],ah
44         inc si
45         mov al,71h
46         mov es:[si],al
47         inc si
48         inc bx
49         loop s2
50         
51         
52        
53 
54         mov ax,4c00h
55         int 21h
56 code ends
57 end start

②改进后的代码

 1 assume ds:data, cs:code
 2 data segment
 3        db 'welcome to masm!'  
 4        db 2H,24H,71H          ;字符串属性值依次为:绿色、绿底红色、白底蓝色
 5 data ends
 6 
 7 code segment
 8 start:  mov ax,data
 9         mov ds,ax            ;字符串及属性值所在段的段地址送入ds
10         
11         mov ax,0b800H
12         mov es,ax            ;80×25彩色字符模式显示缓冲区段地址送入es
13         
14         mov cx,16
15         mov bx,0
16         mov si,64
17 s:      mov ah,ds:[bx]
18         mov es:[si],ah
19         mov ah,ds:[bx]
20         mov es:[si+160],ah
21         mov ah,ds:[bx]
22         mov es:[si+320],ah
23         inc si
24         mov al,2h
25         mov es:[si],al
26         mov al,24h
27         mov es:[si+160],al
28         mov al,71h
29         mov es:[si+320],al
30         inc si
31         inc bx
32         loop s
33                
34         
35 
36         mov ax,4c00h
37         int 21h
38 code ends
39 end start

 2、运行结果

总结与体会

 1、掌握了编写一个在屏幕输出相应字符的程序,以及如何在屏幕上输出一个数字字符

 2、可以使用多种多种寻址方式,灵活进行寻址,简化操作过程

 3、div的使用,除数为8位和16位,将被除数放的位置不同,使用时应该注意

posted @ 2018-12-08 16:44  折风  阅读(154)  评论(0编辑  收藏  举报