天天看点

函数栈帧的创建和销毁一、对于esp与ebp寄存器的说明二、对于创建和销毁的全过程

(文章目录)

一、对于esp与ebp寄存器的说明

ebp esp两个寄存器 存放的是地址

使用地址维护函数栈帧

函数栈帧的创建和销毁一、对于esp与ebp寄存器的说明二、对于创建和销毁的全过程

二、对于创建和销毁的全过程

1.对于_mainCRTstarup的函数的创建

函数栈帧的创建和销毁一、对于esp与ebp寄存器的说明二、对于创建和销毁的全过程

注意事项:

压栈 (push):给栈顶放一个元素

出栈(pop):在栈顶删除一个元素

栈空间的地址使用为先使用高地址,在使用低地址

  1. push 压栈操作 将ebp压入栈中

    同时 esp指向, ebp往上地址变小, 所以 esp的地址变小了

函数栈帧的创建和销毁一、对于esp与ebp寄存器的说明二、对于创建和销毁的全过程
  1. mov: 将esp的值给ebp

    两者指向同一个位置

    函数栈帧的创建和销毁一、对于esp与ebp寄存器的说明二、对于创建和销毁的全过程
  1. sub (减 )

    将esp减去0E4h(八进制)

    (1)

    函数栈帧的创建和销毁一、对于esp与ebp寄存器的说明二、对于创建和销毁的全过程
    (2)esp由于地址变小 向上去 而esp 与ebp两者围成的空间正好是main函数的栈帧
    函数栈帧的创建和销毁一、对于esp与ebp寄存器的说明二、对于创建和销毁的全过程
  1. push 在main函数栈顶压入 ebx esi edi

    随着压入数据 esp也随之指向数据 即esp向上移

    函数栈帧的创建和销毁一、对于esp与ebp寄存器的说明二、对于创建和销毁的全过程

2.对于main函数的创建

函数栈帧的创建和销毁一、对于esp与ebp寄存器的说明二、对于创建和销毁的全过程

lea 代表load effective address 加载有效地址

将ebp-0E4h放在 edi中

dowrd充当4个字节

从edi位置开始的 ecx(存放39h次) 的dword数据全部改成0xCCCCCCCCh一直到ebp结束

函数栈帧的创建和销毁一、对于esp与ebp寄存器的说明二、对于创建和销毁的全过程

(1).为什么有时候会打印出烫烫烫

函数栈帧的创建和销毁一、对于esp与ebp寄存器的说明二、对于创建和销毁的全过程

0Ah代表10

把0Ah放到ebp-8的数据中

因为都是地址 所以ebp-8为在ebp地址减去8个字节

如果a中没有被赋值 则放入为0xCCCCCCCCh

所以有时候打印结果为烫烫烫烫烫烫

14h以十六进制打印 代表20 即ebp-20

ebp-20h代表ebp-32

函数栈帧的创建和销毁一、对于esp与ebp寄存器的说明二、对于创建和销毁的全过程
函数栈帧的创建和销毁一、对于esp与ebp寄存器的说明二、对于创建和销毁的全过程
函数栈帧的创建和销毁一、对于esp与ebp寄存器的说明二、对于创建和销毁的全过程

ebp-20 为b的值 即20

把ebp-14h(ebp-20)传入eax中

push eax 将eax压栈

同时esp指向eax

2.

函数栈帧的创建和销毁一、对于esp与ebp寄存器的说明二、对于创建和销毁的全过程

将ebp-8传入ecx中

同时将ecx 压栈

此时ebp-8存放的是a 值为10

esp指向ecx

3.

函数栈帧的创建和销毁一、对于esp与ebp寄存器的说明二、对于创建和销毁的全过程

调用一个函数

将下一条指令的地址压栈

同时esp指向call下一条指令的地址

函数栈帧的创建和销毁一、对于esp与ebp寄存器的说明二、对于创建和销毁的全过程

3.对于Add的函数的创建

函数栈帧的创建和销毁一、对于esp与ebp寄存器的说明二、对于创建和销毁的全过程
函数栈帧的创建和销毁一、对于esp与ebp寄存器的说明二、对于创建和销毁的全过程

将ebp压栈 esp指向ebp 这里是主函数里的ebp

.将esp赋值给ebp,ebp与esp都指向ebp

函数栈帧的创建和销毁一、对于esp与ebp寄存器的说明二、对于创建和销毁的全过程
2.
函数栈帧的创建和销毁一、对于esp与ebp寄存器的说明二、对于创建和销毁的全过程

sub: 将esp减去0CCh

因为地址小的在上

push 压栈 ebx esi edi

3.

函数栈帧的创建和销毁一、对于esp与ebp寄存器的说明二、对于创建和销毁的全过程
从edi位置开始 进行ecx(33h十六进制)次dword数据 全部转化成0CCCCCCCCh
函数栈帧的创建和销毁一、对于esp与ebp寄存器的说明二、对于创建和销毁的全过程
4.
函数栈帧的创建和销毁一、对于esp与ebp寄存器的说明二、对于创建和销毁的全过程
把0放在ebp-8的位置上
函数栈帧的创建和销毁一、对于esp与ebp寄存器的说明二、对于创建和销毁的全过程

(2).为什么说形参不在函数中

函数栈帧的创建和销毁一、对于esp与ebp寄存器的说明二、对于创建和销毁的全过程
函数栈帧的创建和销毁一、对于esp与ebp寄存器的说明二、对于创建和销毁的全过程

(3).函数中return值如何放回的

>
           
函数栈帧的创建和销毁一、对于esp与ebp寄存器的说明二、对于创建和销毁的全过程
函数栈帧的创建和销毁一、对于esp与ebp寄存器的说明二、对于创建和销毁的全过程
1.
函数栈帧的创建和销毁一、对于esp与ebp寄存器的说明二、对于创建和销毁的全过程
出栈 此时esp地址变大 向下移
函数栈帧的创建和销毁一、对于esp与ebp寄存器的说明二、对于创建和销毁的全过程
函数栈帧的创建和销毁一、对于esp与ebp寄存器的说明二、对于创建和销毁的全过程
mov 把ebp赋值给esp
函数栈帧的创建和销毁一、对于esp与ebp寄存器的说明二、对于创建和销毁的全过程

(4).ebp-main出栈后ebp寄存器的指向情况

函数栈帧的创建和销毁一、对于esp与ebp寄存器的说明二、对于创建和销毁的全过程
函数栈帧的创建和销毁一、对于esp与ebp寄存器的说明二、对于创建和销毁的全过程

(5).形参a,b如何返回操作系统

函数栈帧的创建和销毁一、对于esp与ebp寄存器的说明二、对于创建和销毁的全过程
返回ret是返回到 call下一条指令的地址
函数栈帧的创建和销毁一、对于esp与ebp寄存器的说明二、对于创建和销毁的全过程

这里随着add函数的销毁 esp也从下一条指令的地址位置弹出到下一个位置

将原来esp所指的地址加8 即现在的位置

就会将形参 a b 还给操作系统

4.整体过程图解