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
相关产品推荐
相关产品推荐

