如何通过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字符输出:
- 用除法不断把数值除以10,取余数得到每一位的数值(从低位到高位)
- 把余数压入栈中(栈是后进先出结构,刚好可以实现从高位到低位的逆序输出)
- 依次出栈,转成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
相关产品推荐
相关产品推荐

