1.汇编器的基本组件
本文引用地址:
在ARM汇编语言程序中arm汇编指令中的变量,程序以程序段为单位组织代码。节是具有特定名称的相对独立的指令或代码序列。段的类型包括代码段、数据段和通用段。代码段的内容是执行代码arm汇编指令中的变量,数据段存放的是代码在运行代码时需要用到的数据。通用段不包含用户代码和数据,所有通用段共享一个空间。部分是使用 AREA 伪操作定义的,并描述相关属性,例如
片段定义
区域初始化,代码,
…
数据段定义
面积,数据,,,对齐=3
…
等待
一个汇编程序应该至少有一个代码段,并且可以有零个或多个数据段。在格式上,一个汇编器需要至少有一个ENTRY(ENTRY的具体内容见伪算子ENTRY),还需要在汇编源文件的最后写END,表示源的结束文件。
比如一个基本的汇编源程序
区域初始化,代码,;定义一个代码段
入口 ; 标记程序入口点
R0, ;标签 Start 可以是否需要
LDR R1,0Xff
力量 R1,[R0]
LDR R0,=
LDR R1, 0x01
力量 R1,[R0]
…
结尾 ; END伪操作表示源文件结束
当汇编程序较长时,可以分为多个代码段和多个数据段。当多个段编译链接后,最终形成一个可执行的镜像文件。一个可执行的镜像文件通常由以下几部分组成
一个或多个代码段,代码段属性为只读(代码段中也放只读数据?RO)
链接器根据系统默认或用户设置的规则将各个段排列在内存中的相应位置,因此源程序中段之间的相对位置和可执行映像文件中段的相对位置一般为不一样。
2.汇编语句要注意
汇编语句格式
[标签] , [], [;]
LABEL 必须写在行首。
包括指令、伪操作、宏或伪指令。每个操作助记符必须全部大写或全部小写。写操作助记符前必须有空格。
表示操作的对象可以是常量、变量、标签、寄存器或表达式。不同的对象必须用逗号分隔。
例子:
AREA EX2,CODE, ;操作助记符前面必须有空格
GBLA DATA ;操作助记符前面必须有空格
,0x20 ;变量名DATA前不能有空格
添加 R0,R1,R2
添加 R0,R1,r2
添加 R0,R1,r2
加 R0,R1,r2 ;寄存器小写正确,指令助记符大小写错误
3.常用符号
在汇编语言中,经常使用各种符号来表示变量、常量和地址。
变量定义:使用伪操作GBLA、GBLL、GBLS分别定义全局数值变量、逻辑变量和字符变量;LCLA、LCLL、LCLS 定义了局部数值变量、逻辑变量和字符变量。使用 SETA、SETL、SETS 分配相应的变量。请注意,字符串长度不应超过 512 个字节。
例子:
GBLA数据
0x20
LCLS str1
str1 设置“笔”
LCLL液晶
lc 设置{真}
常数是在操作过程中不能改变的量。ARM 支持数字常量、逻辑常量和字符串常量。EQU 在汇编中用于定义一个数值常数,例如
测试 EQU 10;将标签 Test 的值定义为 20.
地址 EQU 0x55,;
EQU的具体使用见伪操作EQU。
数值常数一般是32的整数,可以是十进制、十六进制、n进制(n=2~9),比如8_247就是八进制数。
4.常用伪算子
符号定义伪操作
GBLA、GBLL、GBLS
LCLA、LCLL、LCLS
SETA、SETL、SET
清单
其中,RLIST用于定义通用寄存器列表的名称,该伪操作定义的名称可以在ARM指令LDM/STM中使用。在LDM/STM中,访问列表中寄存器的顺序是寄存器号从低到高的顺序。喜欢
RLIST {r0-r5,r8,r10}; 将寄存器列表名称定义为
在程序中使用
STMFD SP!, ; 要堆叠的商店列表
LDMIA R5, ; 加载列表
数据定义伪操作
DCB 分配一个连续的字节存储单元并对其进行初始化
DCW(DCWU)分配一个连续的半字存储单元并初始化
DCD(DCDU)分配一个连续的字存储单元并对其进行初始化
DCDO、DCI、DCQ (DCQU)
DCFS(DCFSU)为单精度浮点数分配一个连续的字存储单元并初始化它们
DCFD(DCFDU)为双精度浮点数分配一个连续的字存储单元并初始化它们
SPACE 分配一个连续的存储单元
场、地图、LTRG
文章来源:http://www.eepw.com.cn/article/201611/322725.htm