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