DOSBox下汇编loop循环输出格式异常,请求技术帮助
问题分析与修复方案
你的核心问题是循环逻辑顺序错误:当前代码在输出每个数字后立刻打印星号,而非先输出完整的三个数字再打印一个星号;另外代码末尾多了一次不必要的int 21h,导致额外输出了'D'。
错误点拆解
- 原代码中
Number循环内,每输出一个数字就执行Aste循环打星号,所以出现1*2*3*的错误格式。 Letter循环结束后,dl的值已经是'C'+1='D',此时多余的int 21h会把这个'D'输出。Aste循环完全没必要用loop指令,因为cx=1,直接调用一次int 21h即可。
修正后的代码
.model small .stack .data .code main proc mov cx,3 ; 控制字母循环次数(A、B、C) mov ah, 2 mov dl, 'A' Letter: int 21h ; 输出当前字母 push cx ; 保存外层字母循环的cx值 push dx ; 保存当前字母的dl值 mov cx, 3 ; 控制数字循环次数(1、2、3) mov dl, '1' Number: int 21h ; 输出当前数字 add dl, 1 ; 数字自增 Loop Number ; 完成三个数字的输出 ; 数字输出完后,打印一个星号 mov dl, '*' int 21h pop dx ; 恢复字母的dl值 pop cx ; 恢复外层循环的cx值 add dl, 1 ; 字母自增 Loop Letter ; 进入下一个字母循环 mov ah,4ch ; 程序退出 int 21h main endp end main
修正说明
- 调整星号输出时机:把星号输出放在
Number循环结束后,确保先输出完整的123再打一个*。 - 移除多余指令:删掉
Letter循环后的int 21h,避免输出额外的'D'。 - 简化冗余代码:去掉不必要的
Aste循环和多余的push/pop操作,减少栈操作复杂度,避免逻辑混乱。
运行修正后的代码,就能得到期望的输出:A123*B123*C123*
内容的提问来源于stack exchange,提问作者Toasted Nutella
相关产品推荐
相关产品推荐

