`
nathan09
  • 浏览: 155600 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

data段与bss段

 
阅读更多

编译如下程序(test.cpp):
#include <stdio.h>

#define LEN 1002000

int inbss[LEN];
float fA;
int indata[LEN]={1,2,3,4,5,6,7,8,9};
double dbB = 100.0;

const int cst = 100;

int main(void)
{
int run[100] = {1,2,3,4,5,6,7,8,9};
for(int i=0; i<LEN; ++i)
printf("%d ", inbss[i]);
return 0;
}

命令:cl /FA test.cpp 回车 (/FA:产生汇编代码)
产生的汇编代码(test.asm):
TITLE test.cpp
.386P
include listing.inc
if @Version gt 510
.model FLAT
else
_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'
_TEXT ENDS
_DATA SEGMENT DWORD USE32 PUBLIC 'DATA'
_DATA ENDS
CONST SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST ENDS
_BSS SEGMENT DWORD USE32 PUBLIC 'BSS'
_BSS ENDS
_TLS SEGMENT DWORD USE32 PUBLIC 'TLS'
_TLS ENDS
FLAT GROUP _DATA, CONST, _BSS
ASSUME CS: FLAT, DS: FLAT, SS: FLAT
endif
PUBLIC ?inbss@@3PAHA ; inbss
PUBLIC ?fA@@3MA ; fA
PUBLIC ?indata@@3PAHA ; indata
PUBLIC ?dbB@@3NA ; dbB
_BSS SEGMENT
?inbss@@3PAHA DD 0f4a10H DUP (?) ; inbss
?fA@@3MA DD 01H DUP (?) ; fA
_BSS ENDS
_DATA SEGMENT
?indata@@3PAHA DD 01H ; indata
DD 02H
DD 03H
DD 04H
DD 05H
DD 06H
DD 07H
DD 08H
DD 09H
ORG $+4007964
?dbB@@3NA DQ 04059000000000000r ; 100 ; dbB
_DATA ENDS
PUBLIC _main
EXTRN _printf:NEAR
_DATA SEGMENT
$SG537 DB '%d ', 00H
_DATA ENDS
_TEXT SEGMENT
_run$ = -400
_i$ = -404
_main PROC NEAR
; File test.cpp
; Line 13
push ebp
mov ebp, esp
sub esp, 404 ; 00000194H
push edi
; Line 14
mov DWORD PTR _run$[ebp], 1
mov DWORD PTR _run$[ebp+4], 2
mov DWORD PTR _run$[ebp+8], 3
mov DWORD PTR _run$[ebp+12], 4
mov DWORD PTR _run$[ebp+16], 5
mov DWORD PTR _run$[ebp+20], 6
mov DWORD PTR _run$[ebp+24], 7
mov DWORD PTR _run$[ebp+28], 8
mov DWORD PTR _run$[ebp+32], 9
mov ecx, 91 ; 0000005bH
xor eax, eax
lea edi, DWORD PTR _run$[ebp+36]
rep stosd
; Line 15
mov DWORD PTR _i$[ebp], 0
jmp SHORT $L534
$L535:
mov eax, DWORD PTR _i$[ebp]
add eax, 1
mov DWORD PTR _i$[ebp], eax
$L534:
cmp DWORD PTR _i$[ebp], 1002000 ; 000f4a10H
jge SHORT $L536
; Line 16
mov ecx, DWORD PTR _i$[ebp]
mov edx, DWORD PTR ?inbss@@3PAHA[ecx*4]
push edx
push OFFSET FLAT:$SG537
call _printf
add esp, 8
jmp SHORT $L535
$L536:
; Line 17
xor eax, eax
; Line 18
pop edi
mov esp, ebp
pop ebp
ret 0
_main ENDP
_TEXT ENDS
END
----------------------------------------
通过汇编文件可以看到,数组inbss和indata位于不同的段(inbss位于bss段,而indata位于data段)
若把test.cpp中的indata数组拿掉,查看生成的exe文件的大小,可以发现,indata拿掉之后exe文件的大小小了很多。而若拿掉的是inbss数组,exe文件大小跟没拿掉时相差无几。

说明了:
bss段(未手动初始化的数据)并不给该段的数据分配空间,只是记录数据所需空间的大小。
data(已手动初始化的数据)段则为数据分配空间,数据保存在目标文件中。

数据段包含经过初始化的全局变量以及它们的值。BSS段的大小从可执行文件中得到 ,然后链接器得到这个大小的内存块,紧跟在数据段后面。当这个内存区进入程序的地址空间后全部清零。包含数据段和BSS段的整个区段此时通常称为数据区。

分享到:
评论

相关推荐

    data,bss ,text,小知识

    ### 数据段、BSS段、代码段、堆与栈的小知识总结 #### 一、BSS段 **BSS段**(Block Started by Symbol)主要用来存放程序中未初始化的全局变量,它属于静态内存分配的一部分。在程序的生命周期中,这部分内存区域...

    五分钟搞定bss、data和rodata的区别 硬件工程师电路分析物联网模电单片机嵌入式技术.doc

    data与bss相比,data就容易明白多了,它的名字就暗示着里面存放着数据。当然,如果数据全是零,为了优化考虑,编译器把它当作bss处理。通俗的说,data指那些初始化过(非零)的非const的全局变量和静态变量。...

    BSS段、数据段、代码段、堆与栈.pdf

    ### BSS段、数据段、代码段、堆与栈详解 #### 一、BSS段 **BSS段**(Block Started by Symbol)是程序中用于存放未初始化的全局变量的一块内存区域。这类变量通常在程序启动时由操作系统自动设置为零值。BSS段的特点...

    你知道bss,data,text,rodata,堆,栈,常量段等区别?.docx

    常量段一般包含编译器产生的数据(与只读段包含用户定义的只读数据不同)。常量段通常包含编译器产生的数据,例如由语句 a=2+3 编译器把 2+3 编译期就算出 5,存成常量 5 在常量段中。 在嵌入式系统设计中,程序...

    将数据放在data段的汇编源文件1

    通常包括`CODE`段(存放程序代码)、`DATA`段(存放已初始化的数据)、`BSS`段(存放未初始化的数据)等。 - **寄存器使用**:寄存器是CPU内部的高速存储单元,用于暂存指令执行过程中需要用到的数据。在汇编语言中...

    SS段、数据段、代码段、堆与栈

    全局未初始化变量`inbss`被放置在BSS段,而已初始化的全局变量`indata`则位于数据段。此外,局部变量`run`在函数`main`内部定义,因此它们被分配在栈上。通过这两个实例,我们可以直观地看到不同类型的变量如何根据...

    E05:UNIXV6++进程图象(参考答案)1

    在 UNIX 系统中,可执行文件由多个段组成,主要包括:魔法数(magic number)、文本段(Text Segment)、数据段(Data Segment)和 BSS 段(BSS Segment)。这些段的作用如下: - 魔法数:用于标识文件是否为可...

    BSS数据库分析应用.pdf

    一是通过BSC(Base Station Controller,基站控制器)或RXCDR(Radio Exchange for Cellular Data Radio,蜂窝数据无线电交换机)的TTY(TeleTypeWriter,终端仿真)接口直接输入命令或批处理文件。二是使用DATAGEN...

    BSS.rar_bss

    标题"BSS.rar_bss"指的是一个与盲源分离(Blind Source Separation, BSS)相关的MATLAB程序压缩包。盲源分离是一种信号处理技术,主要用于在不知道原始信号特性和混合方式的情况下,从多个传感器接收到的混合信号中...

    ASP的BSS论坛

    ASP可以与SQL Server、Access或其他支持ADO(ActiveX Data Objects)的数据库进行交互。 4. **数据库设计**:设计合理的数据库架构,如用户表、主题表、帖子表、回复表等,以高效地存储和检索论坛数据。 5. **权限...

    DSP应用中段的概念讲解

    自定义段由用户定义,和默认的典型段.text .data .bss 的使用完全相同,且独立分配,需要强调的是他们单独被汇编,不合.text .data .bss 混在一起。自定义段的伪指令有.usect .sect .asect 等。 六、在 DSP 应用中...

    C语言中的5个段作用[定义].pdf

    二、数据段(data segment) 数据段也称为全局初始化数据段或静态数据段。该段包含了在程序中明确被初始化的全局变量、静态变量(包括全局静态变量和局部静态变量)和常量数据。 三、BSS段(Block Started by ...

    bss系统

    在bbs系统中,Access可以存储用户的注册信息、帖子内容、回帖等数据,通过ODBC(Open Database Connectivity)或ADO(ActiveX Data Objects)与ASP进行交互,实现数据的读取、写入和更新操作。 3. **论坛系统架构**...

    s32k312 之 Relocating data in DTCM

    由于数据通常分为两种类型——带初始值的`data`和不带初始值的`.bss`,因此需要为这两种类型分别创建`.dtcm_data`和`.dtcm_bss`部分。 ```plaintext __dtcm_rom = __itcm_rom_end; .dtcm_data : AT(__dtcm_rom) ...

    DSP精讲汇编语言程序开发工具PPT学习教案.pptx

    在这个过程中,链接器处理段与目标存储器的对应关系,例如,.text段通常位于ROM中,而.data和.bss段可能位于RAM中。.bss段和.usect伪指令分别用于在内存中预留未初始化的空间,为变量分配存储空间,而初始化段的声明...

    BSS系统命令解析.pdf

    - `disp_cal_data`:查看基站的调测数据,如`disp_cal_data 21 dri 1 1 0`。 - `disp_cell_status`:显示扇区或基站的基本信息,如`disp_cell_status 21`。 - `disp_element`:查询特定参数,如`disp_ele max_tx_...

    u-boot 启动代码分析

    /* 定义_edata符号,表示.data段的结束 */ } .bss : SUBALIGN(4) { _bss = .; /* 定义_bss符号,表示.bss段的开始 */ *(.bss*) /* 放置所有.bss节区的内容 */ _ebss = .; /* 定义_ebss符号,表示.bss段的结束 */ } ...

    DSP精讲汇编语言程序开发工具PPT课件.pptx

    - 主要有三种类型的段:`.text`、`.data` 和 `.bss`。 2. **段的基本类型**: - **初始化段**: 包含实际数据或程序代码的段,如 `.text` 和 `.data` 段。 - **未初始化段**: 在存储空间中为未初始化数据预留空间...

    S32K144基于S32DS2018开发环境的启动文件/链接脚本详细分析

    4. **Data与BSS段初始化**: - **Init_data_bss函数**: - 定义于SDK提供的`startup.c`文件。 - 函数负责从ROM复制初始化数据到RAM,并清零BSS段。 - 使用GCC编译器,关注GCC特定定义。 - 定义一系列指针,指向...

    DSP原理与应用_张卫宁_第4章

    在目标文件与目标存储器之间,各段会被映射到相应的内存区域,例如,.bss和.data段通常位于RAM,而.text段可能位于ROM或EPROM中。汇编器通过段定义伪指令(如.bss、.usect、.text、.data和.sect)来区分和组织各个段...

Global site tag (gtag.js) - Google Analytics