实验内容:
1、补全程序 t1.asm,完成在屏幕上输出内存单元中的十进制两位数
(1)实验源代码:
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 10 mov ds,ax ; 补全指令,使得ds <-- data段地址 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
(2)实验结果:
(3)实验分析:本题的核心代码为第21行与第26行,因为本体最后要输出内存单元中的十进制两位数,然而在ASCII表中字符型字符与相对应的数字型字符相差了48d,即30h。其他的就是一些基础的数据从哪来,提取出来进行操作并把数据进行存储的过程,相对容易。
2、补全程序 t2.asm,完成在屏幕上输出 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 ; 补全程序,参考t1.asm,综合应用以下知识完成: 8 ; (1) loop指令、内存单元地址的灵活表示 9 ; (2) div指令, 数字→数字字符的转换 10 ; (3) int 21h的2号子功能,完成单个字符输出的方法,即: 11 ; mov ah,2 12 ; mov dl,待输出字符或其ASCⅡ码 13 ; int 21h 14 ; (4) 数据和数据之间以空格间隔的实现: 使用(3)输出空格字符 15 mov ax,data 16 mov ds,ax 17 18 mov cx,5h 19 mov si,0h 20 mov bl,10 21 22 s: mov ah,0 23 mov al,ds:[si] 24 div bl 25 mov ds:[si+5],al 26 mov ds:[si+6],ah 27 28 mov ah,2 29 mov dl,ds:[si+5] 30 add dl,30h 31 int 21h 32 33 mov ah,2 34 mov dl,ds:[si+6] 35 add dl,30h 36 int 21h 37 38 mov ah,2 39 mov dl,32 40 int 21h 41 42 inc si 43 loop s 44 45 mov ax,4c00h 46 int 21h 47 code ends 48 end start
(2)实验结果:
(3)实验分析:第二个小实验和第一个小实验很类似的。
3、教材实验 9(P187)
(1)实验源代码:
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 ; 添加代码,通过循环逐个将每个字符及其属性送入相应的显示缓冲区对应行 17 ; 即:将data段的字符及属性通过循环逐个mov到显示缓冲区(es)段相应的单元内 18 19 ; 可以先尝试分别写三段代码,每次完成一行的显示 20 ; 程序运行起来后,再尝试通过灵活的寻址方式和循环,对三段代码修改和简化 21 ; 学习第10章子程序后,还可以进一步完善优化,设计子程序,将行号、列号、颜色属性设置成入口参数 22 mov bx,0 23 mov si,0 24 mov cx,16 25 26 s0: mov ax,[bx] 27 mov es:[bx+720h][si],ax 28 mov al,2 ;存放颜色属性值绿色 29 mov es:[bx+721h][si],al 30 inc bx 31 inc si 32 loop s0 33 34 35 mov bx,0 36 mov cx,16 37 mov si,160 38 39 s1: mov ax,[bx] 40 mov es:[bx+720h][si],ax 41 mov al,36 ;绿底红色 42 mov es:[bx+721h][si],al 43 inc bx 44 inc si 45 loop s1 46 47 48 49 mov bx,0 50 mov cx,16 51 mov si,320 52 53 s2: mov ax,[bx] 54 mov es:[bx+720h][si],ax 55 mov al,113 ;白底蓝色 56 mov es:[bx+721h][si],al 57 inc bx 58 inc si 59 loop s2 60 61 mov ax,4c00h 62 int 21h 63 code ends 64 end start
(2)实验结果:
4、实验总结:
这次的3个实验中前两个实验较为简单,但第3个实验自己没有编写出来,应该多多增强自己编写代码的能力,多进行动手操作。