使用指定参数

时间:2017-12-25 18:51:42

标签: assembly dos

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

它的全部意义在于执行程序在运行时生成的批处理文件。

1 个答案:

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

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

AFAIK命令行的第一个字节是后面的字节数,后跟实际字母后跟字节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
相关问题