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

Men*_*Rox 5 assembly dos tasm 16-bit x86-16

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

我需要将参数"-r"传递给reboot,将"-s"传递给shutdown.

我该怎么做?

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

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

请记住,我已经知道如何重新启动以及如何关闭PC.
我只需要学习如何将参数从MS-DOS命令行传递给我的程序.

Cod*_*ray 7

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

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

DS首次执行程序时,可以使用相对于寄存器中指针的这些偏移量.否则,INT 21h使用AHset to 调用62h以检索BX寄存器中当前PSP的指针.(功能62h需要DOS 3或更高版本;在DOS 2上,您可以使用未记录的功能51h).

兰德尔海德的老,16位的DOS版本大会的艺术是免费在线(在HTMLPDF格式).在第13章中,第13.3.11节描述了PSP,以下两节(13.3.12-13)解释了如何访问和解析命令行参数,包括示例代码.


cbr*_*nch 6

根据该站点,命令行的长度存储在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             
Run Code Online (Sandbox Code Playgroud)