代码中函数、变量、常量 / bss段、data段、text段 /sct文件、.map文件的关系[实例分析arm代码(mdk)]
函数代码://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)]的更多相关文章
- 输出JS代码中的变量内容
一. 输出JS代码中的变量内容 1. 可以直接以提示框的形式输出 alert("输出的内容"); 2. 可以输出到网页的某个位置 a. 在显示输出的位置放一个标签 <a id ...
- create-react-app 中设置反向代理、项目打包资源引入路径设置及 map 文件
1.配置反向代理 (1)porxy 配置一个代理 修改package.json文件 "proxy":"http://teng.com/website/web", ...
- C语言基础知识点整理(函数/变量/常量/指针/数组/结构体)
函数 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ...
- C++中函数变量布局小结
把布局作为一种信仰(Layout as Religion). ...
- 用闭包解决 js 循环中函数变量暂存问题
需求:有一个数组,根据数组的值渲染对应的数字div,单击对应的div 在控制台打印对应的数字.如点击1,控制台打印1. 问题: 不管点击哪个值 打出来都是4 代码如下 <!DOCTYPE htm ...
- IDEA中的替换功能(替换代码中的变量名很好用哦)
刚刚上班不久,这两天正在研究公司项目里面的代码,今天用阿里的插件扫描了一下代码,发现代码中有很多变量的命名,没有遵循驼峰式的命名规则.一开始我一个一个的修改这些变量名,后来无意中用了一下Ctrl+F( ...
- bss、data、text、heap(堆)与stack(栈)
bss段: bss段(bss segment)通常是指用来存放程序中未初始化的全局变量和静态变量(static)的一块内存区域. bss是英文Block Started by Symbol的简称. b ...
- 下列java代码中的变量a、b、c分别在内存的______存储区存放。
class A{ private String a = "aa"; public boolean methodB(){ String b = "sb"; fin ...
- python 自动获取(打印)代码中的变量的名字字串
方法一: import inspectimport re def varname(p): for line in inspect.getframeinfo(inspect.currentframe() ...
随机推荐
- BZOJ 1003: [ZJOI2006]物流运输trans(最短路+dp)
1A,爽! cost[i][j]表示从第i天到第j天不改路线所需的最小花费,这个可以用最短路预处理出.然后dp(i)=cost[j][i]+dp(j-1)+c. c为该路线的花费. --------- ...
- 加装 ImageMagick 性能更佳!
1. 下载 Download ImageMagick 以此文件ImageMagick-6.9.1-10-Q16-x64-dll-win进行,第二次开发的研发 2. 安装 Install ImageMa ...
- Symfony框架系列----1.入门安装
一.安装 (1)Composer安装(可选) $ curl -s https://getcomposer.org/installer | php $ php composer.phar crea ...
- JAVA GUI学习 - 总结
一:项目 二:重要组件补充 三:组件高级操作
- poj 2375 Cow Ski Area bfs
这个题目用tarjan找联通块,缩点,然后统计出入度为0的点理论上是可行的,但问题是会暴栈.考虑到这个题目的特殊性,可以直接用一次bfs找到数字相同且联通的块,这就是一个联通块,然后缩点,统计出入度即 ...
- android AChartEngine源代码
昨天翻自己曾经下过的apache开源project项目,看到一个AChartEnginee看了一下自带的Demo才意识到这个东西的强大.立刻想把源代码down一份,在CSDN上有人挂5分让人下载,实在 ...
- Objective-c 方法的调用
在书写了类的声明和实现后,应用程序如何去调用它呢? 在Objective-c中,调用方法的简单格式如下: 1⃣ [实例 方法]; 如: [person setAge:32]; 其中 pe ...
- Java多线程之synchronized(四)
前面几章都是在说synchronized用于对象锁,无论是修饰方法也好修饰代码块也好,然而关键字synchronized还可以应用到static静态方法上,如果这样写,那就是对当前的*.java文件所 ...
- 常用类库StringBuilder
1.使用StringBuilder拼接字符串实例: string[] lines = File.ReadAllLines("sdjk.txt", Encoding.Default) ...
- asp.net使用unescape读取js escape编码过的字符串
escape() 是JavaScript的编码函数 例子:var esstring=escape("helloworld"); 为了防止数据传输读取中出现乱码现象,字符串往往要用J ...