<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } -->
call:函数的调用
ret:函数的返回
函数在调用时要做两件事:
1、将函数的返回地址保存
2、跳转到函数代码的位置处执行
函数在返回时要做两件事:
1、取出返回地址
2、跳转
函数的栈帧
每一个函数调用都需要在系统栈中划分出一块区域,这个区域存储函数内部的变量(局部变量)和临时值。当函数调用结束后,这块内存失效,系统可以将其作为栈帧再次分给其它的函数调用。这块系统栈中的内存区域叫做函数的栈帧。
临时值:
int c;
c=add(1,2);
t1=add(1,2);
c=t1;
push等价于:
sub 0x4, %esp
mov 寄存器, (%esp)
pop等价于:
mov (%esp), 寄存器
add $0x4, %esp
call等价于:
push %eip
mov 地址, %eip
ret等价于:
pop %eip
leave等价于:
mov %ebp, %esp
pop %ebp
.text(代码段):存储二进制机器指令
.data(数据段):存储全局数据——全局变量和静态变量
.rodata(只读数据段):存储复杂常量——大型浮点数、字符串
普通常量存储于代码段中。
.bss:存储未初始化的全局数据
该段的大小确定,但是由于其中数据的值未确定所以不保存到外存上,只有程序运行时其数据全部初始化位0。