使用emu8086编写汇编代码实现多行缩进文本输出的问题
解决emu8086中多行缩进文本输出的问题
嘿,我来帮你搞定emu8086里的多行缩进输出问题!你已经成功输出了第一行,接下来要实现每行递增缩进的效果其实很简单,我给你两种方案,按需选择:
方案1:直接定义每行字符串(简单直观)
这种方法适合行数少的场景,直接为每行定义包含前置空格、内容、回车换行的字符串,然后逐个调用DOS中断输出即可。
; 定义每行的字符串:回车换行 + 前置空格 + 内容 + 结束符$ LINE1 DB 10,13,"Za7",10,13,"$" LINE2 DB 10,13," Yb9",10,13,"$" LINE3 DB 10,13," Xc11",10,13,"$" LINE4 DB 10,13," Wd13","$" ; 最后一行可根据需求决定是否保留额外换行 ; 主程序:依次输出每行 MOV AH, 09h ; DOS功能号09h:输出以$结尾的字符串 LEA DX, LINE1 ; 加载第一行的地址到DX INT 21h ; 调用DOS中断执行输出 LEA DX, LINE2 INT 21h LEA DX, LINE3 INT 21h LEA DX, LINE4 INT 21h ; 程序退出(可选,避免程序执行完后乱跑) MOV AH, 4Ch INT 21h
原理说明
- 10是换行符(LF),13是回车符(CR),组合起来让光标移到下一行开头
- 每行开头的空格数依次增加2个,对应你要的缩进效果
- 字符串必须以
$结尾,因为DOS中断09h会一直输出到$为止
方案2:用循环实现(灵活高效)
如果需要输出更多行,重复定义字符串太繁琐,用循环可以自动控制缩进、字符和数字的变化,扩展性更强。
MOV CX, 4 ; 总共有4行需要输出 MOV BX, 0 ; 初始缩进空格数:0 MOV DL, 'Z' ; 大写字母起始为Z(ASCII码5Ah) MOV DH, 'a' ; 小写字母起始为a(ASCII码61h) MOV AX, 7 ; 数字起始为7 PRINT_LOOP: ; 第一步:输出回车换行,切换到下一行 MOV AH, 02h ; DOS功能号02h:输出单个字符 MOV DL, 13 INT 21h ; 输出回车符 MOV DL, 10 INT 21h ; 输出换行符 ; 第二步:输出当前行的缩进空格 MOV SI, BX ; 用SI存当前需要输出的空格数 SPACE_LOOP: CMP SI, 0 JE END_SPACE ; 空格数为0时跳出循环 MOV AH, 02h MOV DL, ' ' INT 21h ; 输出一个空格 DEC SI JMP SPACE_LOOP END_SPACE: ; 第三步:输出大写字母,然后更新下一行的大写字母 MOV AH, 02h INT 21h ; DL中当前是大写字母,直接输出 DEC DL ; 下一行的大写字母减1(Z→Y→X→W) ; 第四步:输出小写字母,然后更新下一行的小写字母 MOV DL, DH INT 21h ; 输出当前小写字母 INC DH ; 下一行的小写字母加1(a→b→c→d) ; 第五步:输出数字(处理两位数的情况,比如11、13) MOV SI, AX ; 保存当前数字到SI MOV AH, 0 MOV BL, 10 DIV BL ; AX除以10,商在AL(十位),余数在AH(个位) ; 输出十位 MOV DL, AL ADD DL, '0' ; 把数字转成ASCII字符 INT 21h ; 输出个位 MOV DL, AH ADD DL, '0' INT 21h ADD AX, 2 ; 下一行的数字加2(7→9→11→13) ; 第六步:更新缩进空格数,准备下一行 ADD BX, 2 ; 下一行多2个空格 ; 第七步:循环计数减1,判断是否继续输出 DEC CX JNZ PRINT_LOOP ; CX不为0时继续循环 ; 程序退出 MOV AH, 4Ch INT 21h
原理说明
- 用
CX控制循环次数(总行数),BX记录当前行的缩进空格数 - 大写字母每次减1,小写字母每次加1,数字每次加2,对应你要的字符变化规律
- 数字部分用除法拆分十位和个位,转成ASCII字符后输出,解决两位数的显示问题
两种方案都能实现你要的输出效果,选哪种取决于你的实际需求~
内容的提问来源于stack exchange,提问作者ek.Nik
相关产品推荐
相关产品推荐

