A、桟帧 stack frame
1、要先保护现场
2、将参数按照调用约定,存放在被运行桟帧上, 这样, 这个桟帧的帧顶指针就会发生改变
3、若有必要,调用函数会配置一个帧指针,保存调用方希望保持不变的内容(寄存器值)
4、被调用函数为它可能需要的任何局部变分配空间,需要桟帧栈顶向上(-操作)开辟
5、被调用函数返回值存放在eax寄存器中,或者存放在可以立即被调用到的地方
6、一旦函数完成其他操作,任何局部变量都释放了
7、调用地方,如果重新获得控制权,删除在桟开辟的空间(+操作)
B、调用约定
C语言调用约定: _cdecl(参数从右想做依次入栈),清理方式,调用者清理
参数入栈原因:对于参数是可变化的,比如函数:printf(“xxxx”), 调用者肯定知道传入被调用者 printf函数的参数,但是,对于函数printf函数本身是不知道调用者传入的参具体是什么。
比如:函数
void demo(int x, int y, int z)
参数