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
相关产品推荐
相关产品推荐

