所以,假设我有以下代码,它给出了我认为是不必要的值副本的三个示例。
mov    QWORD PTR [rbp-0x18],rdi
mov    rdx,QWORD PTR [rbp-0x18]
lea    rax,[rbp-0x10]
mov    rsi,rdx
mov    rdi,rax
call   4003e0 <strcpy@plt>
为什么将 中的值rdi复制到内存中rbp-0x18,然后再复制回rdx?然后将其复制到rsi(2 个额外副本)。
最后,为什么lea + movfor rbp-0x10to rax, then to rdi?是否有任何原因未生成以下代码?
mov    rsi,rdi
lea    rdi,[rbp-0x10]
call   4003e0 <strcpy@plt>
(我的猜测是这只是编译器中代码生成的一个工件,但我确保没有我遗漏的 x86-64 的一些规则。)