2017-01-03 45 views
3

我正在为MS-DOS编写一些小工具。现在我正在编写一个Shutdown.com,就像Windows XP和更高版本一样。我已经写完整个代码,现在我只需要从DOS传递参数。如何在16位汇编程序中传递/检索DOS命令行参数?

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

我该怎么办?

我正在使用TASM(Turbo Assembler 4.1)在Windows 98上进行链接和编译。我正在寻找一个非常简单的方法来做到这一点,如果可能的话,仍然是一个.COM程序。我期待完全一样从C语言的argv和ARGC,但对于大会的16位...

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

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

+0

你在打什么实体?另一个程序? BIOS?汇编程序如何期望传递参数? – wallyk

+0

我在MS-DOS外壳上调用shutdown.com。就像我把其他程序称为MOVE,FORMAT,FDISK一样。 – MendaxRox

+0

'shutdown.com'是命令行程序吗?也就是说,要从命令行使用它,你能输入'shutdown -r'吗? – wallyk

回答

6

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

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

当程序第一次执行时,您可以使用这些相对于DS寄存器中指针的偏移量。否则,您拨打INT 21h并将AH设置为62h以检索指向BX寄存器中当前PSP的指针。 (功能62h需要DOS 3或更高版本;在DOS 2上,您可以使用未公开的功能51h)。

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

6

根据this site,命令行的长度存储在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    
+0

我尝试比较dx上的ASCII字符时遇到了麻烦。我如何比较字符? – MendaxRox

+0

@MendaxRox - 您可以先循环扫描或使用repne scasb(cx = count,di = address)扫描“ - ”,然后检查下一个字符是'r'还是'R'或's'或'S'(你可以*或* 020h并检查'r'或's')。 – rcgldr

+0

我该怎么做?我在这里尝试了一个小实验,但是id不起作用。 – MendaxRox