一、数据交换指令
1) SWP: 字数据交换
i. SWP{条件} 目的寄存器, 源寄存器1, [源寄存器2] ;1 == 2交换
SWP R0, R1, [R2] ; R0 ← [R2], R1 → [R2]
SWP R0, R0, [R1] ; R0 ↔ [R1]
2) SWPB: 字节数据交换
二、移位指令
在ARM指令集中不作为单独的指令使用, 它只能作为指令格式中的一个字段, (ASL == LSL)
1) LSL 逻辑左移 (Logic shift left)
2) ASL 算术左移 (Arithmetic shift left)
3) LSR 逻辑右移
4) ASR 算术右移
5) ROR 循环右移 (Rotate right)
MOV R0, R1, LSL#2 ; 将R1的内容左移两位后存入R0
MOV R0, R1, ROR#2 ; 将R1的内容循环右移两位后存入R0
三、异常产生指令
1) SWI : 软件中断指令
i. SWI{条件} 24位的立即数
SWI 0X02 ; 调用操作系统编号02的系统例程
2) BKPT : 断点中断指令
四、伪指令
用于定义ARM汇编中的变量, 对变量赋值, 定义寄存器的别名等操作
A: Arithmetic L: Logic S: String
1) 定义全局变量: GBLA, GBLL, GBLS
i. GBLA: 定义一个全局的数字变量, 并初始化为0
ii. GBLL: 定义一个全局的逻辑变量, 并初始化为F(假)
iii. GBLS: 定义一个全局的字符串变量, 并初始化为FNLL(空)
2) 定义局部变量: LCLA, LCLL, LCLS
3) 对变量赋值: SETA, SETL, SETS
4) 为通用寄存器列表定义名称的RLIST
格式: 名称 RLIST {寄存器列表}
示例: RegList RLIST {R0-R5, R8, R10}
; 在LDM/STM中可通过RegList访问寄存器列表
说明: RLIST(register list), 定义寄存器列表名, 用于LDM/STM. 在其指令中, 列表中的寄存器访问次序
为根据寄存器的编号由低到高, 而与列表中的寄存器排列次序无关.
5) Example:
i. GBLA TEST1 ; 定义一个全局的数据变量, 变量名为TEST1
ii. TEST1 SETA 0XAA ; 将该变量赋值为0xaa
iii. GBLL TEST2
iv. TEST2 SETL {TRUE}
v. GBLS TEST3
vi. TEST3 SETS “TESTING”
五、数据定义伪指令
数据定义伪指令一般用于特定的数据分配存储单元, 同时可完成已分配存储单元的初始化. 常见的数据定义伪指令如下:
DCB DCW DCD DCFD DCFS
DCD SPACE MAP FILED
1) DCB
1. 格式: 标号 DCB 表达式
2. 说明: DCB伪指令用于分配一片连续的字节存储单元并用伪指令中指定的表达式初始化. 其中, 表达式可以为0~255的数字或字符串. DCB可以用”=”代替.
3. 示例:
Str DCB “Test String !”
; 分配一片连续的字节存储单元并初始化
2) SPACE
1. 格式: 标号 SPACE 表达式
2. 说明: SPACE伪指令用于分配一片连续的存储区域并初始化为0. 其中, 表达式为要分配的字节数. SPACE也可以用”%”代替.
3. 示例:
DataSpace SPACE 100
; 分配连续100个字节的存储单元并初始化为0
3) MAP
1. 格式: MAP 表达式{, 基址寄存器}
2. 说明: MAP用于定义一个结构化的内存表的首地址. MAP也可以用”^”代替. 表达式为程序中的标号或者数学表达式. 当基址寄存器选项不存在时, 表达式的值即为内存表的首地址. Map指令常与FIELD伪指令配合使用来定义结构化内存表.
3. 示例:
MAP TEST ;TEST就是内存表的首地址
MAP 0x100,R0 ;内存表的首地址为 R0+0x100
4) FILED
1. 格式: 标号 FIELD 表达式
2. 说明: FIELD伪指令用于定义一个结构化内存表中的数据域. FIELD也可以用”#”代替. 表达式的值为当前数据域在内存表中所占的字节数. FIELD伪指令常与map伪指令配合来定义结构化内存表. 为每一个数据域指定一个标号.
3. 示例:
MAP 0X10 ; 定义结构化内存表首地址为0x100
A FIELD 16 ; 定义A的长度为16字节, 位置: 0x100
B FIELD 32 ; 定义B的长度为32字节, 位置: 0x110
S FIELD 256 ; 定义S的长度为256字节, 位置: 0x130
a) 汇编控制伪指令
汇编空值伪指令用于控制汇编程序的执行流程, 常用的汇编控制伪指令如下:
IF ELSE ENDIF
WHILE WEND
MACRO MEND
MEXIT
1) IF
IF *逻辑表达式
*指令1
ELSE
*指令2
ENDIF
2) WHILE
WHILE *逻辑表达式
*指令序列
WEND
3)