【发布时间】:2018-10-07 19:40:39
【问题描述】:
所以我对汇编编程非常陌生(非常新),并且正在尝试编写一个可以计算字符串长度的函数。
我觉得我在清除寄存器中的值或指针的增量方面遇到了一些问题,因为返回的值对我来说始终是“4571 + 长度”。
基本上,如果字符串长度为 0,我会得到 4571 作为返回值。 如果我的字符串长度为 6,我会得到 4577 作为返回值,等等。
这是我的代码,任何帮助将不胜感激:
.globl my_strlen
my_strlen:
pushq %rbp
movq %rsp, %rbp
pushq %r12
pushq %r13
movq $0, %rax
cmp $0, (%rdi)
jne my_strlen_loop
ret
my_strlen_loop:
inc %rax
inc %rdi
cmp $0, (%rdi)
jne my_strlen_loop
popq %r13
popq %r12
popq %rbp
ret
【问题讨论】:
-
在“ret”之前添加这个:“sub $4571, %rax”
-
不过,这更像是一个临时修复。为什么 4571 首先要进入 rax?
-
是的,这是个玩笑。 :-) 我正在写一个真实的答案。
-
您不需要对 RAX 和 RDI 以外的寄存器做任何事情。只留下 R12 和 R13。还有 RBP,您不需要传统的堆栈框架。
-
这只是作为骨架代码的一部分提供给我们的。我知道我不需要这三个寄存器,但我就这样离开了
标签: x86 x86-64 gnu-assembler