下面是我尝试编写一个将整数转换为字符串的函数。我不确定我是否正确使用推送功能。我试图将整数除以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进行编译。谢谢!
答案 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