免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: hitcser01
打印 上一主题 下一主题

[C] [面试]如果交换堆和栈的位置? [复制链接]

论坛徽章:
0
21 [报告]
发表于 2014-04-24 21:56 |只看该作者
别纠结栈方向了,碰到多线程,什么方向都是扯淡。栈肯定是有大小限制的。

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
22 [报告]
发表于 2014-04-25 12:10 |只看该作者
回复 18# zylthinking


    举个例子就清楚了,假设当前栈顶esp是0x100,现在调用了一个新函数,需要压栈。

1. *esp <- 0x100
2. 假设当前函数使用了0x20个字节的内存,则esp += 0x20
3. 现在新的栈顶为0x120,而栈顶使用了多少字节的内存?多少都行,因为没有“底限制”,从0x120开始所有的字节都是可用的(对比栈从上往下增长的情况,如果写过了那么就覆盖了以前的栈空间了,而现在不会这样)
4. 只需要在调用新的函数(压栈)的时候,才需要确定某函数到底使用了多少空间。

弹栈的时候就一个操作:
esp <- *esp
就可以了。

是不是比相反的情况简单多了?(不需要ebp)

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
23 [报告]
发表于 2014-04-25 14:13 |只看该作者
zylthinking 发表于 2014-04-23 17:53
回复 1# hitcser01

则编译器必须想办法记住最后一个分配的空间为多大...


这不是个问题吧。编译器当然知道它分配的元素多大,最后这个大小体现在汇编寻址指令使用的偏移量上。

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
24 [报告]
发表于 2014-04-25 14:20 |只看该作者
回复 10# windoze


    我觉得这个靠谱。

论坛徽章:
14
水瓶座
日期:2014-06-10 09:51:0215-16赛季CBA联赛之江苏
日期:2017-11-27 11:42:3515-16赛季CBA联赛之八一
日期:2017-04-12 14:26:2815-16赛季CBA联赛之吉林
日期:2016-08-20 10:43:1215-16赛季CBA联赛之广夏
日期:2016-06-23 09:53:58程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-09 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-25 16:40:3515-16赛季CBA联赛之广夏
日期:2015-12-22 09:39:36程序设计版块每日发帖之星
日期:2015-08-24 06:20:002015亚冠之德黑兰石油
日期:2015-08-07 09:57:302015年辞旧岁徽章
日期:2015-03-03 16:54:15
25 [报告]
发表于 2014-04-25 17:40 |只看该作者
starwing83 发表于 2014-04-25 12:10
回复 18# zylthinking

请问“使用0x20个字节”如何记录?

论坛徽章:
14
水瓶座
日期:2014-06-10 09:51:0215-16赛季CBA联赛之江苏
日期:2017-11-27 11:42:3515-16赛季CBA联赛之八一
日期:2017-04-12 14:26:2815-16赛季CBA联赛之吉林
日期:2016-08-20 10:43:1215-16赛季CBA联赛之广夏
日期:2016-06-23 09:53:58程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-09 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-25 16:40:3515-16赛季CBA联赛之广夏
日期:2015-12-22 09:39:36程序设计版块每日发帖之星
日期:2015-08-24 06:20:002015亚冠之德黑兰石油
日期:2015-08-07 09:57:302015年辞旧岁徽章
日期:2015-03-03 16:54:15
26 [报告]
发表于 2014-04-25 17:45 |只看该作者
zhaohongjian000 发表于 2014-04-25 14:13
这不是个问题吧。编译器当然知道它分配的元素多大,最后这个大小体现在汇编寻址指令使用的偏移量上。
...

向上的栈esp移位有意义吗?移位就是为了分配一定的空间供自动变量使用,但是移位了结果用的是esp地址之上的部分(而不是分配的部分)

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
27 [报告]
发表于 2014-04-25 19:34 |只看该作者
回复 25# lxyscls


    根据当前的C语言上下文,编译器很显然能通过当前的自动变量的定义知道当前用了多少内存了。

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
28 [报告]
发表于 2014-04-25 21:16 |只看该作者
回复 22# starwing83

编译器自然不关心某元素地址, 但程序员关心; 怎么传递给程序员呢, esp - 20
你说的就是我说的第二类情况


   

论坛徽章:
0
29 [报告]
发表于 2014-04-25 22:02 |只看该作者
堆栈都是基址寻址,用ebp做基址,则每个局部变量在不同基本块中的偏移是固定的,用esp做基址,变量在不同基本块中的偏移可能是变化的,因为esp会变化。

至于堆栈方向和空栈/满栈,x86是向下+满栈,ARM可以任意指定。这都没有本质上的差别,只是稍微影响一下管理手段。你说那种配置会比另外一种更方便,更高效,那都未必。

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
30 [报告]
发表于 2014-04-25 22:46 |只看该作者
sonicling 发表于 2014-04-25 22:02
堆栈都是基址寻址,用ebp做基址,则每个局部变量在不同基本块中的偏移是固定的,用esp做基址,变量在不同基 ...


我没有仔细想过这问题, 只是对象地址是所占用的内存的 低地址, 这个貌似是个不对称因素
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP