所以,假设我有以下代码,它给出了我认为是不必要的值副本的三个示例。
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 + mov
for rbp-0x10
to rax
, then to rdi
?是否有任何原因未生成以下代码?
mov rsi,rdi
lea rdi,[rbp-0x10]
call 4003e0 <strcpy@plt>
(我的猜测是这只是编译器中代码生成的一个工件,但我确保没有我遗漏的 x86-64 的一些规则。)