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
相关产品推荐
相关产品推荐

