2013-01-02 26 views
0

我在學習彙編語言,但寫入數組時遇到了一個簡單的問題。 我的程序應該讀取命令行參數,顯示它們並寫入數組。在下面的代碼中有一條標記線。如果我編譯這行註釋的程序工作正常,但如果我取消註釋它,它顯示幾個字符後掛起。這裏有什麼問題?它適用於參數較短的行,但此數組應足夠大以包含整個命令行。我在這裏錯過了什麼嗎?使用匯編語言寫入數組的問題

        assume cs:kod, ds:dane 

kod  segment 
.286 


start: 

mov  ax,seg wstos 
mov  ss,ax 
mov  sp,offset wstos        

xor  cx,cx 
xor  ax,ax  
mov  si,80h 
mov  dl,[si] 
mov  cl,dl 
mov  ah,2h 
int  21h 
inc  si 
xor  di,di 

petla: 
    inc  si 
    mov  dl,[si] 
    ;mov  [tablica + di],dl <<<< this line 
    test dl,dl 
    jz  sprawdz 
    int  21h 
    inc  di 
    dalej: 
loop petla 

sprawdz: 
    mov  al,[si+1] 
    cmp  al,0 
    jne  dalej 



koniecprogramu: 
mov  ax,4c00h 
int  21h 

dane segment 
    tablica  db 128 dup(0) 
dane ends 

stos1 segment STACK 
    dw 256 dup(?) 
    wstos dw ? 
stos1 ends 

回答

0

我認爲offset tablica == 0,但也ds = cs。至少它必須是,如果這些行按預期工作:

mov si, 80h 
mov al, [si]; 

,以使其符合,無論是DS必須進行初始化(在這種情況下,命令行與mov al,cs:[si]訪問,或者你可以簡單地離開數據代碼段通過註釋2行了:

;dane segment 
    tablica  db 128 dup(0) 
;dane ends 
+0

感謝您的幫助。我昨天自己實際解決了這個問題。 ;)問題不是初始化ds寄存器。現在一切正常。一直認爲,假設命令爲我做。那麼這個命令實際上在做什麼?找不到任何地方。 – Dcortez

+0

當彙編程序試圖計算標籤的地址/偏移量(在ds:segment中)時,它參考了assume指令中的參數。這當然預設,ds包含假定的段的值。另一個用途是調用/調用宏,其中可以假設指針(例如di)指向字節,單詞,雙字或甚至結構。 –

0

「MOV [tablica + DI]」 約ES是什麼?

+0

是啊...又是怎麼回事'ds'你在'開始初始化堆棧:'標籤(這可能是沒有必要的),但不''''''''''''''''''''''''''''''''''''''''''''初始化'ds'或'es'。 'tablica'在本身gment'丹妮'。我認爲你需要在一種情況下或另一種情況下使用段覆蓋。 –

+0

沒辦法;他有多個部分,因此它是一個EXE程序。 –