如何在16位汇编程序中传递/检索DOS命令行参数



我正在为MS-DOS编写一些小工具。现在我正在编写一个Shutdown.com,类似于Windows XP及更高版本。我已经写了整个代码,现在我只需要从DOS传递参数。

我需要传递参数"-r"以重新启动,传递参数"-s"以关闭。

我该怎么做?

我在Windows98上使用TASM(Turbo Assembler 4.1)进行链接和编译。我正在寻找一种非常简单的方法,如果可能的话,仍然是一个.COM程序。我看起来和C语言中的ARGV和ARGC完全一样,但对于Assembly 16位。。。

  • shutdown -r将重新启动
  • shutdown -s将关闭

请记住,我已经知道如何重新启动和关闭电脑。
我只需要学习如何将参数从MS-DOS命令行传递到我的程序。

在MS-DOS中没有特定的API来检索命令行。相反,您必须从程序段前缀(PSP)的适当偏移量中读取值,PSP是DOS用来存储程序特定数据的数据结构。

在偏移量80h处,有一个1字节的值,它给出了命令行参数的长度。实际的命令行参数字符串从偏移量81h开始,长度最多可达127个字节。您知道它的长度是基于偏移80h处的值,但它也将以回车(0Dh)终止。

当程序首次执行时,可以使用这些相对于DS寄存器中指针的偏移量。否则,在AH设置为62h的情况下调用INT 21h,以检索指向BX寄存器中当前PSP的指针。(函数62h需要DOS 3或更高版本;在DOS 2上,可以使用未记录的函数51h)。

Randall Hyde的Art of Assembly的旧的16位DOS版本可以在线免费获得(HTML和PDF格式)。在第13章中,第13.3.11节描述了PSP,以下两节(13.3.12-13)解释了如何访问和解析命令行参数,包括示例代码。

根据这个站点,命令行的长度存储在DS:80h(单字节),实际的命令行本身从DS:81h开始。下面是这篇文章中打印命令行的一些示例代码:

; ----------------------------------------------------------------------------
; echo.asm
;
; Echoes the command line to standard output.  Illustrates DOS system calls
; 40h = write to file, and 4ch = exit process.
;
; Processor: 386 or later
; Assembler: MASM
; OS: DOS 2.0 or later only
; Assemble and link with "ml echo.asm"
; ----------------------------------------------------------------------------
.model  small
.stack  64                      ; 64 byte stack
.386
.code
start:  movzx   cx,byte ptr ds:[80h]    ; size of parameter string
mov     ah, 40h                 ; write
mov     bx, 1                   ; ... to standard output
mov     dx, 81h                 ; ... the parameter string
int     21h                     ; ... by calling DOS
mov     ah, 4ch
int     21h
end     start             

最新更新