CSSE 板


LINE

※ 引述《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







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:WOW站内搜寻

TOP