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

为何IBM-DOS的PSP未格式化参数区存在异常表现?

IBM-DOS命令行参数内存区域异常与汇编程序问题

MS-DOS与IBM-DOS均在内存地址80h处保留了存储命令行参数的区域:80h地址为参数长度计数器,81h地址开始为ASCII格式的参数内容。但实际测试中,该内存区域的表现经常不符合预期。

Debug下的异常表现

当携带参数LOADME启动debug.com时,执行-D 80 8F查看内存,结果如下:

-D 80 8F
1039:0080  00 0D 4C 4F 41 44 4D 45-0D 00 00 00 00 00 00 00  ..LOADME........

此处异常点在于80h地址:尽管LOADME参数完整存在,但该地址的计数器值为0。

传入更长参数时异常更明显,比如携带参数LOADME NOW时,内存数据如下:

-D 80 8F
1039:0080  04 20 4E 4F 57 0D 4D 45-20 4E 4F 57 0D 00 00 00  . NOW.ME NOW....

此时计数器值为4,虽接近正确值但仍不准确,且参数中的LOAD部分完全丢失。

测试用汇编程序对比

可正常运行的Echo程序

一段来自StackOverflow的汇编程序可正常输出正确输入,仅实现类似echo的功能,代码如下:

MOV AH, 40
MOV BX, 0001
XOR CH, CH
MOV CL, [0080]
MOV DX, 0081
INT 21 ; Write directly to device 1, with memory address 80h as your counter and your string beginning at 81
MOV AX, 4C00
INT 21 ; Exit

自行编写的有问题的程序

自行编写的程序用于读取并复制81h地址处的参数内容,但运行后多输出乱码,输出不稳定,仅闪现预期内容片段后即清除,代码如下:

XOR AX, AX ; Clearing out the registers.
XOR BX, BX
XOR CX, CX
XOR DX, DX
MOV DX, 0300 ; A variable offset that I left unused
MOV AX, [0080] ; The counter
MOV BX, 0080 ; The current read position
ADD BX, 01; Begin loop
MOV CX, [BX]
ADD BX, 0300 ; Jump to our offset
MOV [BX], CX
SUB BX, 0300 ; Remove our offset in memory. 
DEC AX
JNZ 0111
ADD BX, 0301 ; Loop ended here.
MOV CX, 0024 ; Now, at the end of the string, add a $.
MOV [BX], CX
MOV AH, 09
MOV BX, 301
INT 21 ; Execute "display string"
MOV AX, 4C
INT 21 ; End program

疑问

这是IBM-DOS本身的问题,还是debug.com的机制导致,或是我的编程存在错误?


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 08:43:10