2018年4月12日星期四
函数调用规则
函数调用过程:可在vc上逐步调试查看寄存器,内存的变化情况
1.一些寄存器的用法
// ebp eip esi
// push pop(影响esp的值)
eip(1.放的是当前执行代码(当前指令)的地址
2.call,ret(从当前函数返回),这俩指令将会影响eip的值
break,// 可翻译为jmp(无条件跳转))
jne
栈帧(大小:1M):ebp(栈帧地址),esp(入参做准备)(相当于栈指针)有关
//text
Data
Heap
Stack
2. 【z = fun(x,y): move eax,[ebp-8h] push eax】eax(累加器)
(push指令esp的值,同时将eax的值压入指定位置(压入内存))
Lea :取偏移地址
3.call指令(只要函数被调动,一定会分配一个新的栈帧,包括递归)(esp,eip)
Esp-4,把后续地址入栈
4.深刻理解栈帧:
问题一:不同编译器,栈帧撤销后,申请新的栈帧残留值可能还在,可能初始化清理了
问题二:
5.int fun(int a,…)(不定参数问题)(函数返回值借用cpu通用寄存器(本身就具有长性)作为作为桥梁传值,不允许改变通用寄存器里的值(高级语言里))
?为什么不能给表达式赋值
答:因为表达式的值存放在通用寄存器里,本身就具有长性,其值不可被改变
6.栈平衡(由调用者完成)
(作业:查找:__stdcall)