You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

问题分析

  1. 差值计算逻辑错误:计算差值时,mov al, bl中的bl已经被修改为两数之和(之前执行了add bl, cl),导致用总和减去第二个数得到的是第一个数,而非两数的差值。需要提前保存原始的第一个数到未被覆盖的寄存器。
  2. 差值范围判断不完整:原代码仅判断差值是否大于等于10,未处理差值小于0的情况,不符合“差值大于0”的要求。
  3. 错误提示缺失:错误分支中重复显示输入提示,没有明确的错误信息,用户无法得知输入无效的原因。
  4. 等待指令未实现:未添加等待用户按回车的逻辑,不符合题目要求。

修复后的代码

.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

修复说明

  1. 保存原始输入值:将第一个数额外保存到bh寄存器,避免计算总和时被覆盖,确保差值计算使用原始的第一个数。
  2. 完善差值判断:新增min_diff常量,先判断差值是否小于1,再判断是否大于等于10,确保差值在(0,10)范围内。
  3. 添加错误提示:新增err_msg字符串,明确告知用户输入无效的原因。
  4. 实现等待指令:在输入每个数后、显示结果后添加等待用户按回车的逻辑,满足题目要求。

内容的提问来源于stack exchange,提问作者Imaginewagons

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 09:55:21