尝试在 x86 GAS 中实现 strlen
Trying to implement strlen in x86 GAS
所以我对汇编编程非常陌生(非常陌生),我正在尝试编写一个可以计算字符串长度的函数。
我觉得我在清除寄存器中的值或指针的递增方面遇到了一些问题,因为得到 returned 的值对我来说总是“4571 + 长度”。
基本上,如果字符串长度为 0,我会得到 4571 作为 return 值。
如果我的字符串长度为 6,我会得到 4577 作为 return 值,等等
这是我的代码,如有任何帮助,我们将不胜感激:
.globl my_strlen
my_strlen:
pushq %rbp
movq %rsp, %rbp
pushq %r12
pushq %r13
movq [=10=], %rax
cmp [=10=], (%rdi)
jne my_strlen_loop
ret
my_strlen_loop:
inc %rax
inc %rdi
cmp [=10=], (%rdi)
jne my_strlen_loop
popq %r13
popq %r12
popq %rbp
ret
这段代码有两个问题。
首先,cmp
指令没有指定大小,而且两个操作数都不是寄存器,所以有歧义。对于大多数指令(比如 mov [=11=], (%rdi)
),GAS 会拒绝 assemble 它,但是由于某种原因 cmp
assemble 到 cmpl
,比较一个双字。将助记符显式更改为 cmpb
。
其次,在第一次 ret 之前,它不会弹出被压入的寄存器。最好跳到最后(并且有一个ret)。
所以我对汇编编程非常陌生(非常陌生),我正在尝试编写一个可以计算字符串长度的函数。
我觉得我在清除寄存器中的值或指针的递增方面遇到了一些问题,因为得到 returned 的值对我来说总是“4571 + 长度”。
基本上,如果字符串长度为 0,我会得到 4571 作为 return 值。 如果我的字符串长度为 6,我会得到 4577 作为 return 值,等等
这是我的代码,如有任何帮助,我们将不胜感激:
.globl my_strlen
my_strlen:
pushq %rbp
movq %rsp, %rbp
pushq %r12
pushq %r13
movq [=10=], %rax
cmp [=10=], (%rdi)
jne my_strlen_loop
ret
my_strlen_loop:
inc %rax
inc %rdi
cmp [=10=], (%rdi)
jne my_strlen_loop
popq %r13
popq %r12
popq %rbp
ret
这段代码有两个问题。
首先,cmp
指令没有指定大小,而且两个操作数都不是寄存器,所以有歧义。对于大多数指令(比如 mov [=11=], (%rdi)
),GAS 会拒绝 assemble 它,但是由于某种原因 cmp
assemble 到 cmpl
,比较一个双字。将助记符显式更改为 cmpb
。
其次,在第一次 ret 之前,它不会弹出被压入的寄存器。最好跳到最后(并且有一个ret)。