[英]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版本可以免費在線(在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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.