如何使用TASM实现数据传送与算术指令并修复差值计算错误
TASM程序差值输出错误修复方案
我们正在学习汇编编程,目标是用TASM实现基本数据传送与算术指令,程序需满足以下要求:
- 输入为单位数整数
- 两数之和小于10
- 两数之差大于0且小于10
- 输入后或显示结果前需等待指令
编写的代码运行后差值输出错误,以下是原代码:
.model small .stack 100h .data msg1 db 'Enter first integer: $' msg2 db 'Enter second integer: $' msg3 db 'Sum: $' msg4 db 'Difference: $' newline db 0dh, 0ah, '$' max_sum equ 10 max_diff equ 10 .code main proc mov ax, @data mov ds, ax ; ask for first input mov ah, 9 lea dx, msg1 int 21h ; read first input mov ah, 1 int 21h sub al, 30h mov bl, al ; save first input in BL ; ask for second input mov ah, 9 lea dx, msg2 int 21h ; read second input mov ah, 1 int 21h sub al, 30h mov cl, al ; save second input in CL ; calculate sum add bl, cl cmp bl, max_sum jae error ; if sum>10 ; calculate difference mov al, bl sub al, cl cmp al, max_diff jae error ; if diff > || < 10 ; display sum mov ah, 9 lea dx, msg3 int 21h mov dl, bl add dl, 30h mov ah, 2 int 21h ; display difference mov ah, 9 lea dx, newline int 21h mov ah, 9 lea dx, msg4 int 21h mov dl, al add dl, 30h mov ah, 2 int 21h ; ask for <ENTER> command mov ah, 9 lea dx, newline int 21h mov ah, 4ch int 21h error: ; display error message mov ah, 9 lea dx, newline int 21h mov ah, 9 lea dx, msg1 int 21h jmp main ; repeat input process main endp end main
问题分析
- 差值计算逻辑错误:计算差值时,
mov al, bl中的bl已经被修改为两数之和(之前执行了add bl, cl),导致用总和减去第二个数得到的是第一个数,而非两数的差值。需要提前保存原始的第一个数到未被覆盖的寄存器。 - 差值范围判断不完整:原代码仅判断差值是否大于等于10,未处理差值小于0的情况,不符合“差值大于0”的要求。
- 错误提示缺失:错误分支中重复显示输入提示,没有明确的错误信息,用户无法得知输入无效的原因。
- 等待指令未实现:未添加等待用户按回车的逻辑,不符合题目要求。
修复后的代码
.model small .stack 100h .data msg1 db 'Enter first integer: $' msg2 db 'Enter second integer: $' msg3 db 'Sum: $' msg4 db 'Difference: $' err_msg db 'Invalid input! Sum must <10, Difference must be 0<diff<10.$' newline db 0dh, 0ah, '$' max_sum equ 10 min_diff equ 1 max_diff equ 10 .code main proc mov ax, @data mov ds, ax input_loop: ; 提示输入第一个数 mov ah, 9 lea dx, msg1 int 21h ; 读取第一个数 mov ah, 1 int 21h sub al, 30h mov bl, al ; 保存第一个数到BL mov bh, al ; 额外保存一份到BH,避免被sum覆盖 ; 等待用户按回车(输入后等待指令) mov ah, 9 lea dx, newline int 21h ; 提示输入第二个数 mov ah, 9 lea dx, msg2 int 21h ; 读取第二个数 mov ah, 1 int 21h sub al, 30h mov cl, al ; 保存第二个数到CL ; 等待用户按回车 mov ah, 9 lea dx, newline int 21h ; 计算总和 mov al, bl add al, cl cmp al, max_sum jae show_error ; 总和>=10则报错 ; 计算差值(第一个数 - 第二个数) mov dl, bh sub dl, cl ; 判断差值范围:大于0且小于10 cmp dl, min_diff jb show_error ; 差值<1则报错 cmp dl, max_diff jae show_error ; 差值>=10则报错 ; 显示总和 mov ah, 9 lea dx, msg3 int 21h mov dl, al add dl, 30h mov ah, 2 int 21h ; 显示差值 mov ah, 9 lea dx, newline int 21h mov ah, 9 lea dx, msg4 int 21h mov dl, bh sub dl, cl add dl, 30h mov ah, 2 int 21h ; 等待用户按回车后退出 mov ah, 9 lea dx, newline int 21h mov ah, 1 int 21h mov ah, 4ch int 21h show_error: ; 显示错误信息 mov ah, 9 lea dx, newline int 21h lea dx, err_msg int 21h mov ah, 9 lea dx, newline int 21h jmp input_loop ; 重新输入 main endp end main
修复说明
- 保存原始输入值:将第一个数额外保存到
bh寄存器,避免计算总和时被覆盖,确保差值计算使用原始的第一个数。 - 完善差值判断:新增
min_diff常量,先判断差值是否小于1,再判断是否大于等于10,确保差值在(0,10)范围内。 - 添加错误提示:新增
err_msg字符串,明确告知用户输入无效的原因。 - 实现等待指令:在输入每个数后、显示结果后添加等待用户按回车的逻辑,满足题目要求。
内容的提问来源于stack exchange,提问作者Imaginewagons
相关产品推荐
相关产品推荐

