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

如何通过int 21h/ah=1读取两位数字(0~99)并实现相乘输出?

解决两位数字读取与相乘的问题

嘿,我完全懂你的感受——单个数字的读取和运算确实简单直接,但扩展到两位数字时,需要处理字符到数值的转换和位权重计算这两个关键点,咱们一步步来拆解:

第一步:读取两位数字的核心逻辑

用int 21h/ah=1读取到的是ASCII字符(比如输入'1'得到的是0x31,也就是十进制49),所以首先要把每个字符转成对应的数值,再根据位的位置计算权重:

  • 十位数字:读取后转成数值,乘以10(因为它代表几个十)
  • 个位数字:读取后转成数值,直接加到十位的结果上

下面是具体的汇编代码示例:

; 读取十位数字并处理权重
mov ah, 1
int 21h         ; 读取十位的ASCII字符,结果存在al中
sub al, '0'     ; 转成十进制数值(ASCII码减去48)
mov bl, al      ; 暂存十位数值
mov al, 10
mul bl          ; 十位数值 * 10,结果存在ax中
mov cx, ax      ; 把十位的权重结果存在cx

; 读取个位数字并累加
mov ah, 1
int 21h         ; 读取个位的ASCII字符
sub al, '0'     ; 转成十进制数值
add cx, ax      ; cx中现在就是完整的两位数字(0~99)

第二步:两位数字相乘与结果输出

两位数字相乘的结果范围是0~9801(99*99),最多4位,所以需要把最终的数值拆分成每一位,再转成ASCII字符输出:

  1. 用除法不断把数值除以10,取余数得到每一位的数值(从低位到高位)
  2. 把余数压入栈中(栈是后进先出结构,刚好可以实现从高位到低位的逆序输出)
  3. 依次出栈,转成ASCII后用int 21h/ah=2输出

示例代码(假设两个两位数分别存在cx和dx中):

; 执行相乘操作(这里用16位寄存器示例,结果存在dx:ax中)
mov ax, cx      ; 把第一个两位数放到ax
mul dx          ; ax = ax * dx,结果的高16位在dx,低16位在al

; 拆分结果的每一位
mov bx, 10
mov cx, 0       ; 计数器,记录位数

split_digits:
xor dx, dx      ; 清零dx,因为div指令是ax除以bx,余数存在dx
div bx
push dx         ; 把当前位的数值(余数)压栈
inc cx          ; 位数加1
cmp ax, 0       ; 如果商为0,说明所有位都拆分完了
jne split_digits

; 依次出栈输出每一位
output_result:
pop dx
add dl, '0'     ; 转成ASCII字符
mov ah, 2
int 21h         ; 输出字符
loop output_result

额外注意点

  • 如果输入是05这类以0开头的两位数,代码会自动处理成5,不影响后续运算
  • 要确保寄存器的使用不冲突,比如上面示例中用cx存第一个数、dx存第二个数,你可以根据自己的代码上下文调整寄存器

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:46:45