上周在实验室中我们必须在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的字符串,它确实正确返回。请帮助我理解
答案 0 :(得分:2)
Bo Persson已经指出了问题所在。 而不是使用cmpq,你应该使用cmpb(与字节比较)