我试图了解如何为 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 字节),那也会很有帮助。猜猜这应该是为了做一些簿记练习,但确切的原因是什么?
谢谢,