簡體   English   中英

如何在16位匯編程序中傳遞/檢索DOS命令行參數?

[英]How to pass/retrieve DOS command-line parameters in a 16-bit assembly program?

我正在為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命令行傳遞給我的程序。

在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 )。

大會蘭德爾海德藝術的時候,16位的DOS版本可以免費在線(在HTMLPDF格式)。 第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             

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM