strlen程序集返回6表示短字符串

时间:2012-11-08 20:51:24

标签: assembly x86-64

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

    .text
        .globl mystrlen
  .type   mystrlen, @function
  mystrlen:
        movq $0, %rax                   #put 0 in return register
        movq $0, %r15
        beginloop:
        cmpq $0, (%rdi)         #while n!=0
        je end
        incq %rax
        incq %rdi
        movq $0, %r14
        cmpq $0, %r14                   #go back to bginning
        je beginloop
      end:                          #
          ret                       # return result;

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

1 个答案:

答案 0 :(得分:2)

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