今天,在拆解我之前构建的一些二进制文件时(clang x86_64),我遇到了一些看似无用的东西。
_baz: ## @baz
.cfi_startproc
## BB#0:
pushq %rax ; What?
Ltmp7:
.cfi_def_cfa_offset 16
leaq (%rsp), %rax
movq %rsi, (%rax)
xorl %edx, %edx
movq %rax, %rsi
callq _something
movq %rax, %rdi
callq _something_else
movl (%rax), %eax
popq %rcx ; What?
retq
.cfi_endproc
我看到rax
正在保存,之后又恢复为rcx
,我没有看到这样做的重点,因为rax
是一个临时注册(它不是& #39;似乎需要保存在这里)和rcx
(另一个临时寄存器,也适用于第四个寄存器传递的arg)似乎从未在这里使用过。