gpt4 book ai didi

c - 我的 C 函数的汇编代码

转载 作者:太空狗 更新时间:2023-10-29 15:38:26 26 4
gpt4 key购买 nike

这是我的 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 代码调用的功能。但即使是最微不足道的优化也没有执行。

这很容易通过打开某种级别的编译器优化来纠正。可能无论使用哪种编译器,第一级都会清除冗余负载。

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

关于c - 我的 C 函数的汇编代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26205191/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com