cpu的函数调用
cpu执行过程, 比如我们一个最简单的一个说法,打开一个QQ或者微信,当我点击这个应用的时候,cpu会通知磁盘让他把指令,载入内存中,这个内存的所占用的地方是操作系统分配的.
寄存器
Cpu内部临时的数据存储空间
怎么让一个应用运行起来?(指令操作)
- 把数据从内存加载到cpu的寄存器
- 对寄存器的数据进行运算
- 运算完或者得到的结果在写入内存
如果遇到写入内存怎么办?
寄存器ebp的值压到栈里面
但是我们每一个函数调用都创建一个帧
什么是帧?
帧就是我们内存空间一段连续的空间
如: xa-s2F1(函数帧1), xa-s2F2(函数帧2),, xa-s2F3(函数帧2),, xa-s2F4(函数帧4)
还有帧在内存排序是有规律的,他们是排到序,地址从大到小排
什么是栈?
栈就像一条管道,用来装帧的,但是有个规矩就是,从上往下生长,有点想mq(消息队列),那个先进先后出
image.png什么是ebp?
edp是一个特殊的寄存器,会一直指向当前函数在一个栈的开始位置(地址),刚刚我们说的,栈是一连续,就像我们数组一样一直key等于0.
当然特殊我们还有一个特殊的寄存器,叫esp
esp的作用,他会随着我们cpu运行指令的时候,会指向函数帧的最后一个地址
在说一下ebp和esp的关系吧,
ebp就像一个数组的开头,esp就像一个数组的结尾,很显然我们中间有个区间,这个区间主要用来运算
-
把寄存器ebp的值压到栈里去
-
把esp的值赋给ebp
如:
- 把esp的值赋给ebp
压值到栈前:
image.png压值到栈后:
image.png
注: 我们每次都是操作都是4个字节,原来esp的地方走上804,现在变成800
内存有一条这样的指令,把esp的值减去24
800-24 = 776 单位(esp)
image.png在这里我们调用了add这个函数,现在需要做的就是,把add这个函数返回值的地址压到栈里面去.
image.png解释:
- 每次操作4个字节所有每次减4
- 这个区间在运算
- 100,就是我们add函数的return值的地址
- esp会指向722,esp会赋给ebp
- 寄存器ebp的值压到栈里去
- 把esp的值赋给ebp
- 把寄存器ebx的值压入栈
把esp 指向的数据弹出的ebx寄存器
把esp 指向的数据弹出到ebp寄存器
(1)把参数和返回地址准备好,
(2)然后大家都遵循约定, 每次新函数都要建立新的函数帧:
"把寄存器ebp的值压到栈里去“
"把esp的值赋给ebp"
(3) 函数调用完了, 重置 ebp 和esp ,让他们重新指向调用着的栈帧。
学习总结:码农翻身
网友评论