Assembly 函数正在打印Ascii等效值,而不是将整数打印为字符串

Assembly 函数正在打印Ascii等效值,而不是将整数打印为字符串,assembly,Assembly,下面是我尝试编写的一个函数,用于将整数转换为字符串。我不确定我是否正确使用了推送功能。我试着把整数除以10,然后把48小时加到余数上,然后把它加到堆栈中。然后重复该过程,直到整个整数转换为字符串。此函数以Ascii格式打印字符串,但我希望以字符串表示形式打印精确的整数。例如,如果变量answer中存储的整数是75,则我希望此函数将“75”打印为字符串,但它将打印“K” XOR eax, eax mov eax, [esi] mov cl, 10 ;move

下面是我尝试编写的一个函数,用于将整数转换为字符串。我不确定我是否正确使用了推送功能。我试着把整数除以10,然后把48小时加到余数上,然后把它加到堆栈中。然后重复该过程,直到整个整数转换为字符串。此函数以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  
这就是我调用函数将存储在answer中的整数转换为sting并打印它的方式

lea esi, answer
call num2str
call PrintString
另外,我正在使用visual studio 2012进行编译。谢谢

问题在于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