DOS x86汇编:按用户输入次数打印符号的代码报错求助
问题分析与修正
你的代码出现打印*数量远超预期的核心原因是16位寄存器CX的赋值错误,同时还缺少打印输入数字的逻辑,以下是具体问题和修正方案:
主要错误点
CX寄存器未正确初始化
mov cx,al仅将8位寄存器AL的值赋值给16位CX的低8位(CL),但高8位(CH)会保留内存中的随机垃圾值,导致CX实际值为CH*256 + CL,循环次数自然远大于输入的数字。未打印输入的数字
预期输出需要先显示用户输入的数字(比如输入4就先输出4),但原代码接收输入后直接将ASCII码转成数值,没有输出该字符。硬编码循环跳转地址易出错
原代码用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
相关产品推荐
相关产品推荐

