上周在实验室中,我们必须在 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 的字符串,它确实返回正确。请帮助我理解