尝试在x86 GAS中实现strlen

时间:2018-10-07 19:40:40

标签: x86 x86-64 gas

所以我对汇编编程非常陌生(非常新),并且正在尝试编写一个可以计算字符串长度的函数。

我觉得清除寄存器中的值或增加指针有一些问题,因为对于我来说,返回的值始终为“ 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

1 个答案:

答案 0 :(得分:4)

此代码有两个问题。

首先,cmp指令未指定大小,并且两个操作数都不是寄存器,因此不明确。对于大多数指令(例如mov $0, (%rdi)),GAS会拒绝对其进行汇编,但是出于某种原因,cmp会与cmpl进行汇编,比较一个双字。将助记符明确更改为cmpb

第二,在第一次退出之前,它不会弹出已推送的寄存器。最好跳到最后(并完成一次退赛)。