作者LPH66 (J∪$т М㎝iκä)
看板CSSE
标题Re: [系统] 想问一个 stack 和 function 的问题
时间Wed Aug 29 21:52:25 2018
※ 引述《gn00618777 (非常念旧)》之铭言:
: 首先,我为我天资驽钝感到抱歉,翻了google 好几页,我仍然看不懂。
: stack 从上往下长 (高位址 -> 低位址)
: step1 caller 会将 callee 的 parameters 推入 stack
: step2 caller 将 callee 的 return address 推入 stack
: step3 ..
: 问题1: ESP 指向 stack top,所以 pop 时,会先从 local variable 拿出并归还空间。
: 那拿出 return address 要干嘛? 直接返回了吗? 那这样一开始放的 parameters
: 不就没处理到?
所以需要有人来处理
以你在找的 x86 来说, 常见的做法是呼叫方处理 (关键字: cdecl)
你有办法看到函数呼叫的组语时的话会看到在 call 之後会有一条 ADD ESP, xx
那就是在处理掉参数的部份, 直接把 ESP 往高位址加就等於丢掉中间这一块的范围
不过因为这个算是函数呼叫的约定 (关键字: calling convension / 呼叫惯例)
所以只要有约定好, 那也是能够让被呼叫方在回去时顺便处理的
(就是弹出一个值, 跳过去, 顺便帮忙弹出 N 个值)
只是这个在 C 语言里相对没有上面那种那麽常见而已 (关键字: stdcall)
: 问题2: EBP呢? EBP定义是指向目前的 frame
: 会怎样运作? 我知道 ESP 每次 pop,他就会 ESP = ESP - 4,那 EBP 呢?
: 高位址
: +--------------------+
: + parameters +
: +--------------------+
: + return address +
: +--------------------+
: EBP -> + previous frame + ------
: +--------------------+ |
: ESP -> + local variable + |
: +--------------------+ |
: + parameters + |
: +--------------------+ |
: + return address + |
: +--------------------+ |
: + previous frame + <-----
: +--------------------+
: + local variable +
: +--------------------+
: 低位址
: 谢谢。
这里你要先搞懂 frame 的意思是什麽以及它的范围
由於我们无法确定函数进来的时候的堆叠状况
唯一能够在堆叠里定位的指标是进来当下的 ESP 值
(参数在它後面, 区域变数在它前面)
因此进一个函数时第一个动作就是 MOV EBP, ESP (写成 C 就是 EBP = ESP)
把这个定位点留在 EBP 里面, 之後要存取参数或区域变数就能用 EBP 为基准去找
所谓的 frame 就是从这个 EBP 定位点往前往後抓到的范围
不过问题来了, 进来之前前面那个函数的 EBP 要怎麽办?
函数结束时他的 EBP 要帮他还原, 不然他之後的动作就会爆炸
因此其实 MOV EBP, ESP 会是第二个动作, 第一个动作是要先把前面函数的 EBP 收好
那最简单的收法就是推进堆叠, 它会存放在呼叫进来时的回传位址的下一格
然後就可以把自己的定位点留起来了
(所以你上面那张图其实画反了, 低位址是後来的函数, 右边的箭头应该要反过来指才对)
因此你的问题, EBP 就是「定位 frame 位置的定位点」
推进堆叠的 EBP (你的 "previous frame") 其实是「上一个函数的定位点」的意思
(BP 这个名字是 base pointer 的简写, 由此也能看出它做为定位点的功能
不过除了这个名字之外, 它并没有跟其他指令进行隐式联系
不像 SP 会跟着推进或弹出堆叠的动作调整)
刚才提到函数结束时要帮忙还原 EBP, 所以这里会在清掉区域变数之後
把留下来的值弹出堆叠回到 EBP 里
而再下一个值就是 return address 了, 所以这里就会把它弹出来把流程转回上一个函数
这样在回去之後上一个函数的 EBP 还是保持的好好的
最後, 你可以仔细想想上面这样讲的操作, 新旧 EBP / ESP 的值之间的关系是什麽
这样就能够理解为什麽我会说你这图右边的箭头画反了
--
◢ ˊ_▂▃▄▂_ˋ. ◣ ▅▅ ▅▅ ι●╮ █
▄▄▄▄▄
▍
./◤_▂▃▄▂_◥ \'▊ HARUHI █████ <■┘ ▄▄▄▄▄▄▄
▎
⊿ ◤◤◥█◥◥█Δ ISM By-gamejye ¢|\ ▌▌▌▌▌▄▌▌
▏
ζ(▏●‵◥′●▊)Ψ ▏ █
⊿Δ ▄▄▄ ▄▄▄▄
█/|▊ 〃 、 〃▋ |\ ▎ ハルヒ主义 █
▄▄▄█▄▄
◥◥|◣ ‵′ ◢/'◢◢
S.O.S 世界を大いに盛り上げるための凉宫ハルヒの団
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 123.195.192.32
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/CSSE/M.1535550748.A.72C.html