使用MASM/TASM在VS Code中打印0-9却输出异常符号的技术求助
问题分析与修复方案
你的代码核心问题是:DOS中断int 21h的ah=2功能仅通过DL寄存器输出字符,但你后续修改DL输出换行、回车时,覆盖了原本存储数字ASCII值的DL,之后add dx,1操作的是已经被改成回车符(ASCII 13)的DX,导致下一次输出的是错误的ASCII值,所以出现奇怪符号。
以下是两种修复方案:
方案一:直接操作DL寄存器(最简洁)
.model small .stack 100h .data .code main proc mov cx, 10 ; 循环10次,打印0-9 mov dl, 48 ; 直接把'0'的ASCII值存在DL(输出字符只用到DL) print_digits: ; 打印当前数字 mov ah, 2 ; DOS功能号:输出单个字符 int 21h ; 调用DOS中断执行输出 ; 输出回车+换行,确保光标回到行首再换行 mov dl, 13 ; ASCII回车符(CR) int 21h mov dl, 10 ; ASCII换行符(LF) int 21h inc dl ; 数字ASCII值自增1,准备下一个数字 loop print_digits ; CX减1,非0则继续循环 ; 退出程序 mov ah, 4Ch ; DOS功能号:终止程序 int 21h ; 调用DOS中断退出 main endp end main
关键修改说明:
- 初始值直接存在DL而非DX,因为
ah=2的输出功能只用到DL寄存器,无需操作DX的高8位(DH)。 - 调整回车、换行的顺序:先回车让光标回到行首,再换行,避免光标位置错乱。
- 用
inc dl替代add dx,1,直接对存储数字ASCII的DL自增,不会被换行/回车的操作干扰。
方案二:临时保存DL值(适合需要保留DX的场景)
如果你的逻辑中需要用到DX寄存器,可以用其他寄存器临时保存数字的ASCII值:
.model small .stack 100h .data .code main proc mov cx, 10 mov dl, 48 print_digits: mov ah, 2 int 21h ; 打印当前数字 mov bl, dl ; 把当前数字的ASCII值临时存在BL寄存器 ; 输出换行回车 mov dl, 13 int 21h mov dl, 10 int 21h mov dl, bl ; 恢复DL的数字ASCII值 inc dl ; 自增准备下一个数字 loop print_digits mov ah, 4Ch int 21h main endp end main
内容的提问来源于stack exchange,提问作者M.Hassaan
相关产品推荐
相关产品推荐

