1

dos 8086(ライブラリを使用しない16ビットtasmまたはmasm)のハフマンアルゴリズムを使用してエンコード/デコード.COMプログラムを作成しており、2つのコマンドライン引数(inputfilenameとoutputfilename)を配列に格納して読み取る必要があります。入力ファイル、ハフマンエンコーディングを適用し、出力ファイルに書き込みます。

それらはアドレス80hに格納されていることを読みました。ここで、80hには引数の長さが含まれ、81h以降は引数自体が含まれます。したがって、最初の引数をinarg(および2番目の引数はまだ作業を開始していない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)のみを取得しようとしました。

そしてそれはうまくいかないので、私は間違いなく何か間違ったことをしています。これは経験豊富なプログラマーにとっては完全に混乱しているように見えるかもしれませんが、それはインターネットで見つけたリソースをうまく追跡しようとしなかったため、これまでに理解した概念のみを使用して実装に切り替えたためです。どんな助けでも大歓迎です、ありがとう。

4

1 に答える 1

3

コードにいくつか問題があります。私がそれを修正する方法を説明するのではなく、引数をコピーする必要はないと考えるかもしれません。それらはすでにメモリ内にあるので、引数へのポインタとその長さを格納するだけで済みます。また、必要がなければ、長さを保存する必要もありません。代わりに、0各引数の最後に1バイトをメモリに入れます。

http://www.arl.wustl.edu/~lockwood/class/cs306/books/artofasm/Chapter_13/CH13-9.htmlの記事には、コマンドラインの解析の非常に良い例があります。

オンラインブックArtofAssembly言語の16ビット版には、コマンドラインの解析に関するセクションが第13章にあります。この本は、Web上のいくつかの場所で入手できます。1つの良いリンク(2016年5月4日現在)はhttp://www.plantation-productions.com/Webster/www.artofasm.com/DOS/ch13/CH13-9.html#HEADING9-1です。

于 2011-12-12T05:25:13.680 に答える