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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:26:35