ARM处理器有37个寄存器,其中31个通用寄存器,6个程序状态寄存器。
R0~R7为不分组的通用寄存器,R8~R14为分组寄存器—不同工作模式下寄存器不同
R13:指向堆栈栈顶指针SP
R14:用作程序链接寄存器LR–指向函数的返回地址
R15:程序计数器pc–记录程序运行的位置
程序状态寄存器:
CPSR:保存程序运行的状态
SPSR:只有异常模式存在,保存CPSR的值,又分为SPSR_SVC SPSR_abt SPSR_und SPSR_IRQ
SPSR_UND
CPSR/SPSR寄存器格式:
低五位决定工作模式: 用户模式 FIQ快速中断 IRQ中断 管理状态 中止 未定义
系统。
第六位(T)决定工作状态: 1 Thumb 0 ARM
第七位(F)快速中断禁止位:1 允许 0 禁止
第八位(I)IRQ中断禁止位: 1 允许 0 禁止
.
.
.
高四位:条件码标志位
汇编指令:
1、跳转指令
B{条件} 目标地址
BL 跳转返回:跳转时将PC指针记录在LR中 返回时:MOV PC LR
2、MOV指令
MOV 寄存器 源操作数(立即数 寄存器)
3、MVN指令
MVN 寄存器 源操作数(立即数 寄存器)
将源操作取反存入寄存器中
4、CMP指令
CMP 操作数1 操作数2
根据比较结果更新CPSR的位
5、TST 测试指令
TST{条件}操作数1 操作数2
用于把寄存器的内容和另一个寄存器或立即数按位与,根据测试结果更新CPSR的值
6、ADD指令
ADD 寄存器 操作数1 操作数2
7、SUB指令
SUB 寄存器 操作数1 操作数2
8、AND逻辑与指令
AND 寄存器 操作数1 操作数2
9、ORR 逻辑或
ORR 寄存器 操作数1 操作数2
10、BIC位清零指令
BIC 寄出器 操作数1 操作数2
BIC R0 R1(0xff) #0x03 等于 r0= R1&(~0x03)
= 0xfc
11、MUL乘法指令
MUL 寄存器 操作数1 操作数2
程序状态寄存器访问指令
MRS{}通用寄存器 程序状态寄存器
MRS R0 CPSR 将CPSR中的值给R0
MSR{}程序状态寄存器 通用寄存器(立即数)
MSR SPSR R0 将R0赋值给SPSR
MSR CPSR #0x77 将立即数赋值给CPSR
示例:
存储器指令—加载存储指令
LDR指令
LDR R0 [R1]将存储器地址为R1的数据读出来存在寄存器R0当中—-寄存器间接寻址
LDR R0 [R1+R2]将存储器地址为R1+R2的数据读入寄存器R0当中—-寄存器间接寻址
LDR R0 [R1+#8]将存储器地址为R1+8的数据读入寄存器R0当中
LDR R0 [R1+R2]!
将存储器地址为R1+R2的户数读入寄存器R0当中,并将R1+R2的新地址存入R1当中
LDRB指令
LDR{}B 寄存器 存储器
把存储器低8位数取出来存在寄存器R0中,并将R0的高24位清0
LDR{}H指令 寄存器 存储器
把存储器低16位数取出来存在寄存器R0中,并将R0的高16位清0
STR指令
STR{}源寄存器 存储器地址
STR用于将源寄存器中的数据一个32位的数传送到存储器中
STR R0, [R1], #8;将R0中数据写入以R1为地址的存储器当中,并将新地址R1+8.
STR R0,[R1+R2+#8];将R0中数据写入以R1+R2+8为地址的存储器中
LDM、STM指令–在一片连续存储空间和多个寄存器之间传输数据
常见用途:将多个寄存器内容入栈或出栈
LDM/STM 寄存器列表 {存储}
示例:LDMFD R13!,{R0,R4-R12,PC};将堆栈内容恢复到寄存器(R0,R4到R12和PC);
STMFD
R13!,{R0,R4-R12,PC};将寄存器列表中的寄存器存入到堆栈。
SWAP交换指令
SWAP 目的寄存器 源寄存器 存储器
将存储器中的数据存入目的寄存器中,再将源寄存器中的数存入存储器中
SWAP R0 R1 [R2]
SWAP R0 R0 [R2]
移位指令:其不作为单独的指令使用,它只作为指令格式中的一个字段,移位操作包括5种类型
逻辑左移:LSL MOV R0,R1,LSL#2;将R1左移2位赋值给R0;
算术左移:ASL MOV
R0,R1,ROR#2;将R1循环右移2位赋值给R0;
逻辑右移:LSR
算术右移:ASR
循环右移:ROR MOV R0,R1,ROR#2;将R1循环右移2位赋值给R0;
异常产生指令:
SWI 软件中断指令
BKPT 断点中断指令
伪指令
分为符号定义伪指令、数据定义伪指令、汇编控制伪指令、宏指令以及其他伪指令
一.符号定义伪指令:用于定义ARM汇编程序中的变量、对变量赋值以及定义寄存器的别名;
常见的符号定义伪指令有如下几种:
定义全局变量的GBLA、GBLL和GBLS;
定义局部变量的LCAL、LCLL和LCLS;
对变量赋值的SETA、SETL、SETS;
为通用寄存器列表定义名称的RLIST。
语法格式:
1、GBLA(GBLL/GBLS) 全局变量名
含义:用于定义一个ARM程序中的全局变量,并将其初始化。
GBLA:定义一个全局的数字变量,并将其初始化为0。
GBLL:定义一个全局的逻辑变量,并初始化为假FALSE。
GBLS:定义一个全局的字符串变量,并初始化为空。
示例:
GBLA tes1 定义一个全局数字变量tes1
以上三条伪指令用于定义全局变量,所以变量名在程序中应该唯一。
2、对变量赋值
SETA:对数字变量赋值;
SETL:对逻辑变量赋值;
SETS:对字符串变量赋值;
示例:
GBLA tes
tes SETA 0xaa
GBLL tes1
tes1 SETL {TRUE}
GBLS tes3
tes3 SETS "nihao"
3、对一个通用寄存器列表定义名称
语法格式:RLIST {寄存器列表}
RLIST伪指令用于对一个寄存器列表定义名称,
使用该伪指令定义的列表名称可在ARM指令LDM/STM中使用。
LDM/STM指令中,列表中的寄存器访问次序是根据寄存器的编号顺序由高到低,
与列表中的寄存器排名无关。
使用示例
RSGlist RLIST {R0-R5,R8,R14};将寄存器列表定义为RSGlist。
二、数据定义伪指令
1、DCB 用于分配一片连续的字节存储单元并初始化。
语法格式:标号 DCB 表达式
示例:str DCB "THis is china" ,DCB也可以用“=”代替。
2、SPACE 分配一定大小字节的空间
语法格式:标号 SPACE 表达式
示例:buf SPACE 100; 连续分配100字节大小的空间,SPACE也可以用“%”代替。
3、MAP指令 定义一个结构化的寄存器的首地址
语法格式:MAP 表达式{,基址寄存器}
表达式可以为程序中的表号或数字表达式,基址寄存器位可选项
示例:MAP 0x100,R0 定义结构化首地址的值为0x100和R0,MAP也可以用“^”代替。
4、FIELD指令 定义一个结构化内存表中的数据域
语法格式:标号 FIEL 表达式
与MAP一起使用
MAP 0X100;
A FIELD 16 定义A的长度16字节,位置为0X100;
三、汇编控制伪指令
常见伪指令:
IF、ELSE、ENDIF
WHILE WEND
MACRO、MEND
MEXIT
1、IF指令 相当于C语言中的“if”
2、WHILE指令 相当于“while”
四、其他伪指令
1、AREA指令 用于定义一个代码段或数据段
AREA 段名 属性1,属性2
CODE属性:定义代码段,默认为READONLY
DATA属性:定义数据段,默认为READWRITE,
READONLY属性:本段刻度
READWRITE属性:本段可读可写
2、ALIGN指令 按字节对齐
AREA init,CODE,READONLY,ALIGN = 3;指定后面的代码段为8字节对齐,2^3;
3、CODE16 CODE32 16是THUMB指令 32是ARM指令
AREA init,CODE,READONLY,ALIGN = 3;
…..
CODE32;通知编译器后面的指令为32位的ARM指令。
4、ENTRY 指定汇编程序的入口点 相当于C语言中的“main”
5、EQU 宏定义 相当于C语言中的“#define”
语法格式:名称,EQU,表达式
示例:tes1 EQU 50;定义tes1的值为50;
6、EXPORT指令
语法格式:EXPORT 标号 声明一个全局可以引用的标号;
7、IMPORT
语法格式:IMPORT 标号,别的程序输出,自己导入
8、END 表明程序结束。