首页 > 解决方案 > x64 程序集段错误 rbx 与 rcx

问题描述

我正在尝试在 macos 上使用 x64 程序集来实现我的 strcpy 函数版本。我遇到了一个我不明白的 SEGV 错误。

这是我的汇编代码。

section .text
    global _ft_strcpy

_ft_strcpy:
    mov rax, rdi

loop:
    mov rbx, [rsi]
    mov [rdi], rbx
    inc rdi
    inc rsi
    cmp [rsi] , byte 0
    jne loop

end:
    mov [rdi], byte 0
    ret

这是我用于测试的 main.c。

#include <stdio.h>
#include <string.h>

int main(void)
{
    char src [11] = "Hello moto";
    char dest [11];
    ft_strcpy(dest, src);

    printf("|%p|\n", src);
    printf("|%s|\n", src);
    printf("|%p|\n", dest);
    printf("|%s|\n", dest); 
    return (0);
}

fsanitize 的输出。

=================================================================
==53615==ERROR: AddressSanitizer: SEGV on unknown address 0x000000000097 (pc 0x0001087a2c5f bp 0x7ffee745d990 sp 0x7ffee745d880 T0)
==53615==The signal is caused by a READ memory access.
==53615==Hint: address points to the zero page.
    #0 0x1087a2c5e in main main.c:10
    #1 0x7fff796e33d4 in start (libdyld.dylib:x86_64+0x163d4)

==53615==Register values:
rax = 0x00007ffee745d8c0  rbx = 0x000000000000004f  rcx = 0x4f4d204f4c4c4500  rdx = 0x00001fffdce8bb10  
rdi = 0x00000001087a2e60  rsi = 0x00007ffee745d8aa  rbp = 0x00007ffee745d990  rsp = 0x00007ffee745d880  
 r8 = 0x00001fffdce8bb10   r9 = 0x00000001087a2e20  r10 = 0x0000000117f89c30  r11 = 0x00007ffddecbaa80  
r12 = 0x0000000000000000  r13 = 0x0000000000000000  r14 = 0x0000000000000000  r15 = 0x0000000000000000  
AddressSanitizer can not provide additional info.
SUMMARY: AddressSanitizer: SEGV main.c:10 in main

段错误似乎发生在我调用 ft_strcpy 之后,在第一次 printf 调用中。当我使用 rcx 寄存器而不是 rbx 寄存器时(在我的汇编代码中),这个程序可以工作。我查看了 rcx 和 rbx 之间的区别(Caller-saved vs Callee-saved),但我不明白为什么会导致这个问题。我错过了什么?

随意指出任何不好的做法,我在这里接受任何建议!

谢谢阅读。

标签: assemblyx86-64cpu-registerscalling-conventionabi

解决方案


随意指出任何不好的做法,我在这里接受任何建议!

复制循环一次加载和存储 8 个字节,但以 1 个字节为增量步进。


推荐阅读