我正在尝试在 MS-DOS 6 下使用指定的参数执行 .com 文件。
我发现 DOS 2+ - EXEC - LOAD AND/OR EXECUTE PROGRAM Int 21/AH=4Bh 问题是,我不知道我到底应该如何传递这些参数。ES:BX 应该包含一个叫做“参数块”的东西,但是如何构造它呢?例如,如果我想使用参数执行名为 command.com 的文件/C ECHO HELLO WORLD,我将如何调用此中断?
我已经拥有的代码:
ORG 100H
START:
MOV AH, 4BH ;AH=>4BH
XOR AL, AL ;AL=>00H
MOV DX, CMD ;DS:DX=>STRING
MOV BX, PARAM;ES:BX=>PARAMS
INT 21H
MOV AH,4CH
INT 21H
CMD: DB "COMMAND.COM$" ;NOT SURE, SHOULD END WITH $
PARAM: ;???
Run Code Online (Sandbox Code Playgroud)
我如何让我的程序执行前面提到的任务?由于 MS-DOS 快要死了,而且我的汇编程序 NASM 在这个平台上几乎不受支持,所以我将度过一段糟糕的时光。我的代码可能写得不好,因为没有关于 DOS 的资源。
它的重点是执行程序在运行时生成的批处理文件。
CMD: DB "COMMAND.COM$" ;NOT SURE, SHOULD END WITH $
唯一需要以字符串结尾$的函数是函数 9(打印字符串)。大多数其他函数需要以字符串结尾NUL(这是值为 0 的字节 - 而不是 ASCII 数字'0')。
像这样:
CMD DB "COMMAND.COM"
DB 0
Run Code Online (Sandbox Code Playgroud)
您遇到的下一个问题是 COM 文件在启动时几乎获得了所有可用内存。
函数04Bh将失败,因为没有足够的内存(因为所有内存都被 .COM 文件“使用”了)。
04Ah在调用函数之前,您必须使用函数来调整 .COM 文件使用的内存块的大小4Bh:
push cs ; Only needed if ES != CS
pop es ; ...
mov bx, 1000h
mov ah, 4Ah
int 21h
Run Code Online (Sandbox Code Playgroud)
PARAM: ;???
根据 Ralph Brown 的中断列表,这是 14 个字节长:
AFAIK 命令行的第一个字节是后面的字节数,后面是实际字母,后面是 byte 0Dh。(检查内容cs:80h以检查此信息。)
FCB 是 DOS 1.x 程序所需的前两个命令行参数的特殊表示。因为从 DOS 2.x 开始不再需要它们,所以您可以简单地在此处传递两个虚拟 FCB。FCB 的长度为 16 字节。您可以简单地将 FCB 从您的程序(cs:05Ch和cs:06Ch)“复制”到控制块:
PARAM:
DW 0
DW CMDLINE
DW ??? ; Write CS here
DW 05Ch
DW ??? ; Write CS here
DW 06Ch
DW ??? ; Write CS here
CMDLINE:
DB xxx ; Replace by the length of the command line
DB "xxx" ; Replace by the actul command line
DB 0Dh ; Note: Not 0 but 0Dh in this case
Run Code Online (Sandbox Code Playgroud)