Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我的C函数的汇编代码_C_Assembly_X86 64 - Fatal编程技术网

我的C函数的汇编代码

我的C函数的汇编代码,c,assembly,x86-64,C,Assembly,X86 64,这是我的C函数: int reg(struct my_callback_struct *p, int data) { return p->data = data; } p->callback_func(p,12); 这在装配中是相同的: 0x000000000040057d <+0>: push %rbp 0x000000000040057e <+1>: mov %rsp,%rbp 0x0000000000400581 <+4&g

这是我的C函数:

int reg(struct my_callback_struct *p, int data)
{
   return p->data = data;
}
p->callback_func(p,12);
这在装配中是相同的:

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
我不明白的是:

0x0000000000400591 <+20>: mov -0x8(%rbp),%rax
0x0000000000400591:mov-0x8(%rbp),%rax

因为在
上,我们已经用指针地址填充了
$rax
。为什么要加载它两次?

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

通过启用某种级别的编译器优化,可以很容易地纠正这一问题。不管使用哪种编译器,第一级可能都会清除冗余负载


请注意,极端级别的优化可能会导致很难遵循正确的代码。

通常的原因是人们忘记打开优化,因此编译器生成的代码效率低下。您应该确定这是哪一种汇编程序子种类。看起来它可能是针对英特尔x86_64系列芯片的,但也可以这么说。不同的汇编器也使用不同的符号-识别您正在使用的汇编器/编译器以及您正在使用它的平台也可能是相关的。gcc(Ubuntu 4.8.2-19ubuntu1)4.8.2;x86_64使用
gcc-O-fverbose asm-S编译好了,如果这是原因,现在我明白了;-)