尝试在 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)。