|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 拖着拖把去拖鞋 于 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: mov ax,data
- mov ds,ax
- mov si,0 ; 记录当前字符串的写入位置
- mov bp,32 ; 需要转换的数据的位置
- mov ax,stack
- mov ss,ax
- mov sp,32
- mov cx,6
- l0: push cx
- mov ax,ds:[bp]
- call change_to_dec_init
- add bp,2
- pop cx
- loop l0
- mov si,0 ; 用于定位字符串数据
- mov di,0 ; 用于定位显存位置
- mov dh,23 ; 行号
- mov dl,30 ; 列号
- mov bl,2 ; 颜色
- call show_str_init
- mov cx,6
- l1: push cx
- call show_str_start
- pop cx
- loop l1
- mov ax,4c00h
- int 21h
- ; 名称: change_to_dec
- ; 功能: 将word型数据转变为表示十进制数的字符串,字符串以0结尾
- ; 参数: ax=wrod型数据
- ; ds:si指向字符串首地址
- ; 返回: 无
- change_to_dec_init: mov cx,0
- push cx ; 作为结尾
- change_to_dec_start:mov bx,10
- mov dx,0 ; 避免参与除法计算
- div bx ; 除10得最后一位的值
- mov cx,dx ; 存入求出的十进制数
- jcxz change_to_dec_ok
- add cx,30h ; 算出ASCII码中对应的十进制数
- push cx ; 由于先算出来的是最后一位,先入栈暂存
- jmp short change_to_dec_start
- change_to_dec_ok: pop cx
- mov ds:[si],cl
- inc si
- jcxz change_to_dec_end
- jmp short 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: mov ax,0b800h ; 显示区域的开头
- mov es,ax
- mov ch,0
- mov cl,dh
- ssil0: add di,160 ; 计算跳到指定行的字节数
- loop ssil0
- mov cl,dl
- ssil1: add di,2 ; 计算跳到指定列的字节数
- loop ssil1
- ret
- show_str_start: mov ch,0
- mov cl,ds:[si]
- jcxz show_str_ok
- mov es:[di],cl ; 存放需要显示的字符
- mov es:[di+1],bl ; 存放需要显示的颜色
- inc si
- add di,2
- jmp short show_str_start
- show_str_ok: mov byte ptr es:[di],0 ; 增加一个字符串之间的间隔
- mov byte ptr es:[di+1],0
- add di,2
- inc si ; 跳过字符串结尾的‘0’
- ret
- code ends
- end start
复制代码 |
|