繁体   English   中英

我的C函数的汇编代码

[英]assembler code of my C function

这是我的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 为什么加载两次?

实际上,代码是正确的,因为指令执行C代码所要求的功能。 但即使是最微不足道的优化也没有被执行过。

通过启用某种级别的编译器优化可以轻松纠正这一问题。 无论使用哪种编译器,第一级都可能会清除冗余负载。

需要注意的是优化的极端水平可能会导致正确的代码,这是非常难走。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM