计算机中地址和内存大小的计算和编译出来的数据段
由地址计算内存大小(消除模糊认知)在计算机中一个地址代表一个字节的内存的位置,即这个byte的门牌号,所以如果给出地址空间的起始地址是可以计算出内存大小的,比如STM32中Flash可编程的地址是从0x0800 0000开始到0x0801FFFF结束的所以内存大小的计算过程如下: 地址差 = 结束地址 - 开始地址? =? 0x0001FFFF;他们可以表示的Byte的个数是N = 0x0001 FFFF + 1即0x00020000将N变换为十进制是131072。 内存大小 = N/1024(KB) = 131072 /1024 =? 128Kb此时说明这个芯片的Flash大小是128Kb的。 程序编译过程中的各个数据段bss段: bss是英文Block Started by Symbol(符号块)的简称。 bss段属于静态内存分配。 data段: text段: 堆(heap): 栈(stack): ? 一个程序本质上都是由 bss段、data段、text段三个组成的。这样的概念,不知道最初来源于哪里的规定,但在当前的计算机程序设计中是很重要的一个基本概念。而且在嵌入式系统的设计中也非常重要,牵涉到嵌入式系统运行时的内存大小分配,存储单元占用空间大小的问题。在采用段式内存管理的架构中(比如intel的80x86系统),bss段通常是指用来存放程序中未初始化的全局变量的一块内存区域,一般在初始化时bss 段部分将会清零。bss段属于静态内存分配,即程序一开始就将其清零了。比如,在C语言之类的程序编译完成之后,已初始化的全局变量保存在.data 段中,未初始化的全局变量保存在.bss 段中。text和data段都在可执行文件中(在嵌入式系统里一般是固化在镜像文件中),由系统从可执行文件中加载;而bss段不在可执行文件中,由系统初始化。 【例】 程序1: int ar[30000]; void main() { ...... } 程序2: int ar[300000] = {1,2,3,4,5,6 }; void main() { ...... } ? 程序2编译之后所得的.exe文件比程序1的要大得多。 使用了/FAs编译选项来查看了一下其各自的.asm, _BSS SEGMENT [email?protected]@3PAHA DD 0493e0H DUP (?) ; ar _BSS ENDS 而在程序2.asm中,ar被定义为: _DATA SEGMENT [email?protected]@3PAHA DD 01H ; ar DD 02H DD 03H ORG $+1199988 _DATA ENDS 区别是一个位于.bss段,而另一个位于.data段,两者的区别在于: 全局的未初始化变量存在于.bss段中,具体体现为一个占位符; 参考博客:https://www.cnblogs.com/yanghong-hnu/p/4705755.html (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |