gpt4 book ai didi

c - 实现 memset : dl register segfault

转载 作者:太空宇宙 更新时间:2023-11-04 01:59:27 25 4
gpt4 key购买 nike

我正在使用 NASM 在 x86-64 汇编代码中实现 memset。当我尝试将值从 rsi 移动到 dl 时,出现段错误。你能帮我理解为什么吗?

这是我目前所拥有的:

    global my_memset

my_memset:

push rbp
mov rbp, rsp

xor rax, rax
xor rcx, rcx
mov dl, byte [rsi] ;segfault
mov rax, rdi
cmp rdx, 0
jz end
while:
inc rcx
mov byte [rdi], dl
inc rdi
cmp rcx, rdx
jne while
end:
mov rsp, rbp
pop rbp

ret

我用一个非常简单的 main 函数来练习这个:

void    *my_memset(void *data, int value, int size);
int main()
{
char buffer[100];

my_memset(buffer, 'm', 100);
printf("%s\n", buffer);
}

请注意,我尝试用汇编代码实现的 main 进行替代测试,似乎运行正常。为什么会这样? (如果您也希望我发布该代码,请告诉我。)

最佳答案

esi 保存第二个参数,这是用来填充内存区域的值。 (所以在你的测试中,rsi 持有'm',或者更确切地说它的 ASCII 代码)

在本说明中:

mov dl, byte [rsi]

您尝试将其用作内存地址,因此您访问了地址为“m”的ASCII 代码的内存位置。这会导致段错误。

你想要的是直接使用rsi,例如:

mov rdx, rsi

此外,您当前的代码使用 rdx 来做两件事 - 计数和要填充的字节。那是行不通的——它只有一个寄存器,而且只保存一个值。 (请注意,dl 表示“rdx 的最低字节”——它不是单独的寄存器)

关于c - 实现 memset : dl register segfault,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29187897/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com