-1

上周在实验室中,我们必须在 x86_64 程序集中实现一个 strlen 函数。我完成了实验并获得了满分,但后来发现我的代码中有一个错误。对于长字符串,它可以正常工作,但对于长度为 1、2、3 或 4 的字符串,我的函数返回 6。我不明白为什么。下面是代码。

    。文本
        .globl mystrlen
  .type mystrlen, @function
  神秘人:
        movq $0, %rax #将 0 放入返回寄存器
        movq $0, %r15
        开始循环:
        cmpq $0, (%rdi) #while n!=0
        结束
        公司 %rax
        公司 %rdi
        movq $0, %r14
        cmpq $0, %r14 #回到开始
        我开始循环
      结尾: #
          ret # 返回结果;

现在我知道这不是实现 strlen 的好方法,而且我可以利用一些东西来提高效率,但我并不在乎。我只是想弄清楚为什么此代码对于长度为 1、2、3 或 4 的字符串返回 6。对于长度为 0 或大于 5 的字符串,它确实返回正确。请帮助我理解

4

1 回答 1

3

Bo Persson 已经指出了问题所在。而不是使用 cmpq,您应该使用 cmpb(与字节相比)

于 2013-10-27T22:47:54.340 回答