2014-04-30 83 views
-1

在下面的代碼斧頭,而不是DX與中斷21

data segment 
    ; add your data here! 
    num db 0,0,0,0 
    sum db 0 
    str db "Sum is : $" 
ends 

stack segment 
    dw 128 dup(0) 
ends 

code segment 
start: 
; set segment registers: 
    mov ax, data 
    mov ds, ax 
    mov es, ax 

    ;;read array from input  
    mov cx,4;set loop counter 
    L1: 
    mov ah,7;interupt 7 use for reading character without echo 
    int 21h 
    mov num,al;mov al to num 
    add sum,al 
    inc num;nex element 
    LOOP L1 
    sub num,4;go to first position 
    ;;;;;;;;;;;;;;;;;;;;;;;; 

    ;;show sum 
    lea dx,str;;-----------------I'm changing this line----------------------- 
    mov ah,9;interupt 9 for writing string 
    int 21h 
    ;;;;;;;;;;;   

    mov ax, 4c00h ; exit to operating system. 
    int 21h  
ends 

end start ; set entry point and stop the assembler. 

如果我改變DX斧子

lea dx,str --> lea ax,str 

的出放成爲1 'Sum is 但是,如果使用lea ax,str這是正確的>Sum is :

我無法弄清楚原因!

爲什麼將dx更改爲ax會導致錯誤的輸出?

+2

你怎麼知道用於打印字符串的中斷?特別是,你如何告訴它打印什麼字符串? –

+0

@ScottHunter tnx我讀完這個鏈接後發現原因:) http://spike.scu.edu.au/~barry/interrupts.html ------- Interupt使用dx寄存器寫入輸出 – Omid

回答

0

您不應該隨機交換AX的DX。打印字符串的DOS函數使用DX,這是最終的!
從你的程序中,我發現你輸入和求和的操作對你以後顯示的字符串沒有任何影響。
如果你的彙編mov num,al改變爲「民」的地址的內容後再行inc num;nex element肯定不會前進到下一個元素,但通過1內容同樣適用,而擴大到sub num,4;go to first position