注册 登录
编程论坛 汇编论坛

bss段中的本地通用内存区域和通用内存区域有什么区别?

zqy110007 发布于 2009-08-18 22:22, 1327 次点击
bss段中的本地通用内存区域和通用内存区域有什么区别?
< <汇编语言程序设计>>一书中给出的说明是:
虽然这两种区域工作情况类似, 但是本地通用内存区域是不会为本地汇编代码之外进行访问的数据保留的.


没看太懂, 大家最好还给个实例(AT&T汇编的)
8 回复
#2
zklhp2009-08-19 18:30
不知道您看的什么书 这个不明白~
#3
zqy1100072009-08-19 19:08
回复 2楼 zklhp

额, 就是bss段中的.comm和.lcomm 有什么区别?
#4
zklhp2009-08-19 19:25
恕俺无知 是不是这个~

BSS(二进制文件术语)
  是“Block Started by Symbol”的缩写,意为“以符号开始的块”。
  BSS是Unix链接器产生的未初始化数据段。其他的段分别是包含程序代码的“text”段和包含已初始化数据的“data”段。BSS段的变量只有名称和大小却没有值。此名后来被许多文件格式使用,包括PE。“以符号开始的块”指的是编译器处理未初始化数据的地方。BSS节不包含任何数据,只是简单的维护开始和结束的地址,以便内存区能在运行时被有效地清零。BSS节在应用程序的二进制映象文件中并不存在。
  在采用段式内存管理的架构中(比如intel的80x86系统),bss段(Block Started by Symbol segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域,一般在初始化时bss 段部分将会清零。bss段属于静态内存分配,即程序一开始就将其清零了。
  比如,在C语言之类的程序编译完成之后,已初始化的全局变量保存在.data 段中,未初始化的全局变量保存在.bss 段中。
  text和data段都在可执行文件中(在嵌入式系统里一般是固化在镜像文件中),由系统从可执行文件中加载;而bss段不在可执行文件中,由系统初始化。
#5
东海一鱼2009-08-19 20:02
.lcomm 是不是local comm啊。就是不能被globe代码访问的数据啊。

以上瞎猜,哈哈。没搞过AT&T的汇编。
#6
zqy1100072009-08-19 22:20
回复 5楼 东海一鱼

嗯嗯, 书上也是这么写的, 就是搞不懂啊`. 为什么数据不能被globe代码访问`` ?
#7
zqy1100072009-08-19 22:21
回复 4楼 zklhp

嗯, 没错, bss段差不多就是这东西`   
#8
东海一鱼2009-08-20 17:24
回复 6楼 zqy110007

呵呵,还蒙对了?

我是这样想的,现在的语言(包括低级的)都有模块化的思想,一个模块内的私有变量是不允许外部代码访问的。这个.lcomm是不是基于这样的思想哪?在高级语言使用‘类’对象的私有成员区域来保证。低级语言没有这样的机制,只能用模块之间的public(globle)或未声明的局部变量(标号)来做类似的工作。

以上没有考证,纯属瞎掰,呵呵。见笑、见笑。
#9
zqy1100072009-08-22 22:13
回复 8楼 东海一鱼
不知道, 如果知道我也不会问了`
1