所以我对汇编编程非常陌生(非常新),并且正在尝试编写一个可以计算字符串长度的函数。
我觉得清除寄存器中的值或增加指针有一些问题,因为对于我来说,返回的值始终为“ 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
答案 0 :(得分:4)
此代码有两个问题。
首先,cmp
指令未指定大小,并且两个操作数都不是寄存器,因此不明确。对于大多数指令(例如mov $0, (%rdi)
),GAS会拒绝对其进行汇编,但是出于某种原因,cmp
会与cmpl
进行汇编,比较一个双字。将助记符明确更改为cmpb
。
第二,在第一次退出之前,它不会弹出已推送的寄存器。最好跳到最后(并完成一次退赛)。