C++ ::编译

int functt(int num) {
    num++;
    return num;
}
int main() {
    int ttt;
    ttt = functt(3);
    return 0;
}

JN12OYCeoGm4UXg.png

??一旦进入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;
}

3sbBi7eHh8Q4YlM.png

ESP往低地址移动了190H=400Bytes,看来就是多留出一块局部变量的存储区域出来。

从lea指令到rep这条指令作用就是把为局部变量分配的内存空间填充CC数据。Stos将eax中数据放入es:[edi]中,同时edi增加4个字节。Rep使指令重复执行ecx次数。

转载于:https://www.cnblogs.com/acewzj/p/11481718.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值