8086 - хранение аргументов командной строки в массивах - PullRequest
2 голосов
/ 12 декабря 2011

Я пишу программу кодирования / декодирования .COM, использующую алгоритм Хаффмана для DOS 8086 (16-битный TEMM или MASM без использования библиотек), и мне нужно хранить 2 аргумента командной строки (inputfilename и outputfilename) в массивах, чтобы Я могу прочитать входной файл, применить кодировку Хаффмана и записать в выходной файл.

Я читал, что они хранятся по адресу 80h, где 80h содержит длину аргументов, а 81h и далее сами аргументы. Таким образом, идея заключается в том, чтобы сохранить первый аргумент в inarg (а второй в outarg, над которым я еще не начал работать) Цель вызова прерывания 21h с подпрограммой 9 состояла в том, чтобы проверить, правильно ли я это сделал. (что не так)

Вот что у меня есть:

getCLargs proc near 

mov cx, [080h]        ; store memory address of command-line argument length
mov bx, 082h          ; store command-line arguments first byte

sub si,si  
sub di,di
next:         
mov dx, [bx]          ; store first byte of argument into dx 
mov inarg[si],dx      ; put it into the first byte of the array inarg
cmp cx, di            ; compare di to the length of the args
je print              ; if equal, done, jump to print
inc di                ; else: inc di
;    inc si
jmp next              ; do it again until cx=di
print:
mov ah, 09h           ; print content of inarg array to check it's right
mov dx, inarg
mov inarg[si+1], '$'  ; not sure whether I must terminate my string array with '$'
int 21h
done:    
ret
getCLargs endp

Со следующими соответствующими данными:

inarg dw ?
outarg dw ?

Я начал с основ, не рассматривая разделители и пытаясь получить только первый аргумент (inarg, который является именем входного файла).

И это не работает, поэтому я определенно делаю что-то не так. Это может показаться полным беспорядком любому опытному программисту, но это потому, что я безуспешно пытался следить за ресурсами, которые нашел в Интернете, и поэтому переключаюсь на его реализацию, используя только те концепции, которые я понимаю до сих пор. Любая помощь будет принята с благодарностью, Спасибо.

1 Ответ

4 голосов
/ 12 декабря 2011

В вашем коде есть несколько ошибок.Вместо того, чтобы описывать, как это исправить, вы можете подумать, что вам не нужно копировать аргументы.Они уже находятся в памяти, так что вы можете просто сохранить указатели на аргументы и их длину.И вам даже не нужно хранить длины, если вы не хотите.Вместо этого поместите 0 байт в память в конце каждого аргумента.

Статья в http://www.arl.wustl.edu/~lockwood/class/cs306/books/artofasm/Chapter_13/CH13-9.html имеет очень хороший пример синтаксического анализа командной строки.

В 16-разрядном издании онлайновой книги «Язык ассемблера» в главе 13 есть раздел о разборе командной строки.Книга доступна в нескольких местах в Интернете.Одна хорошая ссылка (по состоянию на 05.04.2016): http://www.plantation -productions.com / Webster / www.artofasm.com / DOS / ch13 / CH13-9.html # HEADING9-1 .

...