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

TASM汇编两位数除法代码修复 支持商/余数两位数输出

TASM环境两位数除法程序修复方案(支持两位数商/余数输出)

问题根因

原有程序输入转数值、除法运算的基础逻辑成立,输出异常的核心原因是商和余数的输出逻辑缺失通用两位拆分步骤:直接将0-99范围的二进制数值加'0'(即30h)转ASCII,仅当数值为0-9时能得到正确数字字符,数值≥10时会映射到非数字ASCII字符,导致输出乱码或错误结果。

核心实现逻辑

  • 输入处理:保留原有逻辑,逐位读取两位输入字符,每一位减去30h转成真实数值,十位值乘10加个位值,分别得到0-99范围的被除数、除数整数,存入字节变量。
  • 除法运算:使用x86 8位除法指令div,执行前将AH寄存器清0、被除数存入AL,除数存入8位通用寄存器;指令执行后,商自动存入AL,余数自动存入AH,二者取值范围均为0-99,符合两位数输出要求。
  • 通用两位输出:对商、余数分别做相同拆分处理:将数值除以10,得到的商为十位数字、余数为个位数字,二者分别加30h转成ASCII字符后依次输出,十位为0时也正常输出,自动补前导零。

修复后可直接运行的完整代码

; 两位数除以两位数汇编程序,支持两位数商/余数输出,适配TASM/TLINK/DOSBox
STACK SEGMENT STACK
    DW 128 DUP(?)
STACK ENDS

DATA SEGMENT
    tip_dividend DB 'Input dividend(2 digits): $'
    tip_divisor  DB 0Dh,0Ah,'Input divisor(2 digits): $'
    tip_quotient DB 0Dh,0Ah,'Quotient: $'
    tip_remain   DB '  Remainder: $'
    dividend     DB ?  ; 存储被除数数值
    divisor      DB ?  ; 存储除数数值
DATA ENDS

CODE SEGMENT
    ASSUME CS:CODE,DS:DATA,SS:STACK
START:
    MOV AX,DATA
    MOV DS,AX

    ; 读取两位被除数
    LEA DX,tip_dividend
    MOV AH,09h
    INT 21h
    MOV AH,01h
    INT 21h
    SUB AL,30h
    MOV BL,10
    MUL BL
    MOV dividend,AL
    MOV AH,01h
    INT 21h
    SUB AL,30h
    ADD dividend,AL

    ; 读取两位除数
    LEA DX,tip_divisor
    MOV AH,09h
    INT 21h
    MOV AH,01h
    INT 21h
    SUB AL,30h
    MOV BL,10
    MUL BL
    MOV divisor,AL
    MOV AH,01h
    INT 21h
    SUB AL,30h
    ADD divisor,AL

    ; 执行除法运算
    MOV AX,0
    MOV AL,dividend
    MOV BL,divisor
    DIV BL  ; AL=商, AH=余数
    MOV CL,AL ; 暂存商
    MOV CH,AH ; 暂存余数

    ; 输出商
    LEA DX,tip_quotient
    MOV AH,09h
    INT 21h
    MOV AL,CL
    MOV AH,0
    MOV BL,10
    DIV BL  ; AL=十位, AH=个位
    MOV DL,AL
    ADD DL,30h
    MOV AH,02h
    INT 21h
    MOV DL,AH
    ADD DL,30h
    INT 21h

    ; 输出余数
    LEA DX,tip_remain
    MOV AH,09h
    INT 21h
    MOV AL,CH
    MOV AH,0
    MOV BL,10
    DIV BL
    MOV DL,AL
    ADD DL,30h
    MOV AH,02h
    INT 21h
    MOV DL,AH
    ADD DL,30h
    INT 21h

    ; 退出程序返回DOS
    MOV AH,4Ch
    INT 21h
CODE ENDS
END START

编译运行方法

在DOSBox环境中进入代码所在目录,依次执行以下命令:

  • 汇编:将代码保存为DIV.ASM后执行 TASM DIV.ASM;
  • 链接:执行 TLINK DIV.OBJ;
  • 运行:执行生成的可执行文件 DIV.EXE

样例验证

程序输出严格遵循两位补零格式,测试用例运行结果如下:

  • 输入被除数21、除数02:输出Quotient: 10 Remainder: 01
  • 输入被除数21、除数11:输出Quotient: 01 Remainder: 10
  • 输入被除数99、除数01:输出Quotient: 99 Remainder: 00
  • 输入被除数22、除数02:输出Quotient: 11 Remainder: 00

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 01:33:33