0

x86 で簡単なプログラムを作成しようとしています (MASM を使用してコンパイルします)。その目的は、コマンド ライン引数を出力に書き込むことです (それぞれが新しい行に)。これが私がこれまでに思いついたものです:

data1 segment
   input db 40 dup (?)   ;input                   
data1 ends


code1   segment

START:                           
   mov ax,seg input
   mov ds,ax
   mov dx,offset input
   mov di, dx 

   mov si, 82h
   mov cl,es:[80h]    


word:   
      mov al,es:[si]
      mov ds:[di],al   
      inc si   
      inc di   

      cmp al,0Dh   ;out of arguments? (if YES goto finish)
      jz finish

      cmp al,20h   ;end of word? (if NO goto word)
      jnz word

   mov al, '$'  ;line terminate
   mov ds:[di], al

   mov ah,09h      ;write string
   int 21h 

   xor di,di    ;prepare registry for new word

   call new_line


   loop word

finish: 


   mov al, '$'
   mov ds:[di], al

   mov ah,09h      ;write last argument
   int 21h  


   mov ax,4ch   ;end program
   int 21h


new_line:
   push ax
   push bp
   mov ax,0e0ah ;ah=0e-write char,al=0a-go to new line
   int 10h
   mov al,13     ;carriage return
   int 10h 
   pop bp
   pop ax
ret

code1 ends  
end START

emu8086 でテストすると正常に動作するように見えますが、MASM でコンパイルすると、実行の 10% でしか正しい結果が得られません。どんな助けでも大歓迎です

4

2 に答える 2

0

引数文字列のコピーを開始する前に、次のことを行います。

mov dx,offset input
mov di, dx

ただし、複数の引数がある場合は、最初の引数が出力された後にこれを行います。

xor di,di    ;prepare registry for new word

のオフセットが常に 0 になることmov di, dxを絶対に、積極的に、100% 確信していない限り、それはおそらくそうであったはずです。input

于 2013-04-04T11:23:54.873 に答える