You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

x86_64汇编实现my_memcpy函数异常,请求技术排查

问题分析与解决

首先明确核心事实:你的汇编代码逻辑本身是正确的(除了缺少标准返回值设置),测试失败和"dest为空"的现象本质是测试用例逻辑错误+对memcpy返回值的误解。

1. 关于mov rax, rdi的作用

标准memcpy的定义是复制完成后返回目标地址dest,而x86_64 System V调用约定中,函数返回值存在rax寄存器里。你原本注释掉mov rax, rdi时,函数返回的是rax的原有随机值——巧合的是在你的测试场景里,这个值刚好等于src的地址(rsi寄存器),所以测试用例检查返回值指向的内容是"abcde",就误以为测试通过了。

当你加上mov rax, rdi后,函数开始正确返回dest的地址,这直接暴露了测试用例的错误:你的测试逻辑大概率是把「返回指针指向的内容等于src」当成了成功条件,而不是去检查「dest缓冲区的内容是否被正确复制」以及「返回指针等于dest」。

2. 为什么会出现"dest为空"的现象

如果确定移除mov rax, rdi时测试"正常"但dest实际为空,只有两种可能:

  • dest指向只读内存:比如你把dest设成了字符串字面量(char *dest = "00000";),这类内存属于只读段,写入操作会静默失败(部分环境不会触发崩溃),导致dest内容不变;
  • 参数传递顺序错误:测试时可能把src和dest的位置传反了,此时复制操作把dest的内容写到了src里,而你检查返回的src地址自然是"abcde",但实际目标dest根本没被修改。

结论

  • mov rax, rdi是正确的代码,符合memcpy的标准行为;
  • 测试失败是因为你的测试用例逻辑完全错误,它混淆了memcpy返回值的意义;
  • "dest为空"和mov rax, rdi无关,是测试时内存权限或参数传递的问题。

内容的提问来源于stack exchange,提问作者mackenzie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 04:47:23