assembly - 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),但我不明白为什么会导致这个问题。我错过了什么?
随意指出任何不好的做法,我在这里接受任何建议!
谢谢阅读。
解决方案
随意指出任何不好的做法,我在这里接受任何建议!
复制循环一次加载和存储 8 个字节,但以 1 个字节为增量步进。
推荐阅读
- postgresql - 使用 BETWEEN 内部连接时未使用 Postgres 索引
- python - 如何修复执行器运行失败 [/bin/sh -c pip install --upgrade --force-reinstall pip==9.0.3 && pip install --upgrade 'setuptools<45']:
- node.js - 如何独立于系统区域设置解析系统目录路径?
- java - Percolator 上的 Spring 数据弹性搜索批量索引
- python - 拆分 JSON python 字符串以传递给函数
- amazon-s3 - How to Use Requests With Presigned URL Passed to Lambda Function
- reactjs - How to perform XHR request in customBodyRender MUI-datatable
- javascript - Algolia Search without the UI
- mysql - Error during MySQL Installation ("Initializing database" Failure)
- plot - 如何创建用于显示 Ct 扫描 Makie.jl 的 julia 配色方案