在x86_64程序集

时间:2017-02-24 17:27:11

标签: assembly nasm x86-64 strcat clib

所以这就是问题所在:我实际上是在尝试用汇编语言重新编写一些clib函数(这是一个帮助开始汇编的学校项目)。我目前正在处理的函数是strcat。 目前我的目标是保持简单并遵循以下几条规则:

  • 如果目标字符串为NULL,则返回(在rax中)源字符串。
  • 如果源字符串为NULL,则返回(在rax中)目标字符串。
  • 复制目标字符串末尾的源字符串(包括终止0)并返回(仍在rax中)结果。

这是我的代码:

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合作(是的,我知道;))。

对任何会回答的人都很感兴趣。 :)

1 个答案:

答案 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]