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

EMU8086汇编代码打印小写字母重复显示,无法正常换行求助

问题分析与修复

你的代码出现重复打印字母且无法换行的原因有两个核心错误:

  • DOS中断int 21h的ah=2功能通过dl寄存器传递待输出字符,你错误地将换行符赋值给dh,导致第二次调用该中断时,dl仍保留当前小写字母,因此重复打印了同一个字母。
  • DOS环境下的标准换行需要同时输出回车符(ASCII 13,0Dh)和换行符(ASCII 10,0Ah),仅输出换行符无法让光标正确定位到新行的起始位置。

修正后的代码

.model Small
.stack 100h
.data
.code
main proc
    mov cx,26       ; 设置循环次数为26(对应26个小写字母)
    mov dl,'a'      ; 初始化DL为第一个小写字母'a'

loop1:
    mov ah,2        ; DOS功能号:输出DL中的字符
    int 21h         ; 打印当前小写字母

    ; 保存当前DL的值,避免输出回车换行时被覆盖
    push dx
    mov dl,13       ; 加载回车符(ASCII 13)
    int 21h         ; 输出回车,光标回到行首
    mov dl,10       ; 加载换行符(ASCII 10)
    int 21h         ; 输出换行,光标下移一行
    pop dx          ; 恢复DL为当前字母的ASCII值

    inc dl          ; 将DL自增,切换到下一个小写字母
    loop loop1

    mov ah,4ch
    int 21h         ; 程序退出
end main
main endp

关键修改说明

  1. 修正寄存器使用错误:将错误的mov dh,10替换为对dl寄存器的赋值,确保int 21h的ah=2功能能正确输出回车和换行符。
  2. 补充完整换行逻辑:DOS系统中,仅输出换行符会导致光标停留在下一行的原列位置,必须先输出回车符让光标回到行首,再输出换行符完成标准换行。
  3. 保护寄存器值:通过push dx和pop dx保存并恢复当前字母的ASCII值,避免输出回车换行时覆盖dl寄存器,保证inc dl能正确切换到下一个字母。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 06:54:53