我正在使用针对dos 8086的Huffman算法编写一个编码/解码.COM程序(不使用库的16位tasm或masm),并且需要在数组中存储2个命令行参数(inputfilename和outputfilename),以便我可以读取输入文件,应用我的霍夫曼编码,并写入输出文件。
我读过他们存储在地址80h,其中80h包含参数的长度,81h包含参数本身。所以我的想法是将第一个参数存储在inarg中(第二个存储在outarg中,我还没有开始工作) 用子程序9调用中断21h的目的是检查我是否正确。 (事实并非如此)
这是我到目前为止所做的:
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,即输入文件名)。
它不起作用,所以我肯定做错了什么。 对于任何有经验的程序员来说,这看起来可能是一团糟,但那是因为我试图跟踪我在互联网上找到的资源而没有成功,因此切换到仅使用我目前所理解的概念来实现它。 任何帮助将不胜感激, 谢谢。
答案 0 :(得分:4)
您的代码有几个问题。而不是我描述如何解决它,你可能会认为你不必复制参数。它们已经存在于内存中,因此您可以将指针存储到参数及其长度中。如果你不想,你甚至不需要存储长度。相反,在每个参数的末尾将一个0
字节放在内存中。
http://www.arl.wustl.edu/~lockwood/class/cs306/books/artofasm/Chapter_13/CH13-9.html上的文章有一个很好的解析命令行的例子。
在16位版本的在线书籍Art of Assembly语言中,第13章中有关于解析命令行的部分。这本书可以在网上的几个地方找到。一个很好的链接(截至05/04/2016)是http://www.plantation-productions.com/Webster/www.artofasm.com/DOS/ch13/CH13-9.html#HEADING9-1。