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

MASM汇编程序循环异常求助:输入任意数字均随机循环后终止

问题分析与修复方案

嘿,我看你这问题大概率出在输入处理不完整和循环终止条件没设对上,咱们一步步捋清楚:

1. 输入逻辑的致命漏洞

你现在只调用了int 21h的ah=01h功能读了一个字符,但用户要输入的是0-99的数字啊——可能是一位也可能是两位!比如输入12,你只拿了第一位'1'转成数字1,剩下的'2'留在输入缓冲区里,搞不好就干扰后续程序运行了。而且你也没处理两位数的组合逻辑,这直接导致循环的目标值从根上就错了。

给你补个正确的输入处理代码:

mov ah, 01h
int 21h         ; 读取第一个字符(十位或个位)
sub al, 30h     ; ASCII转数字
mov bl, al
mov cl, 10
mul cl          ; 十位数字×10,结果存在AX里
mov cx, ax      ; CX先存十位部分的数值

mov ah, 01h
int 21h         ; 读第二个字符
cmp al, 0Dh     ; 判断是不是回车(说明是一位数)
jz InputDone    ; 是回车就直接跳走,不用处理个位
sub al, 30h     ; 不是回车就转成个位数字
add cx, ax      ; 个位加十位,得到完整的目标数
InputDone:

2. 循环逻辑的常见坑

你的代码片段只写到mov b...,我猜你可能把输入的数字存到了某个寄存器,但循环的时候要么没正确初始化计数器,要么终止条件写错了。比如:

  • 要是用CX当循环计数器,你得确保它存的是用户输入的正确目标值;
  • 循环里的计数变量要正确递增,比如用inc bx这种,别搞混寄存器;
  • 还有输出计数的时候,直接输出数字值会显示乱码,必须转成ASCII再调用DOS中断输出,不然程序也会乱套。

给你个靠谱的循环示例:

mov bx, 0       ; BX从0开始计数
LoopStart:
    ; 调用打印数字的子程序,把BX里的数转成ASCII输出
    mov ax, bx
    call PrintNumber
    
    inc bx
    cmp bx, cx      ; CX是咱们刚才输入的目标数
    jbe LoopStart   ; 小于等于目标数就继续循环

3. 容易忽略的小细节

  • 你设置了assume cs:cseg, ds:cseg,把数据段和代码段合并了,要是你的Intro字符串放在代码段里,得确保它是以$结尾的——int 21h的09h功能要求字符串必须用$终止,不然会输出一堆随机内存内容,直接导致程序异常终止;
  • 别忘了COM程序的org 100h是对的,但数据要放在代码后面,别被指令覆盖了。

最后总结下修复步骤

  1. 补全两位数的输入处理,把用户输入的数字正确转换成十进制数值;
  2. 确保循环的计数器和终止条件匹配,从0递增到目标值;
  3. 写个数字转ASCII的子程序,别直接输出原始数字;
  4. 检查所有字符串的终止符$有没有加。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:08:00