汇编语言(第3版,王爽著):实验10-3 编写子程序 数值显示
1. 思路:
- 根据第 10 章的第 9 小结,也就是 10.9 模块化程序设计的方法:将程序分为两部分 数值的转换 和 数值的显示
- 因为 数值的显示 在 实验10-1 已经实现了 show_str,因此我们先将 数值的转换 调试好,再将 show_str 的程序引入进来
- 因为不断的取余,所以取得余数的结果为 6、6、6、2、1,数值是逆着来的,我们可以将它们入栈
- 等到取余过程结束,再将余数出栈,放置到 data 段中
2. 代码实现:
assume cs:code
data segment
db 10 dup (0)
data ends
code segment
start:
mov ax, 12666
mov bx, data
mov ds, bx
mov si, 0
call dtoc
mov dh, 8
mov dl, 3
mov cl, 2
call show_str
mov ax, 4c00h
int 21h
; 数值的转换
dtoc: ; 将 word 型数据转变为十进制的字符串,字符串以 0 位结尾符
push si
push di
push ax
push bx
push cx
push dx ; 子程序中使用的寄存器入栈
remainder:
mov dx, 0
mov di, 10
div di
mov bx, 30H
add bx, dx ; 余数加上 30H
push bx ; 将数值入栈 6 6 6 2 1
inc si
mov cx, ax ; 将商放入 cx 中,用于判断数值是否已经除尽
jcxz dtoc_ok
jmp short remainder
dtoc_ok:
mov cx, si ; 将 6 6 6 2 1 出栈
mov si, 0
s: pop bx
mov ds:[si], bl
inc si
loop s
mov byte ptr ds:[si], 0 ; 虽然 data 段初始化的值都是 0,但是作为一个完整的子函数,还是需要在 12666 后面加 0 的
pop dx
pop cx
pop bx
pop ax
pop di
pop si ; 子程序中使用的寄存器出栈
ret
; 数值的显示
show_str:
push ax
push cx
push dx
push si
push di
push es ; 将子程序中使用的寄存器入栈
mov ax, 0b800h ; 显存的起始地址
mov es, ax
mov di, 0
mov al, 160
mul dh
add di, ax ; 计算显示的位置
mov ax, 2
mul dl
add di, ax ; 计算显示的位置
mov al, cl ; 字符的属性值
change:
mov ch, 0
mov cl, ds:[si]
jcxz show_str_ok ; 条件转移,如果 cx 为 0 则跳转
mov es:[di], cl
mov es:[di + 1], al
inc si
add di, 2
jmp short change
show_str_ok:
pop es
pop di
pop si
pop dx
pop cx
pop ax ; 将子程序中使用的寄存器出栈
ret
code ends
end start
3. 程序运行效果:
分类:
汇编语言
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App