Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

I am writing some little tools for MS-DOS. Now I'm writing a Shutdown.com, like for Windows XP and greater. I have already written the entire code, now I just need to pass the argument from DOS.

I need to pass the parameters "-r" to reboot and "-s" to shutdown.

How can I do it?

I'm using TASM(Turbo Assembler 4.1) on Windows 98 to link and compile. I'm looking for a very simple way to do it, and if possible, still a .COM program. I'm looking exactly like the ARGV and ARGC from C language, but for Assembly 16-bits...

  • shutdown -r will reboot
  • shutdown -s will shutdown

Remember that I already know how to reboot and how to shutdown the PC.
I just need to learn how to pass the parameters from the MS-DOS command line to my program.

like image 905
MendaxRox Avatar asked Jan 03 '17 17:01

MendaxRox


People also ask

How are parameters passed in assembly?

To pass parameters to a subroutine, the calling program pushes them on the stack in the reverse order so that the last parameter to pass is the first one pushed, and the first parameter to pass is the last one pushed. This way the first parameter is on top of the stack and the last one is at the bottom of the stack.

How do I pass a command line ARGument in Windows?

For example, entering C:\abc.exe /W /F on a command line would run a program called abc.exe and pass two command line arguments to it: /W and /F. The abc.exe program would see those arguments and handle them internally.

What is parameter DOS?

The Parameter (PARM) command definition statement defines a parameter of a command being created. A parameter is the means by which a value is passed to the command processing program. One PARM statement must be used for each parameter that appears in the command being defined.


2 Answers

There is no specific API to retrieve the command-line in MS-DOS. Instead, you have to read the value from the appropriate offset of the Program Segment Prefix (PSP), which is a data structure that DOS uses to store program-specific data.

At offset 80h, there is a 1-byte value that gives the length of the command-line arguments. The actual command-line argument string starts at offset 81h, and can be up to 127 bytes in length. You know how long it is based on the value at offset 80h, but it will also be terminated with a carriage return (0Dh).

You can use these offsets relative to the pointer in the DS register when the program is first executed. Otherwise, you call INT 21h with AH set to 62h to retrieve a pointer to the current PSP in the BX register. (Function 62h requires DOS 3 or later; on DOS 2, you can use the undocumented function 51h).

The old, 16-bit DOS version of Randall Hyde's Art of Assembly is available for free online (in HTML and PDF formats). In Chapter 13, section 13.3.11 describes the PSP, and the following two sections (13.3.12–13) explain how to access and parse command-line parameters, including sample code.

like image 170
Cody Gray Avatar answered Oct 02 '22 23:10

Cody Gray


According to this site, the length of the command-line is stored at DS:80h (single byte), and the actual command line itself starts at DS:81h. Here's some example code from that article that prints the command line:

; ----------------------------------------------------------------------------
; 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             
like image 44
cbranch Avatar answered Oct 02 '22 23:10

cbranch