| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1892 人关注过本帖
标题:编译后,局部变量的逻辑地址,是否就确定了?
只看楼主 加入收藏
蹲厕所里数蛆
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2013-2-22
结帖率:0
收藏
 问题点数:0 回复次数:3 
编译后,局部变量的逻辑地址,是否就确定了?
我们知道,对于全局变量,它的逻辑地址(段地址+偏移量)在编译后就确定了,在程序运行时分配内存。
我想问的是,对于局部变量,它的逻辑地址,是否在编译后就确定了呢?


我问过别人,有的说:所有局部变量的逻辑地址是运行时确定的。这种说法的在帖子:https://bbs.bccn.net/thread-297574-1-1.html
            也有的说:所有变量的逻辑地址都在编译后就确定了,但都是相对的偏移地址,只不过全局变量是相对数据段的偏移,局部变量是相对程序栈顶的偏移。
            这种说法的在帖子:https://bbs.bccn.net/thread-399030-1-1.html

请问哪种说法对?



[ 本帖最后由 蹲厕所里数蛆 于 2013-5-7 15:26 编辑 ]
2013-05-07 15:20
羲和天蓝
Rank: 2
等 级:论坛游民
帖 子:10
专家分:30
注 册:2013-5-7
收藏
得分:0 
编译只是把你的代码翻译成汇编代码,此时并没有确定地址,关于逻辑地址我感觉有点太抽象了,也说不清。
举个例子,accum 是个int类型的全局变量,有句accum += a;编译后这句大概会是这样。9: 01 05 00 00 0 00   add %eax, 0x0. (前面是机器码,后面是翻译成汇编码)
这时的0x0便是指accum,这时候还没有在内存中分配地址空间,然后连接器链接后这句会变成这样,804839d: 01 05 18 a0 04 08  add %eax, 0x804a018.
这个时候才确定了内存中的地址。
至于第二种说法感觉说的并不是全局变量,应该说的是程序控制之类的吧,c中的各种控制翻译成汇编就是各种跳转,一般直接跳转就是直接翻译成相对于下一句的偏移量。
比如说 804828f: 74 05 je xxxxxxx
       8048291: e8 1e 00 00 00 call 80482b4
这时便是偏移量就是05, xxxxx就是8048291 + 05。
自己的看法。错了请指正。
2013-05-08 10:51
羲和天蓝
Rank: 2
等 级:论坛游民
帖 子:10
专家分:30
注 册:2013-5-7
收藏
得分:0 
之前的有点看错了,学8086时是段首址加段内偏离量由逻辑地址形成物理地址,不过现在都是平滑寻址了,对于之前的实在无法保证正确,之前的0x0到底是逻辑地址还是什么的还是其他的还是请大神解谜吧。。。。
2013-05-08 11:43
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
其实局部变量的逻辑地址是否确定很重要吗以至于你要弄清楚这个问题?搞清楚“局部变量”是干什么的就知道这个问题是否值得探究。

授人以渔,不授人以鱼。
2013-05-08 20:45
快速回复:编译后,局部变量的逻辑地址,是否就确定了?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020525 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved