- 论坛徽章:
- 0
|
我写了一个函数用来理解函数调用栈帧的变化
有几个地方不理解,请大家帮忙分析下:
例子如下
#include<stdio.h>
static void swap(int *a,int *b);
int main(int argc,char *argv[])
{
int a,b;
a = 16;
b = 8;
swap( &a, &b);
printf("a=%d,b=%d\n",a,b);
return (a - b);
}
static void swap(int *a,int *b)
{
int c;
c = *a;
*a = *b;
*b = c;
}
生成的AT&T汇编
如下(部分)
main:
.LFB0:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
andl $-16, %esp
subl $32, %esp
movl $16, 24(%esp)
movl $8, 28(%esp)
leal 28(%esp), %eax
movl %eax, 4(%esp)
leal 24(%esp), %eax
movl %eax, (%esp)
call swap
movl 24(%esp), %edx
movl 28(%esp), %eax
movl %edx, %ecx
subl %eax, %ecx
movl %ecx, %eax
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
这里让我迷糊的是
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
andl $-16, %esp
subl $32, %esp
第一,main函数被操作系统C库函数调用的时候将帧指针压入栈中,那么此时的esp(栈指针)指向的是这里的ebp(对于main函数来说)么,
第二,为什么要将esp andl -16,他的作用是什么啊。
第三,为什么要将esp -32,这个32 是不是太大了,我的main函数好像只有两个临时变量要用到栈。
这里我有个猜测,andl -16,%esp是不是为了保存main函数的参数地址和环境变量地址啊?
|
|