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

DOS x86汇编:按用户输入次数打印符号的代码报错求助

问题分析与修正

你的代码出现打印*数量远超预期的核心原因是16位寄存器CX的赋值错误,同时还缺少打印输入数字的逻辑,以下是具体问题和修正方案:

主要错误点

  1. CX寄存器未正确初始化
    mov cx,al仅将8位寄存器AL的值赋值给16位CX的低8位(CL),但高8位(CH)会保留内存中的随机垃圾值,导致CX实际值为CH*256 + CL,循环次数自然远大于输入的数字。

  2. 未打印输入的数字
    预期输出需要先显示用户输入的数字(比如输入4就先输出4),但原代码接收输入后直接将ASCII码转成数值,没有输出该字符。

  3. 硬编码循环跳转地址易出错
    原代码用loop 116硬编码跳转地址,一旦指令调整就会出错,不如用符号标签更清晰。

修正后的代码

; 修正后:接收0-9数字,先打印数字,再打印对应次数的*
a 100
; 打印提示"? "
mov ah,02
mov dl,3f
int 21
mov dl,20
int 21
; 获取用户输入,输入的ASCII码在AL中
mov ah,01
int 21
; 保存输入的ASCII码到BL,用于后续打印
mov bl,al
; 设置打印功能
mov ah,02
; 先打印输入的数字
mov dl,bl
int 21
; 将ASCII码转成数值
sub bl,30
; 设置循环计数器CX:CL为数值,CH清零
mov cl,bl
xor ch,ch
; 输入为0时直接跳过循环
jcxz exit_loop
; 循环打印*
print_star:
mov dl,2a
int 21
loop print_star
exit_loop:
; 程序退出
int 20

rcx
1c
n as2.com
w
q

修正说明

  • 用mov bl,al保存输入的ASCII字符,之后先打印该字符,匹配预期输出格式。
  • 用mov cl,bl + xor ch,ch初始化CX,确保CH为0,CX的值完全等于输入的数字(0-9),彻底解决循环次数异常的问题。
  • 添加jcxz exit_loop处理输入0的场景,避免无意义的循环执行。
  • 使用print_star符号标签替代硬编码地址,代码结构更清晰,维护性更强。

测试输入4时,输出为4****,完全符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 13:25:10