2017-01-03 1 views
3

Я пишу немного инструментов для MS-DOS. Теперь я пишу Shutdown.com, как и для Windows XP и выше. Я уже написал весь код, теперь мне просто нужно передать аргумент из DOS.Как передать/получить параметры командной строки DOS в 16-битной программе сборки?

Мне нужно передать параметры «-r» для перезагрузки и «-s» для выключения.

Как я могу это сделать?

Я использую TASM (Turbo Assembler 4.1) на Windows 98 для связи и компиляции. Я ищу очень простой способ сделать это, и, если возможно, еще программу .COM. Я смотрю так же, как и ARGV ARGC от языка C, но для сборки 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, чтобы получить указатель на текущий PSP в регистре BX. (Функция 62h требует DOS 3 или новее, на DOS 2 вы можете использовать недокументированную функцию 51h).

старая, 16-разрядная версия DOS Рэндалла Хайда искусства Ассамблеи доступен для свободного онлайн (в HTML и PDF форматах). В разделе 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

У меня проблемы, когда я пытаюсь сравнить символ ASCII на dx. Как я могу сравнить символ? – MendaxRox

+0

@MendaxRox - вы можете сначала сканировать '-', либо в цикле, либо используя repne scasb (cx = count, di = address), а затем проверить, является ли следующий символ «r» или «R» или «s», или «S» (вы можете * или * 020h и проверить «r» или «s»). – rcgldr

+0

Как я могу это сделать? Я попробовал небольшой эксперимент здесь, но id не работает. – MendaxRox

Смежные вопросы