int functt(int num) {
num++;
return num;
}
int main() {
int ttt;
ttt = functt(3);
return 0;
}
??一旦进入call,先将EBP压栈,因为接下来将把EBP移动到ESP位置,为什么要这么做?
call指令实际动作是push eip;mov eip,4111D6h连续两条指令.
ret指令实际动作是pop eip
我们总结一下:每次调用别的函数时,先将EIP指针入栈--然后将EBP入栈
case CAL:
stack[top]=ip;
stack[top+1]=base;
base=top;
break;
This is an reference-style link
??为什么要将ESP往下移动192(0C0 Hex)个字节?
--他们说是为该函数留出临时存储区!192Bytes存储int数据(4Bytes)也只不过是48个int。当我们试图去分配一个50个元素的局部变量时看看会发生什么?
int functt(int num) {
int aaa[50] = { 0 };
num++;
return num;
}
ESP往低地址移动了190H=400Bytes,看来就是多留出一块局部变量的存储区域出来。
从lea指令到rep这条指令作用就是把为局部变量分配的内存空间填充CC数据。Stos将eax中数据放入es:[edi]中,同时edi增加4个字节。Rep使指令重复执行ecx次数。