代码中函数、变量、常量 / 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() ...
随机推荐
- 操作百度API
string json = ""; try { //虽然两者都是异步请求事件,但是WebClient是基于事件的异步,而HttpWebRequst是基于代理的异步编程 WebCli ...
- hrtimer 高精定时器使用例子
在kernel,有个线程每个十秒往上层系统上报battery及USB的状态信息. 加入直接sleep 10 秒的话,插入USB的时候不能及时更新状态,这个时候就可以使用 hrtimer + wait ...
- jquery ajax 使用
异步刷新实现方式有多种,也可以借助JS的多种框架,下面是使用JQuery框架实现的AJAX 验证用户名是否存在 jQuery.ajax概述 HTTP 请求加载远程数据. 通过jQuery 底层 AJA ...
- Lotus Sametime
编辑 Lotus Sametime属于IBM旗下的Lotus软件,包括一个成熟的协作平台提供商. 外文名 Lotus Sametime 属 于 IBM旗下的Lotus软件 包 括 一个成熟 ...
- 帝国cms <!--list.var1-->,<!--list.var2-->的终极用法
谢寒原创,转载注明. 在制作帝国cms列表时,如果我们希望同每篇文章之后就会有一条横线,或者分线代码,我们就需要用到多个<!--list.var—> 比如我们需要这样的效果 文章1 文章 ...
- Qt5位置相关函数异同详解(附源码)
Qt5中提供了丰富的位置和区域大小相关函数.下面讲一讲他们的区别. 主要函数: 1.x(),y(),pos():获取整个窗体左上角的坐标位置. 2.frameGeometry():获取整个窗体左上角的 ...
- 获取中央气象台API 完整城市列表简单方式
activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android& ...
- 数据结构与算法分析 3.4&3.5 — 链表的交与并算法
代码: #include <list> template<typename ElementType> list<ElementType> Intersect(con ...
- 制作cdlinux u盘启动
U盘一个 CDlinux的iso镜像文件 UltraISO grub4dos grubinst 方法/步骤1 1 [第一步]:用UltraISO把CDlinux的镜像刻录进U盘. 打开UltraISO ...
- junit学习笔记(二):hamcrest和TestSuit
1. hamcrest hamcrest可以有效增加junit的测试能力,用一些对通俗语言来进行测试. Hamcrest 是一个测试的框架,它提供了一套通用的匹配符 Matcher,灵活使用这些匹配符 ...