4.1.1 ARM汇编语言中的程序结构
在ARM/Thumb汇编语言程序中,程序是以程序段(Section)的形式呈现的。程序段是具有特定名称的相对独立的指令或数据序列。程序段有两大类型:代码段(Code Section)和数据段(Data Section)。代码段的主要内容为执行代码,而数据段则存放代码运行时需要用到的数据。一个汇编语言程序应当至少包含有一个代码段,但当程序较长时,可以将一个长的代码段或者数据段分割为多个代码段或者多个数据段,然后通过程序编译链接(Link)最终形成一个可执行的映像文件。
一个可执行映像文件通常由以下几部分构成。
一个或多个代码段,代码段的属性为只读(RO)。
零个或多个包含初始化数据的数据段,数据段的属性为可读写(RW)。
零个或多个不包含初始化数据的数据段,数据段的属性为可读写(RW)。
链接器(Linker)根据系统默认或用户设定的规则,将各个段安排在存储器中的相应位置。因此源程序中段之间的相对位置与可执行的映像文件中段的相对位置一般不会相同。
下面,让我们来看一个汇编语言的基本结构实例:
- AREA Init , CODE , READONLY ;定义一
个名为Init的只读代码段 - ENTRY ;标识程序的入口点
- start
- LDR R0 , =0x31000000 ;加载地址到R0
- LDR R1 , 0xff ;加载数据到R1
- STR R1 , [R0] ;存储R1中的
数据到R0中的地址 - LDR R0 , =0x31000008 ;加载地址到R0
- LDR R1 , 0x01 ;加载数据到R1
- STR R1 , [R0] ;存储R1中
的数据到R0中的地址 - ……
- END ;代码段结束
该实例中主要包括以下知识点。
AREA是一条伪指令,主要作用是定义一个段,可以是代码段也可以是数据段,并说明所定义段的相关属性。本例中,它定义了一个名为Init的代码段,并且表明其属性为只读。段名也常常用"| |"括起来表示。
ENTRY也是一条伪指令,它的主要作用是标识程序的入口点,其后面主要为指令序列,程序的末尾为段的结束标志伪指令END,该伪指令告诉编译器源文件的结束,每一个汇编程序段都必须有一条END伪指令,指示代码段的结束。
注意:
代码的编写规范格式,通过设置相应的缩进格式,可以方便我们阅读代码。实例中,所有的指令必须有缩进,为了程序美观只是一个方面的原因,另一个方面的原因是在汇编语言中,任何顶格编写的单词或者助记符都会被编译器当做一个地址标识而不是汇编指令。如实例中的start,它不是伪指令,它是下面一段代码的地址标识符。