x86_64程序集字符串操纵导致分段错误

问题描述 投票:1回答:2

我正在尝试在汇编中编写一个“ strcat”函数,但无法获取传递给它的内存中的值以进行更改。我的测试崩溃了,我不明白为什么。我似乎也无法以易于理解的方式在x86_64程序集上找到任何好的文档。

    global  _ft_strcat

_ft_strcat:
        push    rbx
        push    rdx
        mov     rbx, rsi
        mov     rdx, rdi
parse:
        cmp     byte [rdx], 0
        je      concat
        inc     rdx
        jmp     parse
concat:
        cmp     BYTE[rbx], 0
        je      finish
        mov     dl, BYTE[rbx]
        mov     BYTE[rdx], dl
        inc     rdx
        inc     rbx
        jmp     concat
finish:
        mov     BYTE[rdx], 0
        mov     rax, rdi
        pop     rdx
        pop     rbx
        ret

上面是我要编写的功能,下面是我的测试。

int             main(void)
{
        char    buffer[50] = "Hello, ";
        ft_strcat(buffer, "World!");
        printf("%s\n", buffer);
        return (0);
}

我遗漏了包括include和标头之类的内容,因为从我所看到的内容来看,这与问题无关。我通过调试器运行了这个程序,发现在函数的末尾,rdi寄存器指向的字符串没有更改,但是我确实通过了concat标签中的循环,看起来好像是从字符串中提取了值被rsi指向的确实复制到了dl寄存器中。

c macos assembly x86-64 nasm
2个回答
2
投票

您的推和弹出按钮不匹配,因此您的例行更改rbprbx与ABI保留它们的要求相反。


0
投票

我的问题是我不了解如何操纵rdx寄存器的最低8位。通过将我的字符插入dl中,它的值更新了rdx的总体值,这意味着我实际上并没有连接我拥有的字符串,但是我正在写入不知道写入的内存区域。

代码现在看起来像这样

    global  _ft_strcat

_ft_strcat:
        push    rbx
        push    rdx
        push    rcx
        xor     rcx, rcx
        mov     rbx, rsi
        mov     rdx, rdi
parse:
        cmp     byte [rdx], 0
        je      concat
        inc     rdx
        jmp     parse
concat:
        cmp     BYTE[rbx], 0
        je      finish
        mov     cl, BYTE[rbx]
        mov     BYTE[rdx], cl
        inc     rdx
        inc     rbx
        jmp     concat
finish:
        mov     BYTE[rdx], 0
        pop     rcx
        pop     rdx
        pop     rbx
        mov     rax, rdi
        ret

您会注意到添加了Rex寄存器,并使用了其低8位来复制字节。

© www.soinside.com 2019 - 2024. All rights reserved.