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

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

修正说明

  1. 调整星号输出时机:把星号输出放在Number循环结束后,确保先输出完整的123再打一个*。
  2. 移除多余指令:删掉Letter循环后的int 21h,避免输出额外的'D'。
  3. 简化冗余代码:去掉不必要的Aste循环和多余的push/pop操作,减少栈操作复杂度,避免逻辑混乱。

运行修正后的代码,就能得到期望的输出:A123*B123*C123*

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 14:39:52