函数是打印Ascii等效而不是整数作为字符串

时间:2015-02-24 03:40:11

标签: assembly

下面是我尝试编写一个将整数转换为字符串的函数。我不确定我是否正确使用推送功能。我试图将整数除以10,并将余数加到48h并将其添加到堆栈中。然后重复该过程,直到整个整数转换为字符串。此函数在Ascii中打印字符串,但我想在字符串表示中打印完整的整数。例如,如果存储在变量answer中的整数是75,那么我希望此函数将'75'打印为字符串,但它会打印'K'。

XOR eax, eax
    mov eax, [esi]
    mov cl, 10             ;move 10 to cl
    div cl                 ;divide by eax by 10
    add edx, 48h           ;add 48h to remainder
    push edx
    mov [edi], edx
    pop eax
    inc edi                ;increments the edi pointer  

这就是我调用函数来转换存储在回答sting中的整数并打印它。

lea esi, answer
call num2str
call PrintString

P.S。我正在使用visual studio 2012进行编译。谢谢!

1 个答案:

答案 0 :(得分:0)

问题是div cl是一个8位的鸿沟。它将ax除以cl,将结果放在al中,其余部分放在ah-edx中不受影响。您需要使用div ecx得到除以edx / eax寄存器对中的64位值的除法,并将结果放入eax,如果希望代码工作则将余数放在edx中 - 这需要清除ecx的高24位和清算edx:

;; eax = number to be converted to ASCII
;; edi = END of the buffer in which to store string
    xor ecx,ecx
    mov [edi], cl
    mov cl,10
loop:
    xor edx,edx
    div ecx
    add dl, 48h
    dec edi
    mov [edi], dl
    test eax,eax
    jnz loop
;; edi now points at the ASCII string
相关问题