第九章实验
实验结论
一、实验一:成在屏幕上输出内存单元中的十进制两位数
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位,将被除数放的位置不同,使用时应该注意