实验10 3.数值显示
本帖最后由 拖着拖把去拖鞋 于 2023-2-20 21:56 编辑按照题目要求, 写了两个子程序解决, 目前想到的最优解, 欢迎各位指导
; 将data段中的数据以十进制的形式显示出来
assume cs:code
data segment
db 32 dup (0)
dw 123,12666,1,8,3,38
data ends
stack segment
dd 32 dup (0)
stack ends
code segment
start: movax,data
movds,ax
movsi,0 ; 记录当前字符串的写入位置
movbp,32 ; 需要转换的数据的位置
movax,stack
movss,ax
movsp,32
movcx,6
l0: push cx
movax,ds:
call change_to_dec_init
addbp,2
popcx
loop l0
movsi,0 ; 用于定位字符串数据
movdi,0 ; 用于定位显存位置
movdh,23 ; 行号
movdl,30 ; 列号
movbl,2 ; 颜色
call show_str_init
movcx,6
l1: push cx
call show_str_start
popcx
loop l1
movax,4c00h
int21h
; 名称: change_to_dec
; 功能: 将word型数据转变为表示十进制数的字符串,字符串以0结尾
; 参数: ax=wrod型数据
; ds:si指向字符串首地址
; 返回: 无
change_to_dec_init: movcx,0
push cx ; 作为结尾
change_to_dec_start:movbx,10
movdx,0 ; 避免参与除法计算
divbx ; 除10得最后一位的值
movcx,dx ; 存入求出的十进制数
jcxz change_to_dec_ok
addcx,30h ; 算出ASCII码中对应的十进制数
push cx ; 由于先算出来的是最后一位,先入栈暂存
jmpshort change_to_dec_start
change_to_dec_ok: popcx
movds:,cl
incsi
jcxz change_to_dec_end
jmpshort change_to_dec_ok
change_to_dec_end:ret
; 名称: show_str
; 功能: 在指定的位置,用指定的颜色,显示一个0结尾的字符串
; 参数: dh=行号(取值范围0~24)
; dl=列号(取值范围0~79)
; cl=颜色
; ds:si指向字符串首地址
; ds:di指向当前显示位置
; 返回: 无
show_str_init: movax,0b800h ; 显示区域的开头
moves,ax
movch,0
movcl,dh
ssil0: adddi,160 ; 计算跳到指定行的字节数
loop ssil0
movcl,dl
ssil1: adddi,2 ; 计算跳到指定列的字节数
loop ssil1
ret
show_str_start: movch,0
movcl,ds:
jcxz show_str_ok
moves:,cl ; 存放需要显示的字符
moves:,bl ; 存放需要显示的颜色
incsi
adddi,2
jmpshort show_str_start
show_str_ok: movbyte ptr es:,0 ; 增加一个字符串之间的间隔
movbyte ptr es:,0
adddi,2
incsi ; 跳过字符串结尾的‘0’
ret
code ends
end start
页:
[1]