这是我的C函数:
int reg(struct my_callback_struct *p, int data)
{
return p->data = data;
}
汇编中的情况相同:
0x000000000040057d <+0>: push %rbp
0x000000000040057e <+1>: mov %rsp,%rbp
0x0000000000400581 <+4>: mov %rdi,-0x8(%rbp)
0x0000000000400585 <+8>: mov %esi,-0xc(%rbp)
0x0000000000400588 <+11>: mov -0x8(%rbp),%rax
0x000000000040058c <+15>: mov -0xc(%rbp),%edx
0x000000000040058f <+18>: mov %edx,(%rax)
0x0000000000400591 <+20>: mov -0x8(%rbp),%rax
0x0000000000400595 <+24>: mov (%rax),%eax
0x0000000000400597 <+26>: pop %rbp
0x0000000000400598 <+27>: retq
我想我明白发生了什么。 $rdi
保存指针(地址),$esi
保存数字12。
这就是我调用函数的方法:
p->callback_func(p,12);
我不明白的是:
0x0000000000400591 <+20>: mov -0x8(%rbp),%rax
因为在<+11>
我们已经使用指针地址填充了$rax
。为什么要加载两次?
答案 0 :(得分:2)
实际上,代码是正确的,因为指令执行C代码所要求的功能。但即使是最微不足道的优化也没有完成。
通过启用某种级别的编译器优化可以轻松纠正这一问题。无论使用哪种编译器,第一级都可能会清理冗余负载。
请注意,极端优化级别可能会导致代码非常难以理解。