使用ax而不是dx中断21

时间:2014-04-30 12:41:20

标签: assembly emulation x86-16 16-bit

在以下代码中

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更改为ax

lea dx,str --> lea ax,str

输出成为1 'Sum is 但是,如果我使用lea ax,str这是正确的> Sum is :

我无法弄清楚原因!

为什么将dx更改为ax会导致输出错误?

1 个答案:

答案 0 :(得分:0)

您不应随意交换AX for DX。用于打印字符串的DOS函数使用DX和那个最终的!
从你的程序中我看到,输入和求和所做的任何事情都不会影响你之后显示的字符串 如果您的汇编程序mov num,al更改了' num'地址的内容。然后,行inc num;nex element肯定不会前进到下一个元素,而是将内容增加1.这同样适用于sub num,4;go to first position