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

NASM编写16位DOS程序调用int21h AH=09h输出异常求助

问题分析与解决

你遇到的输出源文件内容的问题,核心原因是DS寄存器未正确指向程序的数据段,导致DOS的字符串输出功能(int 0x21的0x09调用)读取了错误内存区域的内容——恰好是你的ASM源文件加载后的残留数据。

关键修复步骤

  • 初始化DS寄存器:DOS加载COM程序时,CS指向程序段,但DS默认可能指向程序段前缀(PSP)或其他错误区域。必须手动让DS和CS同步(COM程序中代码段与数据段同属一个段):

    org 0x100  ; COM程序标准起始偏移
    start:
        mov ax, cs
        mov ds, ax  ; 让DS指向代码段,确保能正确访问数据
    

    如果是EXE程序,则需用:

    mov ax, @data
    mov ds, ax
    
  • 确保字符串格式正确:DOS 0x09功能要求字符串以$结尾,同时你的需求是CRLF+分隔符,定义要准确:

    field_separator db 0x0D, 0x0A, "-+-+-", "$"
    
  • 检查输出指令的寄存器正确性:0x09调用依赖DS:DX指向字符串首地址,输出代码要保证寄存器未被错误修改:

    mov dx, field_separator
    mov ah, 0x09
    int 0x21
    
  • 排查DS被意外修改的情况:检查输出代码之前的所有指令,看是否有子程序、中断调用或错误指令改写了DS寄存器——这是实模式程序中常见的寄存器污染问题。

调试建议

在输出指令前插入int 0x3触发DOS调试断点,用调试器查看DS和DX的值,直接检查DS:DX指向的内存内容,就能快速确认是否是段寄存器指向错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 01:22:08