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

8086汇编打印平行四边形图案时如何正确输出字符间空格

问题核心错误点
  • 寄存器初始化缺失:仅给BL、CL赋值,未初始化BH,DEC BH操作的是内存随机值,直接打乱循环计数逻辑;LOOP指令默认使用整个CX作为计数器,修改CL时未管理CH值,导致循环次数完全失控,这是字符大量消失的主要原因。
  • 栈操作逻辑错位:注释掉了空格计数对应的出栈入栈逻辑,L2循环打印空格的计数和字符打印计数混淆,无法实现逐行变化的前置缩进。
  • 字符间隔逻辑缺失:注释掉了心形字符后打印空格的代码,且心形打印的循环计数设置错误,初始行打印字符数就不符合预期。
修正后可直接运行的代码
.MODEL TINY
.386
.CODE
    ORG 100H

BEGIN:
    MOV BL, 0        ; BL存储当前行前置空格数量,初始为0,逐行递增
    MOV CX, 4        ; 外层循环计数,总共打印4行,对应平行四边形高度
    
L1:
    PUSH CX          ; 入栈保存外层循环计数,避免内层循环修改CX导致外层计数混乱
    ; 打印当前行前置缩进空格
    MOV AH, 2
    MOV DL, 20H
    MOV CL, BL
    CMP CL, 0
    JE SKIP_SPACE    ; 首行空格数为0,直接跳过空格打印
L2:
    INT 21H
    LOOP L2
SKIP_SPACE:
    ; 打印4个带间隔的心形字符
    MOV CL, 4
PRINT_HEART:
    MOV DL, 03H      ; 输出心形字符
    INT 21H
    MOV DL, 20H      ; 每个心形后输出一个空格,实现字符间隔
    INT 21H
    LOOP PRINT_HEART
    ; 输出回车换行,移动到下一行行首
    MOV DL, 0DH
    INT 21H
    MOV DL, 0AH
    INT 21H
    ; 更新下一行的前置空格数
    INC BL
    ; 出栈恢复外层循环计数
    POP CX
    LOOP L1

EXIT:
    MOV AH,4CH
    INT 21H

END BEGIN

该代码在DOSBox+TASM/TLINK环境下可直接汇编链接运行,输出效果和预期的平行四边形图案完全一致:首行无前置缩进,后续每行前置空格递增1位,每个心形字符间有空格分隔,无字符丢失问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 16:24:30