汇编语言 实验9
实验9
实验任务1
补全程序 t1.asm,完成在屏幕上输出内存单元中的十进制两位数
源代码:(横线上为补全和修改部分)
; 在屏幕上输出内存单元中的十进制两位数
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 ;12/10
mov ds:[2],al ;让商保存到data段注释中指定的单元
mov ds:[3],ah ; 让余数保存到data段注释中指定的单元
mov ah,2
mov dl,ds:[2] ; 使得dl <-- data段中保存的商的字节单元数值
or dl,00110000b ; 使得dl中的数值转换为数字字符
int 21h
mov ah,2
mov dl,ds:[3] ; 使得dl <-- data段中保存余数的字节单元数值
or dl,00110000b ; 使得dl中的数值转换为数字字符
int 21h
mov ax,4c00h
int 21h
code ends
end start
实验结果:
Tips:
1.如果mov [内存单元],寄存器 可以显示正确结果,但会报错
改成mov ds:[内存单元],寄存器 就不会报错了
2.如果mov 寄存器,[内存单元] 不能显示正确结果。
虽然不会报错,但是会直接把内存单元的偏移地址送到寄存器内,而不是传送寄存器的内容
实验任务2
补全程序 t2.asm,完成在屏幕上输出 data 段定义的 5 个十进制两位数,数据和数据 之间以空格间隔
源代码部分:(横线上为补全和修改的部分)
assume cs:code, ds:data
data segment
db 12,35,96,55,67
db 10 dup (0)
data ends
code segment
start: mov ax,data ;设置数据段
mov ds,ax
mov bx,0 ;数据段初始偏移地址为0
mov cx,5 ;5个数据循环5次
s: mov al,ds:[bx] ;ax中依次放入数据段数据(字节型)
mov ah,0
mov dl,10
div dl ;为了实现十进制输出
or ah,00110000b ;数字字符->数字的ASCII码
or al,00110000b
mov ds:[bx+5],al ;将商暂存在事先定义的数据段中
mov ds:[bx+6],ah ;将余数暂存在事先定义的数据段中
;输出商
mov ah,2
mov dl,ds:[bx+5]
int 21h
;输出余数
mov ah,2
mov dl,ds:[bx+6]
int 21h
;输出空格
mov ah,2
mov dl,' '
int 21h
inc bx ;每次bx+1(字节型),循环
loop s
mov ax,4c00h
int 21h
code ends
end start
实验结果:
Tips:
- 需要预留几个单元用来存放要输出的十进制数据,否则寄存器不够用
- 注意存放的数据为字节型数据
- 由于输出的是十进制数据,而非十六进制,所以要用到除法,通过除以10取余来得到每一个位上的数字,保存下来并输出
- 注意要把数字字符转换为数字的ASCII码保存,这样才能正确在屏幕上输出数字
- 在屏幕上输出数字只能单个输出,还需要数据与数据之间输出空格来分隔
实验任务3
(1) 在屏幕上0行0列显示黑底绿色的字符串”ABCDEF”
(2) 在屏幕上0行0列显示红底高亮闪烁绿色的字符串”ABCDEF”
直接在debug环境下调试(闪烁效果在全屏下才能看到)
实验结果:
实验9——总结
收获:最大的收获是综合应用所学知识,完成了试验任务2。虽然编写源程序的时候有些不熟悉用法,调试几次才发现问题,但按照老师提供的技巧,思路清晰地分析并总算是自己完成了,还是很开心的。学到后面不是单个知识点的简单堆砌了,很多知识点需要融会贯通,所以通过动手实验来熟悉基本用法越来越重要了。