函数代码://demo.c

#include<stdio.h>
#include<stdlib.h> int global1 = , global2 = , global3 = ; void function(void)
{
int local4 = , local5 = , local6 = ;
static int static4 = , static5 = , static6 = ;
int *p2 = (int*)malloc(sizeof(int)); printf("子函数 局部变量 : \n");
printf("local4 : %p \n", &local4);
printf("local5 : %p \n", &local5);
printf("local6 : %p \n", &local6); printf("子函数 指针变量 : \n");
printf("p2 : %p \n", p2); printf("全局变量 : \n");
printf("global1 : %p \n", &global1);
printf("global2 : %p \n", &global2);
printf("global3 : %p \n", &global3); printf("子函数 静态变量 : \n");
printf("static4 : %p \n", &static4);
printf("static5 : %p \n", &static5);
printf("static6 : %p \n", &static6); printf("子函数地址 : \n");
printf("function : %p \n", function);
} int demo_main(int argc, char **argv)
{
int local1 = , local2 = , local3 = ;
static int static1 = , static2 = , static3 = ;
int *p1 = (int*)malloc(sizeof(int));
const int const1 = ;
char *char_p = "char"; printf("主函数 局部变量 : \n");
printf("local1 : %p \n", &local1);
printf("local2 : %p \n", &local2);
printf("local3 : %p \n", &local3);
printf("const1 : %p \n", &const1); printf("主函数 指针变量 : \n");
printf("p1 : %p \n", p1); printf("全局变量 : \n");
printf("global1 : %p \n", &global1);
printf("global2 : %p \n", &global2);
printf("global3 : %p \n", &global3); printf("主函数 静态变量 : \n");
printf("static1 : %p \n", &static1);
printf("static2 : %p \n", &static2);
printf("static3 : %p \n", &static3); printf("字符串常量 : \n");
printf("char_p : %p \n", char_p); printf("主函数地址 : \n");
printf("main : %p \n", demo_main); printf("= = = = = = = = = = = = = = = \n"); function(); return ;
}

函数打印情况,并结合sct文件、init.s分析:

;;init.s
;The location of stacks
UserStack EQU (_STACK_BASEADDRESS-0x3800) ;0x33ff4800 ~ 0x33ff5800
SVCStack EQU (_STACK_BASEADDRESS-0x2800) ;0x33ff5800 ~
UndefStack EQU (_STACK_BASEADDRESS-0x2400) ;0x33ff5c00 ~
AbortStack EQU (_STACK_BASEADDRESS-0x2000) ;0x33ff6000 ~
IRQStack EQU (_STACK_BASEADDRESS-0x1000) ;0x33ff7000 ~
FIQStack EQU (_STACK_BASEADDRESS-0x0) ;0x33ff8000 ~
主函数 局部变量 :         //运行时,UserStack栈中,map文件里面没有
local1 : 33ff56e4
local2 : 33ff56e0
local3 : 33ff56dc
const1 : 33ff56d8
主函数 malloc指针变量 :   //运行时,堆中,map文件里面没有
p1 :       //_init_alloc(0x37000000,0x38000000-8); 
全局变量 : //Data demo.o(.data) [rw]
global1 : 322000a8
global2 : 322000ac
global3 : 322000b0
主函数 静态变量 : //Data demo.o(.data) [rw]
static1 : 322000c0
static2 : 322000c4
static3 : 322000c8
字符串常量 : //Code demo.o(.text) [ro]
char_p : 32013b28
主函数地址 : //ARM Code demo.o(.text) [ro]
demo_main : 32013a10
= = = = = = = = = = = = = = =
子函数 局部变量 : //运行时,map文件里面没有
local4 : 33ff56c8
local5 : 33ff56c4
local6 : 33ff56c0
子函数 指针变量 : //运行时,map文件里面没有
p2 :
全局变量 : //Data demo.o(.data) [rw]
global1 : 322000a8
global2 : 322000ac
global3 : 322000b0
子函数 静态变量 : //Data demo.o(.data) [rw]
static4 : 322000b4
static5 : 322000b8
static6 : 322000bc
子函数地址 : //ARM Code demo.o(.text) [ro]
function : 3201381c

sct 、 map文件分析:

; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; ************************************************************* LR_ROM1 0x32000000 0x00200000 { ; load region size_region
ER_ROM1 0x32000000 0x00200000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
} ;const data[ro] and code
;Symbol Name Ov Type Size Object(Section)
;RESET Section init.o(RESET)
;IsrIRQ ARM Code init.o(RESET)
;static U16 ReadStatus ARM Code nand.o(.text)
;static void WriteRawRCBySPI1 ARM Code nand.o(.text)
;static const U8 exchang_right Data des.o(.constdata)
;__ENTRY ARM Code init.o(RESET)
;void DelayMs ARM Code common.o(.text) RW_RAM1 0x32200000 0x04000000 { ; RW data 0x3220002c
.ANY (+RW +
ZI)//可更改的变量
} ;rw data + bss
;static char IcCardSnrFound[] Data execmd.o(.data)
;static U8 s_Buf[][] Data nfblack.o(.bss)
;int grDebugCom Data common.o(.data)
;u8 downloadbuf[*] Data fireupdate.o(.bss)
;struct USB_DEVICE_DESCRIPTOR descDev Data usbsetup.o(.bss) RW_IRAM1 0x40000000 0x00001000 {
.ANY (+RW +ZI)
}
}
 
bss段,代码段及数据段的区别[1]:
bss和data的区别:
全局的未初始化变量存在于.bss段中,具体体现为一个占位符;
全局的已初始化变量存于.data段中; .bss是不占用.exe文件空间的,其内容由操作系统初始化(清零);
而.data却需要占用,其内容由程序初始化。 若这样定义一个全局变量:int g_inBss[] ;
则它在.bss段,这里占用占位符的空间。 若这样定义一个全局变量:int g_inData[] ={,,,,,,,,};
则它在.data段,程序占用数组全部大小的空间。 bss和data的联系:
都在rw区域;
bss段在运行起来成为进程之后,占的空间大小和data就相同了。
代码段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读
(某些架构也允许代码段为可写,即允许修改程序)。
在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。
代码段是存放了程序代码的数据,假如机器 中有数个进程运行相同的一个程序,那么它们就可以使用同一个代码段。
 

参考:

1、  bss段,代码段及数据段的区别

http://blog.163.com/starjj_embeded/blog/static/2045000512012213113440344/

2、BSS段、数据段、代码段、堆与栈

http://www.cppblog.com/prayer/archive/2009/08/17/93594.html

代码中函数、变量、常量 / bss段、data段、text段 /sct文件、.map文件的关系[实例分析arm代码(mdk)]的更多相关文章

  1. 输出JS代码中的变量内容

    一. 输出JS代码中的变量内容 1. 可以直接以提示框的形式输出 alert("输出的内容"); 2. 可以输出到网页的某个位置 a. 在显示输出的位置放一个标签 <a id ...

  2. create-react-app 中设置反向代理、项目打包资源引入路径设置及 map 文件

    1.配置反向代理 (1)porxy 配置一个代理 修改package.json文件 "proxy":"http://teng.com/website/web", ...

  3. C语言基础知识点整理(函数/变量/常量/指针/数组/结构体)

    函数 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ...

  4. C++中函数变量布局小结

    把布局作为一种信仰(Layout as Religion).                                                                       ...

  5. 用闭包解决 js 循环中函数变量暂存问题

    需求:有一个数组,根据数组的值渲染对应的数字div,单击对应的div 在控制台打印对应的数字.如点击1,控制台打印1. 问题: 不管点击哪个值 打出来都是4 代码如下 <!DOCTYPE htm ...

  6. IDEA中的替换功能(替换代码中的变量名很好用哦)

    刚刚上班不久,这两天正在研究公司项目里面的代码,今天用阿里的插件扫描了一下代码,发现代码中有很多变量的命名,没有遵循驼峰式的命名规则.一开始我一个一个的修改这些变量名,后来无意中用了一下Ctrl+F( ...

  7. bss、data、text、heap(堆)与stack(栈)

    bss段: bss段(bss segment)通常是指用来存放程序中未初始化的全局变量和静态变量(static)的一块内存区域. bss是英文Block Started by Symbol的简称. b ...

  8. 下列java代码中的变量a、b、c分别在内存的______存储区存放。

    class A{ private String a = "aa"; public boolean methodB(){ String b = "sb"; fin ...

  9. python 自动获取(打印)代码中的变量的名字字串

    方法一: import inspectimport re def varname(p): for line in inspect.getframeinfo(inspect.currentframe() ...

随机推荐

  1. SQL Server配置管理WMI问题

       今天在打开数据库的时候,连接不上.一看错误就知道肯定是SQL Server的服务没开启,所以自然而然的去SQL Server配置管理中去打开,但是打开配置管理器的时候出现了下面的错误:      ...

  2. PHP冒泡排序法

    冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法.法如其名,就是像冒泡一样,每次从数组当中 冒一个最大的数出来. 冒泡排序它重复地走访过要排序的数列,一次比较两个元素,如果他 ...

  3. QQ聊天原理初识

    1:qq之间文件的传输是通过p2p通信进行的. 2:qq之间的表情发送实际上就是文字的发送,是client再接受到文字之后在本地自己进行转换 3:qq之间的通信既能够通过udp也能够通过Tcp 尽管u ...

  4. android api 中文 (74)—— AdapterView.AdapterContextMenuInfo

    前言 本章内容是android.widget.AdapterView.AdapterContextMenuInfo,版本为Android 2.3 r1,翻译来自"cnmahj",欢 ...

  5. 【iOS开发-52】假设要模仿练习,怎样找到其它应用程序的icon、使用框架等资源?

    (1)在91助手等站点下载ipa格式的安装包.假设是安卓的应该是apk格式的.此处仅仅说iOS的.比方以下这个,下载到电脑. (2)然后,找到它,右击"归档",相当于解压. (3 ...

  6. 在 Windows系统中编译node.js 源代码

    Node.js 在 Windows 下只能通过 Microsoft Visual Studio 编译,因此你需要首先安装 Visual Studio 或者免费的 Visual Studio Expre ...

  7. 在Windows Server 2008 R2 中架设 SMTP 服务器

    安装SMTP服务器 Step 1 在功能里面勾选SMTP 服务器,一路下一步完成安装 Step 2 在IIS6的SMTP属性里面的访问标签点击连接,然后设置本机可访问. (其实可以不用设置) Step ...

  8. [译]Stairway to Integration Services Level 18 – 部署和执行

    介绍 在本文中,我们要创建一个SSIS Catalog 实例,部署我们的项目,并且运行 weather data loader 包. SSIS 2012 部署模型   SSIS 2012 Deploy ...

  9. 基于maven插件的缓存控制插件

    asset-cache-control github源码及下载地址: https://github.com/StruggleBird/asset-cache-control 基于maven插件的缓存控 ...

  10. <META http-equiv=Content-Type content="text/html; charset=gb2312">

    META,网页Html语言里Head区重要标签之一 HTTP-EQUIV类似于HTTP的头部协议,它回应给浏览器一些有 用的信息,以帮助正确和精确地显示网页内容.常用的HTTP- EQUIV类型有: ...