gpt4 book ai didi

c - x86 程序集中的结构分配

转载 作者:太空狗 更新时间:2023-10-29 14:56:09 25 4
gpt4 key购买 nike

所以我正在尝试编写一些 x86 来为结构分配内存。我的 C 代码看起来像这样......

   struc *uno = malloc(sizeof(struc));
uno->first = 0;
uno->second = 0;
uno->third = 0;

//And the struct
struct struc {
int first;
int second;
int *third;
}

反汇编看起来像...

    pushl   %ebp
movl %esp, %ebp
subl $40, %esp
movl $12, (%esp)
call malloc
movl %eax, -12(%ebp)
movl -12(%ebp), %eax
movl $0, (%eax)
movl -12(%ebp), %eax
movl $0, 4(%eax)
movl -12(%ebp), %eax
movl $0, 8(%eax)
movl $0, %eax

所以我有几个问题...

1) 结构的大小是 16,但为什么程序集只显示它分配了 12?

2)

的含义是什么
    movl    %eax, -12(%ebp)
movl -12(%ebp), %eax

不就是把eax的内容放到ebp-12的地址中,那第二条就多余了吗?

3) 当没有其他局部变量或参数要压入堆栈时,为什么 esp 递减 40?我原以为它只需要减 16。

感谢任何帮助,以及我可能遗漏的任何您认为相关的内容。我对组装很陌生。谢谢。

最佳答案

该结构的大小为 12。两个整数和指针在 x86 上都是 4 个字节,因此没有填充,并且该结构的大小为 12。您始终可以使用 sizeof 询问编译器> 如果您不确定类型的大小。


你在编译时没有优化,所以代码看起来有点低效。

movl    $12, (%esp)
call malloc
movl %eax, -12(%ebp)

这会调用 malloc,然后将 %eax 中返回的值保存到局部变量 uno,存储在 -12(%ebp)。所以,这三个指令组成了对malloc的调用:准备栈,调用函数,保存返回值。

我们继续下一行。

uno->first = 0;

因为没有优化,编译器没有意识到 %eax 已经包含了 uno 的值,所以它再次加载它,然后将零写入第一个成员

movl    -12(%ebp), %eax
movl $0, (%eax)

接下来是

uno->second = 0;

我们再次将 uno 的值加载到 %eax 中,并写入一个零,这次是在偏移量 4 处的第二个成员中

movl    -12(%ebp), %eax
movl $0, 4(%eax)

你明白了,我相信我不需要解释最终的作业。

尝试使用优化进行编译,输出看起来会大不相同。编译器应该能够将 uno 优化为 %eax 而根本不将其放入堆栈。它可以产生这段代码:

movl    $12, (%esp)
call malloc
movl $0, (%eax)
movl $0, 4(%eax)
movl $0, 8(%eax)

我不太确定为什么您认为堆栈保留应该是 16 个字节。在上面的优化变体中,我只看到需要 4 个字节,即传递给 malloc 的参数。如果没有优化,我猜它是 8,参数是 4,局部变量是 4。但我不知道为什么该函数为堆栈保留 40 个字节。也许可以在以下问题之一中找到答案:

最后,查看优化代码可能会提高您的工作效率。如果不进行优化,编译器可能会做出许多看起来很奇怪的决定。优化后的代码将更加简洁,从长远来看,您实际执行的代码可能会得到优化。

关于c - x86 程序集中的结构分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25692565/

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