2013-07-27 88 views
-1

我是新来的汇编语言,并试图通过代码的方式来学习它,我发现了一段代码,其表示将二进制到十进制和输出转换为ASCII上筛选。下面是代码这个程序很好吗?

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,这是根据代码流明显。

如果这是一个问题,那么我应该做出什么样的改变来纠正这一点。

+0

你是如何将'dx'设置为'10'的?如果它的字面意思是'10',那么你可能将它设置为十进制,它在输入处转换为'dx'中的'1010'二进制数,然后再转换回十进制数并打印。另外,只要确定并取决于您的汇编程序,请仔细检查'add dx,“0”'指令。 '“0”通常表示一个字符串,而“0”是一个字符(这是你想要的)。但我认为你的问题在于你给它一个十进制数字来开始。 – lurker

+0

@mbratch刚刚更新了我在DosBOx0.7上使用NASM运行的代码,并且检查了添加dx,“0”(dx = 1)给了我49作为DosBox的输出。 –

+0

投票关闭,为什么此代码无法正常工作。 –

回答

1

该程序看起来不错。

但是,您的输入不正确。在该指令:

mov  dx,10 

你的输入设置为十进制10,而是你正打算将其设置为10二进制文件。 dx此时的二进制值为1010(因为您将其设置为10十进制)。所以输出结果出来10,这是你所期望的。如果你想设置dx10二进制,你可以这样做:当你运行你的程序

mov  dx,10b 

然后,输出应该是2

+0

感谢@mbratch,它现在工作得很好,只是有一个疑问想问你,我想读取x86实模式下提供的低内存,并将int 0x12添加到此程序中,输出结果为640,那么我应该如何读它640kb或什么? –

+0

@AmitSinghTomar我建议添加一个新的stackoverflow.com问题。你会以这种方式获得更多的观众。 – lurker

+0

细@mbratch和再次感谢您的善意帮助。 –