使用指定参数执行 .COM 文件

Krz*_*zyk 1 assembly dos

我正在尝试在 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 的资源。

它的重点是执行程序在运行时生成的批处理文件。

Mar*_*nau 5

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 个字节长:

  • 包含环境的段(或 0 以复制环境)(2 个字节)
  • 指向命令行的指针(偏移量、段)(4 个字节)
  • 指向第一个 FCB(4 个字节)的指针(偏移量、段)
  • 指向第二个 FCB(4 个字节)的指针(偏移量、段)

AFAIK 命令行的第一个字节是后面的字节数,后面是实际字母,后面是 byte 0Dh。(检查内容cs:80h以检查此信息。)

FCB 是 DOS 1.x 程序所需的前两个命令行参数的特殊表示。因为从 DOS 2.x 开始不再需要它们,所以您可以简单地在此处传递两个虚拟 FCB。FCB 的长度为 16 字节。您可以简单地将 FCB 从您的程序(cs:05Chcs: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)