免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2298 | 回复: 15
打印 上一主题 下一主题

栈是咋回事儿啊? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-05-24 10:52 |只看该作者 |倒序浏览
假设:
函数A调用函数B,函数B调用函数C
函数C是当前frame时,fp里放着的地址为0xffff1234,地址里放着的值为0x00001234

请教:
函数C返回函数B之后,当函数B返回时,怎么知道函数A的代码地址的?
也就是说栈的一个frame结束后回到另一个frame时,另一个frame的fp地址是怎么知道的?

[ 本帖最后由 ukin50 于 2007-5-24 11:53 编辑 ]

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2007-05-24 11:38 |只看该作者
原帖由 ukin50 于 2007-5-24 10:52 发表
假设:
函数A调用函数B,函数B调用函数C
函数C是当前frame时,fp里放着的地址为0xffff1234,地址里放着的值为0x00001234

请教:
函数C返回函数B之后,当函数B返回时,怎么知道函数A的代码地址的?
也就是说 ...

这个由编译器操心。

论坛徽章:
0
3 [报告]
发表于 2007-05-24 11:58 |只看该作者

回复 1楼 ukin50 的帖子

呵呵,用不着我操心是吧
但是那个地址总得放在一个地方吧?我就是想不明白……

我猜是不是还有一个寄存器专门放当前frame的大小的,然后frame回到另一个frame时就把原来frame的fp往下减掉这个大小就行了……哎呀不行,那个大小也不只一个啊,有多少个frame就必须有多少个大小……

是不是这样呢:
fp地址里放的不是直接的代码地址而是另一个存在于数据段的地址,而这个地址是连续的(4byte)专门存放每个frame的返回代码地址,由这个另一个的地址来++或--

[ 本帖最后由 ukin50 于 2007-5-24 13:06 编辑 ]

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
4 [报告]
发表于 2007-05-24 12:02 |只看该作者
原帖由 ukin50 于 2007-5-24 11:58 发表
呵呵,用不着我操心是吧
但是那个地址总得放在一个地方吧?我就是想不明白……

我猜是不是还有一个寄存器专门放当前frame的大小的,然后frame回到另一个frame时就把原来frame的fp往下减掉这个大小就行了……哎 ...

参考编译原理相关部分以及具体编译器的实现。

论坛徽章:
0
5 [报告]
发表于 2007-05-24 12:32 |只看该作者

回复 1楼 ukin50 的帖子

唉……
我连我问的问题为什么跟编译器有关系都搞不清楚。
为什么跟编译器有关系呢?不是操作系统么?(两门课我都没学过,奏是在这空想)

论坛徽章:
0
6 [报告]
发表于 2007-05-24 12:35 |只看该作者
推荐看 《深入理解计算机系统》

http://www.unix-center.net/bbs/v ... &extra=page%3D1

论坛徽章:
0
7 [报告]
发表于 2007-05-24 12:54 |只看该作者
原帖由 ukin50 于 2007-5-23 19:58 发表
呵呵,用不着我操心是吧
但是那个地址总得放在一个地方吧?我就是想不明白……

我猜是不是还有一个寄存器专门放当前frame的大小的,然后frame回到另一个frame时就把原来frame的fp往下减掉这个大小就行了……哎 ...


老的fp地址和代码的返回地址都在函数调用的时候已经压入栈内了啊,怎么会找不到?

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
8 [报告]
发表于 2007-05-24 13:09 |只看该作者
原帖由 ukin50 于 2007-5-24 12:32 发表
唉……
我连我问的问题为什么跟编译器有关系都搞不清楚。
为什么跟编译器有关系呢?不是操作系统么?(两门课我都没学过,奏是在这空想)

所以才建议你先学学嘛

论坛徽章:
0
9 [报告]
发表于 2007-05-24 13:39 |只看该作者
原帖由 emacsnw 于 2007-5-24 13:54 发表


老的fp地址和代码的返回地址都在函数调用的时候已经压入栈内了啊,怎么会找不到?



问题是在栈的哪里啊?如果栈内只放fp地址的话,我当然知道,就是原来的fp--就是了
但是栈内还放别的东西,每一个frame的大小都是不一样的,当返回前一个frame时怎么知道前一个frame的fp的呢?

操作系统是怎么动作的呢?(或者是编译器,我还是不知道这根编译器有什么关系……)

论坛徽章:
0
10 [报告]
发表于 2007-05-24 13:42 |只看该作者
原帖由 wuqing 于 2007-5-24 13:35 发表
推荐看 《深入理解计算机系统》

http://www.unix-center.net/bbs/v ... &extra=page%3D1


谢谢了
在厂子看不了私人信件,回家之后再注册
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP