2013-04-04 177 views
1

我想在x86中編寫一個簡單的程序(使用MASM編譯)。 它的目的是編寫命令行參數輸出(每個都在一個新行中)。 這是我想出了迄今:彙編x86命令行參數

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%給予正確的結果很好地工作。 任何幫助,將不勝感激

+0

你的程序沒有堆棧段,不必以此爲基礎工作。您的程序也不能正確終止。 – 2013-04-05 03:26:56

回答

1

你開始複製參數字符串之前,你這樣做:

mov dx,offset input 
mov di, dx 

但如果有一個以上的參數,你這樣做的第一個參數後已打印:

xor di,di ;prepare registry for new word 

這應該可能是mov di, dx,除非您絕對肯定地100%確定input的偏移始終爲0.

2

這是這麼久以來我看着任何彙編...大提示,而不是here's your answer

你肯定ES加載相應的段,因爲你沒有初始化呢?

請注意,通過加載內容爲80H的CL,您可以將CL設置爲命令行的LENGTH。

當你循環回WORD(不是一個好的名字爲標籤,順便說一句 - 因爲它是一個關鍵字),你正在傳輸下一個字節。一切都很好,但是你不會減少命令行中的字符數CL。如果沒有達到0,你應該跳轉到減少CX並返回到目標標籤的LOOP指令。

在執行INT 10h之前,您已經非常仔細地(正確)保存了BP和AX是否將這兩個寄存器保存了足夠的空間?也許其他寄存器也被修改...

類似地,INT 21H - 是否有任何寄存器可以通過執行該中斷後面的例程來更改?如果是這樣,你應該先PUSH他們第一個和POP他們回來後,例程結束。

對於依靠CR = 0DH = 13來結束這條線非常ca ca。如果參數的可用空間是完全填充的,這將會丟失。 CL中的字符數更重要。如果你使用LOOP指令正確地減少了CL,那麼你就不會計數CR(IIRC),因爲它不構成計數的一部分。它假定,當然,CX不是所有的胡鬧檢查空間或寫出線的改變......

哦,順便說一句 - 通常,一個新的生產線是CRLF或0DH, 0AH - 按此順序。在機械終端上,這實際上是將打印頭移回到左側,然後將紙張向上滾動一行。打印頭非常堅固,並在彈簧加載擋塊返回時產生大量動力。結果是他們經常反彈,並且隨着打印頭的安裝,下一行的開始字符將噴印到打印輸出的前幾列上,每一條新線都無可避免地使機械裝置越來越無法調整。事實上,換行是CR LF CR並不罕見,只是爲了讓機械師有時間來解決。