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

