关于RO、RW、ZI的说明

参考文章:

ARM中RO、RW和ZI DATA说明

http://mcuos.com/thread-2843-1-1.html

STM32后生成编译文件大小探索

http://www.cnblogs.com/51mcu/p/3940376.html

hex、bin、elf、axf文件区别

http://wenku.baidu.com/link?url=jnO4kGRmKoGA8SGl6wN9nZboEAPUqnZGs0_XYk743E47wCTF5a7CRjbpRaJaeG92Voe92dqWOxYKsRRRP3PC4wYMZA65udxGU25EBcR3vmW

ARM程序的组成,是指在ARM系统中正在执行的程序,而非保存在ROM中的bin映像(image)文件,这一点清注意区别。

RO是程序中的指令和常量【readonly】

RW是程序中的已初始化变量【read/write】

ZI是程序中的未初始化的变量【zero】

ARM映像文件的组成,是指烧录到ROM中的bin文件,也成为image文件。以下用Image文件来称呼它。

Image文件包含了RO和RW数据。之所以Image文件不包含ZI数据,是因为ZI数据都是0,没必要包含,只要程序运行之前将ZI数据所在的区域一律清零即可。包含进去反而浪费存储空间。

bin文件大小 = RO + RW + CODE

注意:bin文件仅包含纯粹的二进制数据

hex文件除了数据本身,还包含地址信息,因此hex文件稍大

axf文件包含调试信息。

RO中的指令包含如下功能:

1、将RW从ROM中搬到RAM,因为RW是变量,不能存在ROM中

2、将ZI所在的RAM区域全部清零,因为ZI区域并不再image中,所以需要程序根据编译器给出的ZI地址以及大小将对应的RAM区域清零,ZI中也是变量,不能存在ROM中

<span style="white-space:pre">	</span>    Prog1:
            #include <stdio.h>
            void main(void)
            {
            ;
            }
            Prog2:
            #include <stdio.h>
            const char a = 5;
            void main(void)
            {
            ;
            }
            Prog1编译出来后的信息如下:
            ================================================================================
            Code RO Data RW Data ZI Data Debug
            948 60 0 96 0 Grand Totals
            ================================================================================
            Total RO Size(Code + RO Data) 1008 ( 0.98kB)
            Total RW Size(RW Data + ZI Data) 96 ( 0.09kB)
            Total ROM Size(Code + RO Data + RW Data) 1008 ( 0.98kB)
            ================================================================================
            Prog2编译出来后的信息如下:
            ================================================================================
            Code RO Data RW Data ZI Data Debug
            948 61 0 96 0 Grand Totals
            ================================================================================
            Total RO Size(Code + RO Data) 1009 ( 0.99kB)
            Total RW Size(RW Data + ZI Data) 96 ( 0.09kB)
            Total ROM Size(Code + RO Data + RW Data) 1009 ( 0.99kB)
            ================================================================================

Prog1和Prog2的RO相差一个字节。

<span style="white-space:pre">	</span>    Prog3:
            #include <stdio.h>
            void main(void)
            {
            ;
            }
            Prog4:
            #include <stdio.h>
            char a = 5;
            void main(void)
            {
            ;
            }
            Prog3编译出来后的信息如下:
            ================================================================================
            Code RO Data RW Data ZI Data Debug
            948 60 0 96 0 Grand Totals
            ================================================================================
            Total RO Size(Code + RO Data) 1008 ( 0.98kB)
            Total RW Size(RW Data + ZI Data) 96 ( 0.09kB)
            Total ROM Size(Code + RO Data + RW Data) 1008 ( 0.98kB)
            ================================================================================
            Prog4编译出来后的信息如下:
            ================================================================================
            Code RO Data RW Data ZI Data Debug
            948 60 1 96 0 Grand Totals
            ================================================================================
            Total RO Size(Code + RO Data) 1008 ( 0.98kB)
            Total RW Size(RW Data + ZI Data) 97 ( 0.09kB)
            Total ROM Size(Code + RO Data + RW Data) 1009 ( 0.99kB)
            ================================================================================

Prog3和Prog4的RW相差一个字节

<span style="white-space:pre">	</span>    Prog3:
            #include <stdio.h>
            void main(void)
            {
            ;
            }
            Prog4:
            #include <stdio.h>
            char a;
            void main(void)
            {
            ;
            }
            Prog3编译出来后的信息如下:
            ================================================================================
            Code RO Data RW Data ZI Data Debug
            948 60 0 96 0 Grand Totals
            ================================================================================
            Total RO Size(Code + RO Data) 1008 ( 0.98kB)
            Total RW Size(RW Data + ZI Data) 96 ( 0.09kB)
            Total ROM Size(Code + RO Data + RW Data) 1008 ( 0.98kB)
            ================================================================================
            Prog4编译出来后的信息如下:
            ================================================================================
            Code RO Data RW Data ZI Data Debug
            948 60 0 97 0 Grand Totals
            ================================================================================
            Total RO Size(Code + RO Data) 1008 ( 0.98kB)
            Total RW Size(RW Data + ZI Data) 97 ( 0.09kB)
            Total ROM Size(Code + RO Data + RW Data) 1008 ( 0.98kB)
            ================================================================================

Prog3和Prog4的ZI相差一个字节。

总结:

1、指令以及常量被编译后是RO类型数据

2、未初始化为0的变量编译后是ZI类型数据

3、已被初始化为非0值的变量编译后是RW类型数据

时间: 2024-08-02 18:57:31

关于RO、RW、ZI的说明的相关文章

基于ARM处理器的反汇编器软件简单设计及实现

写在前面 2012年写的,仅供参考 反汇编的目的 缺乏某些必要的说明资料的情况下, 想获得某些软件系统的源代码.设计思想及理念, 以便复制, 改造.移植和发展: 从源码上对软件的可靠性和安全性进行验证,对那些直接与CPU 相关的目标代码进行安全性分析: 涉及的主要内容 分析ARM处理器指令的特点,以及编译以后可执行的二进制文件代码的特征: 将二进制机器代码经过指令和数据分开模块的加工处理: 分解标识出指令代码和数据代码: 然后将指令代码反汇编并加工成易于阅读的汇编指令形式的文件: 下面给出个示例

汇编指令大全

blt   小于跳转 tst r0,#02 bne sleep ldr  r1,#0 解释:位比较,先进行and运算,如果r0第2位不为1,则与的结果为0,设置标志位zero=1,继续下面的ldr指令.反之,zero=0,跳转到sleep执行. bne指令: 非零则跳转 个人总结:tst 和bne连用: 先是用tst进行位与运算,然后将位与的结果与0比较,如果不为0,则跳到bne紧跟着的标记(如bne sleep,则跳到sleep处). tst 和beq连用: 先是用tst进行位与运算,然后将位

ARM程序剖析--ARM程序结构,Image文件结构等

ZCShou标签: ARM程序,Image文件 说明:1.今天学习到ARM程序,于是到网上找了不少资料,发现真正有用的并不是很多.而且经过我的实际测试,与网上部分大神说的有不少出入. 2.测试环境 WinXp  RVDS2.2的编译器和连接器 3.关于测试使用的工具            一.ARM程序的组成 此处所说的"ARM程序"是指在ARM系统中正在执行的程序,而非保存在ROM中的映像(image)文件.烧录到ROM中的image文件与实际运行时的ARM程序之间并不是完全一样的.

ARM汇编指令汇总

1.ARM汇编的格式:    在ARM汇编里,有些字符是用来标记行号的,这些字符要求顶格写:有些伪码是需要成对出现的,例如ENTRY和END,就需要对齐出现,也就是说他们要么都顶格,要么都空相等的空,否则编译器将报错.常量定义需要顶格书写,不然,编译器同样会报错.    2.字符串变量的值是一系列的字符,并且使用双引号作为分界符,如果要在字符串中使用双引号,则必须连续使用两个双引号.    3.在使用LDR时,当格式是LDR r0,=0x022248,则第二个参数表示地址,即0x022248,同

解决 Error L6915E 问题

出现以下错误: Error: L6915E: Library reports error: The semihosting __user_initial_stackheap cannot reliably set up a usable heap region if scatter loading is in use __user_initial_stackheap应该是一个初始化堆栈的函数,这个函数被__user_setup_stackheap取代,我们需要自己重新定义这个函数来解决这个问题,

Keil sct分散加载文件

首先介绍几个概念: 1.ARM映像文件 ARM映像文件是一个层次性结构的文件,其中包含了域(region).输出段(output section)和输入段(input section).各部分关系如下: 一个映像文件由一个或多个域组成 每个域包含一个或多个输出段 每个输出段包含一个或多个输入段 各输入段包含了目标文件中的代码和数据 输入段中包含了4类内容:代码.已经初始化的数据.未经初始化的存储区域.内容初始化成0的存储区域.每个输入段有相应的属性,可以为只读的(RO).可读写的(RW)以及初始

MDK链接脚本错误

我想让我的程序运行在RAM中而不是在SPI FLASH上,写了一个scatterfile: ROM 0x00000000 0x00200000 ;spi flash{STARTUP +0 { startup.o(RESET, +First) ;*(+RO) }RO 0x20000000 0x00020000 ;运行地址RAM中 { *(+RO) *(+RW) *(+ZI) }} 链接时出现错误: Error: L6202E: entry.o(.ARM.Collect$$$$00000000) c

7 Scatter-loading Features

7.1 About scatter-loading The scatter-loading mechanism enables you to specify the memory map of an image to the linker using a description in a text file. Scatter-loading gives you complete control over the grouping and placement of image components

MDK编译器内存分配

转:https://blog.csdn.net/zuixin369/article/details/76195186?locationNum=7&fps=1 Keil MDK编译器完成编译链接后,在调试窗口会出现Code,RO,RW,ZI 四种内存分配区域,下面说明其中的意思. Code区:代码区.该区域除了存放指令外,还有全局.静态及局部变量的初始化值.当函数被调用时,该函数用code区内局部变量初始化值来初始化堆栈区内分配的局部变量. RO区:常量区.该区域存放那种类型的数据呢?有字符串常量

30多张图来了解Keil5的使用

Keil IDE 工具学习 前言 学习过近4年的STM32,通过正点原子的视频还有资料入门的,里面的资料很齐全.可是我很少去看除了视频,原理图,中文手册之外的资料.但是最近翻看了一下那些资料发现了许多的宝藏,比如,CM3权威指南,Ucos-ii的讲解,个人对基础比较喜欢,所以没有去看关于界面EmWin等资料.但是在此之前我解决问题基本靠百度,在座不知道有多少和我一样,哈哈哈哈,遇到问题是完全没有任何头绪,而且心里特别浮躁,想着赶紧解决了,有时候想拿起基础,却又发现无法耐下性子. 从上一段描述,不