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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 17:53:12