C++ ::编译

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次数。

posted @ 2019-09-07 16:50  acewzj  阅读(184)  评论(0编辑  收藏  举报