一.实验内容
1.完成在屏幕上输出内存单元中的十进制两位数
2.完成在屏幕上输出data段定义的5个十进制两位数,数据和数据之间以空格间隔
3.教材实验9:在屏幕中间分别显示绿色,绿底红色,白底蓝色的字符串‘weclome to masm’
二.实验步骤
1.代码如下
; 在屏幕上输出内存单元中的十进制两位数assume cs:code, ds:datadata segmentdb 12db ?,? ; 前一个字节用于保存商,后一个字节用于保存余数data endscode segmentstart:mov ax,datamov ds,ax ; 补全指令,使得ds <-- data段地址mov ah,0mov al,ds:[0] ; ax <-- data段字节单元的被除数12mov bl,10div blmov ds:[1],al ; 补全代码,让商保存到data段注释中指定的单元mov ds:[2],ah ; 补全代码,让余数保存到data段注释中指定的单元mov ah,2mov dl,ds:[1] ; 补全代码,使得dl <-- data段中保存的商的字节单元数值add dl,30h ; 补全代码,使得dl中的数值转换为数字字符int 21hmov ah,2mov dl,ds:[2] ; 补全代码,使得dl <-- data段中保存余数的字节单元数值add dl,30h ; 补全代码,使得dl中的数值转换为数字字符 int 21hmov ax,4c00hint 21hcode endsend start
实验结果如下:
2.代码如下:
;完成在屏幕上输出data段定义的5个十进制两位数,数据和数据 之间以空格;间;隔。 assume cs:code, ds:datadata segment db 12,35,96,55,67data endscode segmentstart: ; 补全程序,参考t1.asm,综合应用以下知识完成: ; (1) loop指令、内存单元地址的灵活表示 ; (2) div指令, 数字→数字字符的转换 ; (3) int 21h的2号子功能,完成单个字符输出的方法,即: ; mov ah,2 ; mov dl,待输出字符或其ASCⅡ码 ; int 21h ; (4) 数据和数据之间以空格间隔的实现: 使用(3)输出空格字符 mov ax,data mov ds,ax mov si,0 mov cx,5S: mov ah,0 mov al,ds:[si] mov bl,10 div bl mov dl,al mov dh,ah mov ah,2 add dl,30h int 21h mov ah,2 mov dl,dh add dl,30h int 21h mov ah,2 mov dl,0 int 21h inc siloop S mov ax,4c00h int 21hcode endsend start
实验截图如下:
3.这题花费了不少时间 主要还犯了写低级错误 push inc等后面竟然加了逗号
另外一开始考虑循环 没注意到有些值之间相互影响
尽量使用不同的寄存器
此外为了满足题目要求输出在屏幕中间 做了些基础的计算,但很粗糙
代码如下:
assume ds:data, cs:code,ss:stackdata segment db 'welcome to masm!' db 2H,24H,71H data endsstack segmentdb 0stack endscode segmentstart: mov ax,data mov ds,ax mov ax, stack mov ss,ax mov ax,0b800H mov es,ax mov bx,1920 mov si,0 mov di,0 mov cx,3 mov bp,16 s: push cx mov cx,16 mov si,60 mov di,0s1: mov al,ds:[di] mov es:[bx+si],al mov al,ds:[bp] mov es:[bx+si+1],al add si,2 inc diloop s1 add bx,160 inc bp pop cxloop scode endsend start
运行截图如下:
在程序改bug过程中出现很多好玩的事
如屏幕持续刷新图像,出现各种颜色
这些都与写的循环有关