在汇编中将int写入unsigned char *

时间:2014-04-29 13:39:10

标签: string assembly printf cpu-registers gas

我正在尝试编写一个与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表中的其他随机性)。我认为我走在正确的轨道上,但我当前的代码显然有些问题。非常感谢任何帮助。

提前致谢。

1 个答案:

答案 0 :(得分:1)

您将10加载到ebx但在分区中使用edi。 可能还有其他问题。学习使用调试器来逐步检查代码并自己查看它出错的地方。