我正在尝试使用MS-DOS 6下的指定参数执行.com文件。
我发现了DOS 2+ - EXEC - LOAD AND / ORECUTE PROGRAM Int 21 / AH = 4Bh
问题是,我不知道应该如何通过这些参数。
ES:BX应该包含一些名为'参数块'但是如何构建它?如果我想要使用参数/C ECHO HELLO WORLD
执行名为command.com的文件,我该如何调用此中断?
我已有的代码:
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: ;???
如何使我的程序执行前面提到的任务?由于MS-DOS几乎已经死了,我的汇编程序NASM在这个平台上几乎不受支持,我将度过难关。我的代码写得不好,因为没有关于DOS的资源。
它的全部意义在于执行程序在运行时生成的批处理文件。
答案 0 :(得分:4)
CMD: DB "COMMAND.COM$" ;NOT SURE, SHOULD END WITH $
要求字符串以$
结尾的唯一函数是函数9(打印字符串)。大多数其他函数要求字符串以NUL
结尾(字节值为0 - 而不是ASCII数字'0'
)。
就像这样:
CMD DB "COMMAND.COM"
DB 0
您遇到的下一个问题是,COM文件在启动时几乎可以获得所有可用内存。
函数04Bh
将失败,因为内存不足(因为所有内存都被.COM文件“使用”)。
在调用函数04Ah
之前,必须使用函数4Bh
来调整.COM文件使用的内存块:
push cs ; Only needed if ES != CS
pop es ; ...
mov bx, 1000h
mov ah, 4Ah
int 21h
PARAM: ;???
根据Ralph Brown的中断列表,这是14个字节长:
AFAIK命令行的第一个字节是后面的字节数,后跟实际字母后跟字节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