gpt4 book ai didi

c - 将指针作为局部变量的函数的汇编指令

转载 作者:行者123 更新时间:2023-12-01 14:19:01 24 4
gpt4 key购买 nike

我想了解如何为 c 生成程序集。我写了一个示例程序并对其进行了反汇编。

int main()
{
int a = 100;
}

程序集生成:

pushq   %rbp     #
movq %rsp, %rbp #,
subq $48, %rsp #,
call __main #
movl $100, -4(%rbp) #, a
leave
ret

这对我来说非常简单。但是当我在其中包含一个指针时,我不理解程序集。

C 程序:

int main()
{
int a = 100;
int *p = &a;
}

程序集生成:

pushq   %rbp     #
movq %rsp, %rbp #,
subq $48, %rsp #,
call __main #
movl $100, -12(%rbp) #, a
leaq -12(%rbp), %rax #, tmp59
movq %rax, -8(%rbp) # tmp59, p
leave
ret

我不明白为什么局部变量 a 现在被推到堆栈中与之前没有指针的片段相比的不同偏移量。

问题 #2:如果我有 4 个局部变量,我的堆栈帧是 subq $48,%rsp,但是如果我将其中一个局部变量转换为指针,它是 subq $64。为什么会这样。

C 代码:

int main()
{
int a = 100;
int *p = &a;
int b = 10;
int c = 20;
}

程序集:

pushq   %rbp     #
movq %rsp, %rbp #,
subq $64, %rsp #,
call __main #
movl $100, -20(%rbp) #, a
leaq -20(%rbp), %rax #, tmp59
movq %rax, -8(%rbp) # tmp59, p
movl $10, -12(%rbp) #, b
movl $20, -16(%rbp) #, c
leave
ret

如果你们能解释为什么没有局部变量的主函数的堆栈帧是 2 * 16 字节对齐(32 字节),这也会很有帮助。猜想应该是为了一些簿记练习,但具体原因是什么?

谢谢,

最佳答案

编译器不会简单地将代码逐行从 c 语言转换为汇编语言。优化编译器将对代码进行大量分析,尝试执行诸如删除永远不会执行的代码、优化循环性能以及优化堆栈/内存使用等操作。当编译器决定在哪里分配内存和存储变量时,它知道 a 和 p,并将它们放在它认为最好的地方。

关于c - 将指针作为局部变量的函数的汇编指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16266248/

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