ARM汇编程序基本知识
1.汇编程序的基本组成
ARM汇编语言程序中,程序是以程序段为单位组织代码的。段是相对独立的指令或者代码序列,拥有特定的名称。段的种类有代码段、数据段和通用段,代码段的内容为执行代码,数据段存放代码运行时需要用到的数据,通用段不包含用户代码和数据,所有通用段共用一个空间。段使用AREA伪操作来定义,并且说明相关属性,如
代码段定义
数据段定义
等
一个汇编程序至少应该有一个代码段,可以有零或者多个数据段。在格式上,一个汇编程序需要至少有一个ENTRY(关于ENTRY具体内容看伪操作符ENTRY),还需要在汇编源文件结束处,写上END表示该源文件的结束。
如一个基本的汇编源程序
Start
当汇编程序较长时,可以分割为多个代码段和多个数据段,多个段在程序编译链接时,最终形成一个可执行的映像文件。一个可执行映像文件通常由以下几部分组成
链接器根据系统默认或者用户设定的规则,将各段安排在存储器中的相应位置,因此源程序中段之间的相对位置与可执行映像文件中的段的相对位置一般不会相同。
2.汇编语句应该注意的地方
汇编语句格式
[LABEL] OPERATION, [OPERAND], [;COMMENT]
LABEL必须在一行的开头写。
OPERATION包括指令、伪操作、宏指令或伪指令。每一条操作助记符必须全部大写或者全部小写。在写操作助记符前,必须有空格。
OPERAND 表示操作的对象,可以使常量、变量、标号、寄存器或者表达式,不同的对象之间必须用逗号分开。
例子:
DATA
3.常用符号
汇编语言中,经常使用各种符号表示变量、常量和地址。
变量的定义:使用伪操作GBLA、GBLL、GBLS,分别是定义全局的数值变量、逻辑变量和字符变量;LCLA、LCLL、LCLS定义局部的数值变量、逻辑变量和字符变量。相应的变量使用SETA、SETL、SETS来进行赋值。注意字符串长度不应超过512个字节。
例子:
DATA
常量是在运行过程中不能改变的量。ARM支持数值常量、逻辑常量和字符串常量。汇编中使用EQU来定义一个数值常量,如
Test EQU 10; 定义标号Test的值为20.
Addr EQU 0x55,CODE32;
关于EQU的具体使用,看伪操作EQU。
数值常量一般为32为的整数,可以使十进制、十六进制,也可以是n进制(n=2~9)如8_247是一个八进制数。
4.常见的伪操作符
符号定义伪操作
GBLA、GBLL、GBLS
LCLA、LCLL、LCLS
SETA、SETL、SETS
RLIST
其中RLIST用来定义通用寄存器列表名称,使用该伪操作定义的名称可以在ARM指令LDM/STM中使用。在LDM/STM中,访问列表中的寄存器次序为寄存器编号由低到高的顺序。如
RegList RLIST {r0-r5,r8,r10}; 将寄存器列表名称定义为RegList
在程序中使用
STMFD SP!, RegList ;存储列表到堆栈
LDMIA R5, RegList ; 加载列表
数据定义伪操作
DCB 分配一片连续的字节存储单元并初始化
DCW(DCWU) 分配一片连续的半字存储单元并初始化
DCD(DCDU) 分配一片连续的字存储单元并初始化
DCDO、DCI、DCQ(DCQU)
DCFS(DCFSU) 为单精度浮点数分配一片连续的字存储单元并初始化
DCFD(DCFDU) 为双精度浮点数分配一片连续的字存储单元并初始化
SPACE 分配一片连续的存储单元
FIELD、MAP、LTORG
如:
Str DCB “this is a test” ;分配一片连续的字节存储单元并初始化
Data DCW 1,2,3 ;分配一片连续的半字存储单元并初始化
Data DCD 4,5,6 ; 分配一片连续的字存储单元并初始化
Fdata DCFS 2e5,-5e-7 ;分配一片连续的字存储单元并初始化为指定的单精度数
Dspce SPACE 100 ;分配连续100字节的存储单元并初始化为0
控制伪操作
IF ELSE ENDIF
WHILE WEND
MACRO MEND;MEXIT
信息报告伪操
ARM汇编程序基本知 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)