电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

bss段代码段及数据段的区别

10页
  • 卖家[上传人]:枫**
  • 文档编号:454547873
  • 上传时间:2023-12-21
  • 文档格式:DOC
  • 文档大小:57KB
  • / 10 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 1、 一个程序本质上都是由 bss段、data段、text段三个组成的。这样的概念,不知道最初来源于哪里的规定,但 在当前的计算机程序设计中是很重要的一个基本概念。而且在嵌入式系统的设计中也非常重要,牵涉到嵌入式系统运行时的内存大小分配,存储单元占用空间大小的问题。 在采用段式内存管理的架构中(比如intel的80x86系统),bss段(Block Started by Symbol segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域,一般在初始化时bss 段部分将会清零。bss段属于静态内存分配,即程序一开始就将其清零了。 比如,在C语言之类的程序编译完成之后,已初始化的全局变量保存在.data 段中,未初始化的全局变量保存在.bss 段中。 在Programming ground up里对.bss的解释为:There is another section called the .bss. This section is like the data section, except that it doesnt take up space in the executab

      2、le.text和data段都在可执行文件中(在嵌入式系统里一般是固化在镜像文件中),由系统从可执行文件中加载;而bss段不在可执行文件中,由系统初始化。【例一】用cl编译两个小程序如下:程序1:int ar30000;void main().程序2:int ar300000 = 1, 2, 3, 4, 5, 6 ;void main(). 发现程序2编译之后所得的.exe文件比程序1的要大得多。当下甚为不解,于是手工编译了一下,并使用了/FAs编译选项来查看了一下其各自的.asm,发现在程序1.asm中ar的定义如下:_BSS SEGMENT?ar3PAHA DD 0493e0H DUP (?) ; ar_BSS ENDS而在程序2.asm中,ar被定义为:_DATA SEGMENT?ar3PAHA DD 01H ; arDD 02HDD 03HORG $+1199988_DATA ENDS区别很明显,一个位于.bss段,而另一个位于.data段,两者的区别在于:全局的未初始化变量存在于.bss段中,具体体现为一个占位符;全局的已初始化变量存于.data段中;而函数内的自动变量都在栈上

      3、分配空间。.bss是不占用.exe文件空间的,其内容由操作系统初始化(清零);而.data却需要占用,其内容由程序初始化,因此造成了上述情况。【例二】编译如下程序(test.cpp):#include #define LEN 1002000int inbssLEN;float fA;int indataLEN=1,2,3,4,5,6,7,8,9;double dbB = 100.0;const int cst = 100;int main(void)int run100 = 1,2,3,4,5,6,7,8,9;for(int i=0; iLEN; +i)printf(%d , inbssi);return 0;命令:cl /FA test.cpp 回车 (/FA:产生汇编代码)产生的汇编代码(test.asm):TITLE test.cpp.386Pinclude listing.incif Version gt 510.model FLATelse_TEXT SEGMENT PARA USE32 PUBLIC CODE_TEXT ENDS_DATA SEGMENT DWORD USE

      4、32 PUBLIC DATA_DATA ENDSCONST SEGMENT DWORD USE32 PUBLIC CONSTCONST ENDS_BSS SEGMENT DWORD USE32 PUBLIC BSS_BSS ENDS_TLS SEGMENT DWORD USE32 PUBLIC TLS_TLS ENDSFLAT GROUP _DATA, CONST, _BSSASSUME CS: FLAT, DS: FLAT, SS: FLATendifPUBLIC ?inbss3PAHA ; inbssPUBLIC ?fA3MA ; fAPUBLIC ?indata3PAHA ; indataPUBLIC ?dbB3NA ; dbB_BSS SEGMENT?inbss3PAHA DD 0f4a10H DUP (?) ; inbss?fA3MA DD 01H DUP (?) ; fA_BSS ENDS_DATA SEGMENT?indata3PAHA DD 01H ; indataDD 02HDD 03HDD 04HDD 05HDD 06HDD 07HDD 08HDD 09HORG $

      5、+4007964?dbB3NA DQ 04059000000000000r ; 100 ; dbB_DATA ENDSPUBLIC _mainEXTRN _printf:NEAR_DATA SEGMENT$SG537 DB %d , 00H_DATA ENDS_TEXT SEGMENT_run$ = -400_i$ = -404_main PROC NEAR; File test.cpp; Line 13push ebpmov ebp, espsub esp, 404 ; 00000194Hpush edi; Line 14mov DWORD PTR _run$ebp, 1mov DWORD PTR _run$ebp+4, 2mov DWORD PTR _run$ebp+8, 3mov DWORD PTR _run$ebp+12, 4mov DWORD PTR _run$ebp+16, 5mov DWORD PTR _run$ebp+20, 6mov DWORD PTR _run$ebp+24, 7mov DWORD PTR _run$ebp+28, 8mov DWORD PTR _r

      6、un$ebp+32, 9mov ecx, 91 ; 0000005bHxor eax, eaxlea edi, DWORD PTR _run$ebp+36rep stosd; Line 15mov DWORD PTR _i$ebp, 0jmp SHORT $L534$L535:mov eax, DWORD PTR _i$ebpadd eax, 1mov DWORD PTR _i$ebp, eax$L534:cmp DWORD PTR _i$ebp, 1002000 ; 000f4a10Hjge SHORT $L536; Line 16mov ecx, DWORD PTR _i$ebpmov edx, DWORD PTR ?inbss3PAHAecx*4push edxpush OFFSET FLAT:$SG537call _printfadd esp, 8jmp SHORT $L535$L536:; Line 17xor eax, eax; Line 18pop edimov esp, ebppop ebpret 0_main ENDP_TEXT ENDSEND通过汇编文件可以看到,数

      7、组inbss和indata位于不同的段(inbss位于bss段,而indata位于data段)若把test.cpp中的indata数组拿掉,查看生成的exe文件的大小,可以发现,indata拿掉之后exe文件的大小小了很多。而若拿掉的是inbss数组,exe文件大小跟没拿掉时相差无几。说明了:bss段(未手动初始化的数据)并不给该段的数据分配空间,只是记录数据所需空间的大小。data(已手动初始化的数据)段则为数据分配空间,数据保存在目标文件中。数据段包含经过初始化的全局变量以及它们的值。BSS段的大小从可执行文件中得到 ,然后链接器得到这个大小的内存块,紧跟在数据段后面。当这个内存区进入程序的地址空间后全部清零。包含数据段和BSS段的整个区段此时通常称为数据区。ld 时把所有的目标文件的代码段组合成一个代码段,把所有的数据段组合成一个数据段.#BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。数据段:数据段(data segment)通常是指用

      8、来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。代码段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。代码段是存放了程序代码的数据,假如机器中有数个进程运行相同的一个程序,那么它们就可以使用同一个代码段。堆(heap):堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)栈(stack):栈又称堆栈, 是用户存放程序临时创建的局部变量,也就是说我们函数括弧“”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进先出特点,所以栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。-没初始化的全局变量(bss段),只在编译后生成文件的时候会比初始化的全局变量占空间小。 加载的时候,如果是大型操作系统上,通常加载器帮你把bss段初始化为0,当然已经初始化的全局变量直接从你的可执行文件拷贝对应的值。要注意,bss全局变

      《bss段代码段及数据段的区别》由会员枫**分享,可在线阅读,更多相关《bss段代码段及数据段的区别》请在金锄头文库上搜索。

      点击阅读更多内容
    最新标签
    监控施工 信息化课堂中的合作学习结业作业七年级语文 发车时刻表 长途客运 入党志愿书填写模板精品 庆祝建党101周年多体裁诗歌朗诵素材汇编10篇唯一微庆祝 智能家居系统本科论文 心得感悟 雁楠中学 20230513224122 2022 公安主题党日 部编版四年级第三单元综合性学习课件 机关事务中心2022年全面依法治区工作总结及来年工作安排 入党积极分子自我推荐 世界水日ppt 关于构建更高水平的全民健身公共服务体系的意见 空气单元分析 哈里德课件 2022年乡村振兴驻村工作计划 空气教材分析 五年级下册科学教材分析 退役军人事务局季度工作总结 集装箱房合同 2021年财务报表 2022年继续教育公需课 2022年公需课 2022年日历每月一张 名词性从句在写作中的应用 局域网技术与局域网组建 施工网格 薪资体系 运维实施方案 硫酸安全技术 柔韧训练 既有居住建筑节能改造技术规程 建筑工地疫情防控 大型工程技术风险 磷酸二氢钾 2022年小学三年级语文下册教学总结例文 少儿美术-小花 2022年环保倡议书模板六篇 2022年监理辞职报告精选 2022年畅想未来记叙文精品 企业信息化建设与管理课程实验指导书范本 草房子读后感-第1篇 小数乘整数教学PPT课件人教版五年级数学上册 2022年教师个人工作计划范本-工作计划 国学小名士经典诵读电视大赛观后感诵读经典传承美德 医疗质量管理制度 2
    关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
    手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
    ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.