所以这就是问题所在:我实际上是在尝试用汇编语言重新编写一些clib函数(这是一个帮助开始汇编的学校项目)。我目前正在处理的函数是strcat。 目前我的目标是保持简单并遵循以下几条规则:
这是我的代码:
ft_strcat:
push rbp
mov rbp, rsp ; saving the stack state
push rdi ; seems to work better this way but I don't know why
mov rdi, [rsp + 24] ; destination string
mov rsi, [rsp + 16] ; source string
push rdi ; keeping the adress to return
test rsi, rsi ; in case one of the strings is NULL
je getdest
test rdi, rdi
je getsrc
toend: ; to go to the end of the destination string
cmp byte [rdi], 0x0 ; is it the end?
je cpy ; if so, go to the next part
inc rdi ; else keep going
jmp toend ; loop
cpy: ; to copy the source string to the end of the destination string
mov al, byte[rsi] ; getting the byte to copy
mov byte [rdi], al ; copying it
cmp byte [rsi], 0x0 ; it is the end of the source string?
je getdest ; if so, jump to the end
inc rdi ; else increase counter
inc rsi
jmp cpy ; loop
getdest: ; if source is NULL or copy is done
pop rax
jmp end
getsrc: ; if destination is NULL
mov rax, rsi
end:
pop rdi ; get rdi back
leave
ret ; finally return...
我尝试了大量不同的方法(movsb,通过寄存器[直接]传递参数,更改寄存器...)总是达到相同的结果:
此当前版本保持目标部分不变,但最后添加了这些非字符字符:���Ph�
(这只是一个示例,但字符往往会偶尔改变一次)...
我想也许你可以帮助我(至少给我一些改变的地方,或者我的代码可能出错的地方),因为我已经浏览了整个互联网,从来没有找到能帮助我的东西。
哦,顺便说一下,我在Ubuntu上与Nasm合作(是的,我知道;))。
对任何会回答的人都很感兴趣。 :)
答案 0 :(得分:0)
很可能是
mov rdi, [rsp + 32] ; destination string
mov rsi, [rsp + 24] ; source string
或
mov rdi, [rbp + 24] ; destination string
mov rsi, [rbp + 16] ; source string
无论你更喜欢哪个
在当前版本中,RSI包含函数的返回地址。如果您目前正在向“目的地”添加一些内容,请尝试
mov rdi, [rsp + 24]
mov rsi, [rsp + 32]