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
关键修改说明
- 修正寄存器使用错误:将错误的
mov dh,10替换为对dl寄存器的赋值,确保int 21h的ah=2功能能正确输出回车和换行符。 - 补充完整换行逻辑:DOS系统中,仅输出换行符会导致光标停留在下一行的原列位置,必须先输出回车符让光标回到行首,再输出换行符完成标准换行。
- 保护寄存器值:通过
push dx和pop dx保存并恢复当前字母的ASCII值,避免输出回车换行时覆盖dl寄存器,保证inc dl能正确切换到下一个字母。
内容的提问来源于stack exchange,提问作者Moeez Ahmad
相关产品推荐
相关产品推荐

