这个节目好吗?

时间:2013-07-27 20:00:48

标签: assembly x86 real-mode

我是汇编语言的新手并试图通过代码学习它,我找到了一段代码,它说它将二进制转换为十进制并输出为ascii到屏幕.Below是代码

 org 100h
    push    ax
    push    cx
    push    dx
    push    si
    mov     dx,10
    mov     ax,dx   ;Assuming number to print starts in DX
    mov     si,10   ;decimal 10
    xor     cx,cx   ;Initialize count at 0

    NonZero:
    xor     dx,dx   ;Clear last remainder
    div     si
    push    dx      ;Save digits in reverse order
    inc     cx
    or      ax,ax   ;Is original number down to 0 yet?
    jnz     NonZero ;No, continue looping

    mov     ah,02h

    WriteDigitLoop:
    pop     dx
    add     dx,"0"  ;Convert to ASCII
    int     21h     ;  and print
    loop    WriteDigitLoop

    EndDecimal:
    pop     si
    pop     dx
    pop     cx
    pop     ax

现在让我们假设,dx的初始值是10,所以我猜输出应该是2。 但是实际输出为10,这在代码流程中很明显。

如果这是一个问题,那么我应该做出哪些改变来纠正这个问题。

1 个答案:

答案 0 :(得分:1)

程序看起来很好。

但是,您的输入不正确。在这条指令中:

mov     dx,10

您将输入设置为10十进制,但您打算将其设置为10二进制。此时dx中的二进制值为1010(因为您将其设置为10十进制)。所以输出结果是10,这是你所期望的。如果您想将dx设置为10二进制文件,则可以执行以下操作:

mov     dx,10b

然后,当您运行程序时,输出应为2