ARM指令
用户模式
- 不分组寄存器(R0-R7)
- 分组寄存器(R8-R14)
- 程序计数器pc(R15)
- 状态寄存器CPSR
ARM处理器
- ARM状态(32位对齐指令的ARM指令)
- Thumb状态(16位对齐指令的Thump指令)
ARM指令集
- 跳转指令
- B 无条件跳转
- BL 带链接的无条件跳转
- BX 带状态切换的无条件跳转
- BLX 带链接和状态的无条件跳转
- B loc_地址
- BNE 不相等跳转地址;BEQ 相等跳转地址
- 存储器和寄存器交互数据指令
存储器(主存,内存)
寄存器中的数据(字符串,数,地址,各种类型数据)
LDR 从存储器中加载数据到寄存器 <- load
LDR R8,[R9,#04] R8为寄存器,加载值为R9+#04所指向的存储单元
STR 将寄存器的数据加载到存储器 -> store
STR R8,[R9,#04] 将R8寄存器中数据存储到R9+#04所指向的存储单元
LDM 将存储器的数据加载到一个寄存器列表 ->
LDM R0, {R1-R3} 将R0指向的存储单元的数据依次加载到R1,R2,R3寄存器
STM 将一个寄存器列表的数据存储到指定存储器 <-
PUSH 将寄存器值推入堆栈
POP 将堆栈的值推出到寄存器
SWP 将寄存器与存储器之间的数据进行交换
SWP R1,R1 [R0] 将R1寄存器与R0指向存储单元内容进行交换
- 数据传送指令
- MOV 立即数或寄存器的数据数据传送到目标寄存器
- MOV R0,#8 R0=#8
- 数据算术运算指令
- ADD,SUB,MUL,DIV
- 有符号,无符号运算,带进位运算
- 数据逻辑运算指令
与 ADD
或 ORR
异或 EOR
LSL 逻辑左移
LSR 逻辑右移
LSL R0,R1,#2 R0=R1*2
- 比较指令
- CMP
- CMP R0 #0 R0寄存器中值与0比较
- 标志位
- 其他指令
- 伪处理器指令 SWT (切换用户模式)
- 伪指令 DCB
- 寄存器寻址指令
- 7种,常见的5种
- 立即寻址 MOV R0,#1234
- 寄存器寻址 MOV R0 , R1
- 寄存器移位寻址 MOV R0, R1,LSL #2 R0=R1*4
- 寄存器间接寻址 LDR R0 ,[R1] R1寄存器值作为地址赋R0
- 寄存器间接基址偏移寻址 LDR R0,[R1,#-4]将R1寄存家的值-0x4作为地址,取出地址中的值赋R0
ARM 指令收集
—SUB指令—
1
2
3减法指令SUB (SUBtract)
格式: SUB A,B //A=A-B;
功能: 两个操作数的相减,即从A中减去B,其结果放在A中.—CMP指令—
1
2
3比较指令CMP
格式: CMP A,B // A-B;
功能: 两个操作数的相减,即从A中减去B,其结果会影响标志位, 对标志位的影响与SUB指令相同。本条指令主要是用于配合条件转移指令使用。如JZ ZF=0时,跳转—条件转移指令 JE/JZ—
1
2
3
4
5格式: JE/JZ标号 //等于跳转
功能: ZF=1,转到指定地址执行
说明:
1. 指令JE与JZ等价,它们是根据标志位ZF进行转移的指令
2. JE,JZ均为一条指令的两种助记符表示方法—str指令—
1
2
3
4
5
6
7格式:str{条件} 源寄存器,<存储器地址>
功能:将源寄存器中数据存到存储器地址中
说明:
str r1,[r2] ; 将r1中的值存到r2所指定的地址中
str r1,[r2,#4] ;将r1中的值存到r2+4所指定的地址中
str r1,[r2],#4 ;将r1中的值存到r2所指定的地址中, 同时r2=r2+4—LDR LDM指令—
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25A.LDR加载指令 从右往左
格式为:LDR{条件} 目的寄存器,<存储器地址>
功能:LDR指令用亍从存储器中将一个32位的字数据传送到目的寄存器中
说明:
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。
ldr r0,[r1,#8]! ;将存储器地址为R1+8的字数据读入寄存器R0,幵将新地址R1+8写入R1。
ldr r0,[r1],r2 ;将存储器地址为R1的字数据读入寄存器R0,幵将新地址R1+R2写入R1。
ldr r0,[r1,r2,lsl#2]! ;将存储器地址为R1+R2×4的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。
ldr r0,[r1],r2,lsL#2 ;将存储器地址为R1的字数据读入寄存器R0,幵将新地址R1+R2×4写入R1。”
B.伪指令
格式:LDR{条件} 目的寄存器,<存储器地址>
功能:
说明:将COUNT的值赋给R0
LDR R1,=COUNT
LDR R0,[R1]
LDR R1,=COUNT这条伪指令,是怎样完成将COUNT的地址赋给R1,有兴趣的可以看它编译后的结果。这条指令实际上会编译成一条LDR指令和一条DCD伪指令。
B.LDM记载指令
从左往右—B,BL,BX,BLX 指令—
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21A.B跳转指令
格式:B addr
功能:跳转指令B使程序跳转到指定的地址执行程序。
说明:
B 0x1234 ;跳转到绝对地址0x1234处。
B.BL带返回的连接跳转
格式:
功能:BL指令用于实现子程序调用。子程序的返回可通过将LR寄存器的值复制到PC寄存器来实现。下面的指令可实现子程序返回:(1)、BX R14 (2)、MOV PC,R14
说明:
BL func ;跳转到子程序func处执行,同时将当前pc值保存到LR中。
C.BX跳转并切换状态
格式:BX{<cond>} <Rm>
功能:带状态切换的跳转指令BX使程序跳转到指令中指定的参数Rm指定的地址执行程序。若 Rm 的 bit[0] 为1,切换到 Thumb 指令执行;若 Rm 的 bit[0] 为0,切换到 ARM 指令执行。
说明:
BX R0 ;跳转到R0中的地址,如果R0[0]=1,则进入Thumb状态。
D.BLX带返回的跳转并切换状态
格式:
功能:该指令为无条件执行指令—BEQ BNE指令—
1
2
3
4
5
6
7a.BEQ指令
格式: BEQ
功能: 相等跳转
b.BNE指令
格式: BNE
功能: 不想等跳转——-.w——
1
代表32位
——CHP——
1
比较指令