我正在尝试编写一个与sprintf相似的功能(虽然有点简单)。我已经到了我应该将结果打印到结果字符串 - 参数%d的点。我的策略是将数字除以10,然后将48(ascii offset)添加到其余部分,然后将其推入堆栈并增加esi,直到商为0.然后我将每个数字从堆栈中弹出,并将它们添加到结果字符串。这是我目前的代码:
addint:
movl $0,%edx
movl $10,%ebx
div %edi
addl $48,%edx
pushl %edx
incl %esi
cmpl $0,%eax
jz addintprint
jmp addint
addintprint:
movl tmpedx,%edx
incl %ecx
jmp addintfinish
addintfinish:
cmpl $0,%esi
jz mainloop
decl %esi
popl %ebx
movl addr,%eax
leal (%edx,%eax,1),%eax
movb %bl,(%eax)
incl %edx
jmp addintfinish
其中%edx用于计算结果字符串中的字母索引(%ecx已被保留用于计算第二个参数字符串中的索引,因此请不要使用它,除非它是'必要的),addr是结果字符串的地址。
现在我得到了愚蠢的输出(从参数的两倍到L等字母以及ascii表中的其他随机性)。我认为我走在正确的轨道上,但我当前的代码显然有些问题。非常感谢任何帮助。
提前致谢。
答案 0 :(得分:1)
您将10加载到ebx
但在分区中使用edi
。
可能还有其他问题。学习使用调试器来逐步检查代码并自己查看它出错的地方。