自己整理的笔记自用,抄录老师给的课件,只是看没有印象,所以我就敲出来了,不算原创也不算翻译,考试复习用的,有需要的伙伴可以看看,个人觉得还是有逻辑的。
• 2.1 ARM处理器简介
2.1.1 ARM公司和ARM产品简介
ARM公司
本身不生产芯片,而是通过转让设计方案(IP核) 由合作伙伴(Samsung、Intel、飞思卡尔(Freescale)、意法 半导体(ST)等公司)生产各具特色的芯片。
ARM产品=ARM系列处理器
– ARM7 系列
– ARM9 系列
– ARM9E 系列
– ARM10E 系列
– ARM11 系列
– SecurCore系列
– IntelXScale系列
– IntelStrongARM系列
– Cortex 系列 最新的Cortex系列
» Cortex-A:Cortex-A72,RK3399
» Cortex-R
» Cortex-M:Cortex-M4,STM32F407
» Cortex-X
2.1.2 ARM指令集体系结构版本
2.1.3 ARM处理器系列
• 2.2 ARM指令集简介
2.2.1 RISC简介
• RISC:Reduced Instruction Set Computer,精简指令集计算机
• CISC:Complex Instruction Set Computer,复杂指令集计算机
• 采用RISC结构的处理器:
– ARM公司:ARM系列处理器
– HP公司:例如HP PA-RISC
– IBM公司:例如IBM Power-PC
– SUN公司:例如SUN
2.2.2 ARM状态和Thumb状态
• ARM指令集(指令字长为32位),Thumb指令集(指令字长为16位)
-Thumb指令集是ARM指令集的子集
-ARM指令必须在ARM状态下执行,Thumb指令必须在Thumb状态下执行
-ARM处理器可以在两种状态(ARM状态、Thumb状态)下进行切换;只要遵循ATPCS调用规则,ARM子程序(ARM指令集编写的程序)和Thumb子程序(Thumb指令集编写的程序)之间可以进行相互调用。
-ATPCS调用规则:ARM-Thumb Procedure Call Standard(ARM-Thumb过程调用标准)
-ARM状态和Thumb状态切换可以通过BX指令来实现
要记的缩写:SP,LR,PC,CPSR,SPSR
SP,堆栈指针,Stack Pointer
LR,链接寄存器,Link Register
PC,程序计数器,Program Counter
CPSR:Current Program Status Register,当前程序状态寄存器
SPSR:Saved Program Status Register,程序状态保存寄存器
图中零标志位的描述有误,应为:如果目标寄存器中的数为0,则Z=1,否则Z=0
ARM处理器的运行模式(7个)
- 系统模式(SYS,System)
- 用户模式(USR,User)
- 快速终端模式(FIQ)
- 管理员模式(SVC,Supervisor)
- 外部中断模式(IRQ)
- 数据访问终止模式(ABT,Abort)
- 未定义指令数据集模式(UND,Undefined,未定义模式)
特权模式=运行模式-用户模式
异常模式=特权模式-系统模式
2.2.3 ARM指令类型和指令的条件域
ARM指令类型(8类)
- 跳转指令
- 通用数据处理指令
- 乘法指令
- Load/Store内存访问指令
- ARM协处理器指令
- 杂项指令
- 饱和算数指令
- ARM伪指令
指令格式:<opcode>{<cond>}{S}<Rd><Rn>{,<shift_op2>}
-三个必须,三个可选:<>内为必须,{}内为可选
-opcode:指令助记符(操作码),如LDR,STR等
-cond:执行条件(条件域/条件码),如EQ,NE等,可以没有
-S:可选后缀,加S时影响CPSR中的条件码标志位,不加S时不影响
-Rd:目标寄存器
-Rn:第1个源操作数的寄存器
-op2:第2个源操作数,可以没有
-shift:位移操作,可以没有
• 位移操作的11种形式(重点)
• 位移操作的5种方式
-LSL:逻辑左移(算术左移与逻辑左移相同)
-LSR:逻辑右移
-ASR:算术右移
-ROR:循环右移
-RRX:带扩展的循环右移(加上CPSR的C位一起循环右移)
• 2.3 ARM指令的寻址方式(重要)
2.3.1 立即寻址
例如
·ADD R1,R1,#0x1 ;R1+1 -> R1 3个操作数
-#:立即寻址的前缀
-#0x:十六进制
-#0b:二进制
-#0xd:十进制
• ARM指令通常有3个操作数:1个目的操作数,2个源操作数
2.3.2 寄存器寻址
例如
-ADD R1,R1,R2 ;R1+R2 ->R1 3个操作数
-MOV R1,R0 ;R0->R1 2个操作数
2.3.3 寄存器偏移寻址(寄存器移位寻址)
例如
-ADD R1,R1,R2,ROR #0x2 ;R2循环右移2位后与R1相加,结果放入R1
-MOV R1,R0,LSL R2 ;R0逻辑左移R2位后->R1
2.3.4 寄存器间接寻址
例如
-STR R1,[R2] ;将R1存入[R2]存储单元中
-SWP R1,R1,[R2] ; [R2]和R1的内容进行交换
STR:存数指令--将寄存器中的数,存入存储器
SWP:交换指令--SWP{cond}{B}Rd,Rm,[Rn] ;先将[Rn]的内容存入Rd,再将Rm的内容存入[Rn],
;B为可选字符,若有B,
;则交换字节,否则交换32位字
2.3.5 基址变址寻址
基址变址寻址有4种形式:
零偏移(Zero Offset)
-op Rd,[Rn,R1] ;有效地址=Rn+R1
前索引偏移(Pre-Indexed)
-op Rd,[Rn,FlexOffset] ;有效地址=Rn+FlexOffset
带写回的前索引偏移(Pre-Indexed with Writeback)
-op Rd,[Rn,FlexOffset]! ;有效地址=Rn+FlexOffset,并且Rn+FlexOffset->Rn,"!"表示自增
后索引偏移(Post-Indexed)
-op Rd,[Rn],FlexOffset ;有效地址=Rn,并且Rn+FlexOffset->Rn
FlexOffset:称为灵活的偏移量,有两种形式
- #expr
- {-}Rm{,shift}
FlexOffset与op2(第2个源操作数)很相似,但是有一些不同的地方:
- #expr表示的整数范围时:-4095~+4095
- Rm不允许是R15(即PC,程序计数器)
- 有{-}选项
2.3.6 多寄存器寻址
例如
• LDMIA R0, {R1, R2, R3, R4, R5}
– [R0] -> R1
– [R0+4] -> R2
– [R0+8] -> R3
– [R0+12] -> R4
– [R0+16] -> R5
• STMIA R0, {R2-R5, R7}
– R2 -> [R0]
– R3 -> [R0+4]
– R4 -> [R0+8]
– R5 -> [R0+12]
– R7 -> [R0+16]
• LDM:批量加载(读取)指令
– 连续从一片存储器读数,送一组寄存器中
• STM:批量存储指令
– 将一组寄存器中的数,连续存入一片存储器中
• IA:后增
– 操作完成后,地址递增
2.3.7 堆栈寻址
堆栈指针(SP):R13
-堆满栈:Full Stack
-空堆栈:Empty Stack
-递增堆栈:Ascending Stack
-递减堆栈:Descending Stack
• 满递增堆栈(满增):FA
• 满递减堆栈(满减):FD
• 空递增堆栈(空增):EA
• 空递减堆栈(空减):ED
• STMFD SP!, {R1-R7, LR} ; 将LR、R7-R1,存放到堆栈中,
; LR -> [SP-4], R7 -> [SP-8], R6 -> [SP-12],
; R5 -> [SP-16], R4 -> [SP-20], R3 -> [SP-24],
; R2 -> [SP-28], R1 -> [SP-32],
;“!”表示自减
2.3.8 相对寻址
基址变址寻址的一个特例:PC作为基地址
一般用于指令跳转
BL Label ; 转到Label标签处
...
Label:
...
BL指令:带链接的跳转指令
2.3.9 块复制寻址
• STMIA R0!, {R1-R7} ;将R1~R7的数据保存到[R0]开始的存储器中,存储指 针在保存第一个值之后递增
• STMIB R0!, {R1-R7} ;将R1~R7的数据保存到[R0]开始的存储器中,存储指 针在保存第一个值之前递增
• STMDA R0!, {R1-R7} ;将R7~R1的数据保存到[R0]开始的存储器中,存储指 针在保存第一个值之后递减
• STMDB R0!, {R1-R7} ;将R7~R1的数据保存到[R0]开始的存储器中,存储指 针在保存第一个值之前递减
• IA(后增):操作完成后,地址递增
• IB(先增):地址先增,而后完成操作
• DA(后减):操作完成后,地址递减
• DB(先减):地址先减,而后完成操作
• I:增加(增),Increase
• D:减少(减),Decrease
• A:之后(后),After
• B:之前(先),Before
• !:表示自增(自减)
• 2.4 ARM指令简介
2.4.1 跳转指令
方法1:将PC值改为跳转(转移)的目的地址
例如:MOV PC,#immediate ; PC<-immediate
LDR PC,[PC,#offset] ;PC<-[PC+offset]
--LDR:取数指令
方法2:跳转指令(4条)
- B:基本的跳转指令 -指令格式:B{cond},Label
- BL:带链接的跳转指 -指令格式:BL{cond},Label
- BX:用于ARM状态和Thumb状态之间的切换 -指令格式:BX{cond},Rm ;Rm中存储了目标跳转地址
- BLX:完成指令跳转、返回位置保存、处理器工作状态切换等3个动作 -指令格式:>>BLX{cond},Rm >>BLX Label
2.4.2 通用数据处理指令
1.数据传送指令(2条)
(1)MOV:传送
(2)MVN:取反后传送
2.算术逻辑运算指令
·算术运算指令(6条)
(1)ADD:加法
(2)ADC:带进位加法
(3)SUB:减法
(4)SBC:带进位减法
(5)RSB:逆向减法 RSB R1,R2,R3 ;R3-R2-> R1
(6)RSC:带进位逆向减法
·逻辑运算指令(4条)
(1)AND:逻辑与
(2)ORR:逻辑或
(3)EOR:逻辑异或
(4)BIC:位清零
3.比较指令
(1)TST:位测试指令 -TST R1,R2 ;R1和R2按位进行逻辑与操作
(2)TEQ:相等测试指令 -TEQ R1,R2 ;R1和R2按位进行逻辑异或操作
(3)CMP:比较指令 -CMP R1,R2 ;R1和R2相减
(3)CMN:反值比较指令 -CMN R1,R2 ;R1和R2相加
4.前导零计数指令(1条)
CLZ 指令格式:op{cond} Rd,Rm
例如
-CLZ R1,R2 ;统计R2中从高位开始连续零的个数,
;结果放到R1中;如果R2=0,则结果为32;
;如果R2=0x0FF00000,则结果为4
2.4.3 乘法指令
1.MUL和MLA指令(2条)
(1)MUL:乘法指令(32位X32位->取64位的低32位)
– 指令格式:MUL {cond} {S} Rd, Rm, Rs
– 例子:MUL R1, R2, R3 ;R2XR3 -> R1
(2)MLA:乘加指令(32位X32位+32位->取64位的低32位)
– 指令格式:MLA {cond} {S} Rd, Rm, Rs, Rn
– 例子:MLA R1, R2, R3, R4 ;R2XR3+R4 -> R1
2.UMULL、UMLAL、SMULL和SMLAL指令(4条)
(1)UMULL:无符号长整形乘法指令(32位x32位=64位)
(2)UMLAL:无符号长整形乘加指令(32位x32位+32位=64位)
(3)SMULL:带符号长整形乘法指令(32位X32位=64位)
(4)SMLAL:带符号长整形乘加指令(32位X32位+32位=64位)
3.SMULxy和SMLAxy指令(2条)
(1)SMULxy:16位带符号乘法指令(16位x16位=32位)
(2)SMLAxy:16位带符号乘加指令(16位X16位+32位=32位)
指令格式:
– SMUL {cond} Rd, Rm, Rs
– SMLA {cond} Rd, Rm, Rs, Rn
– x、y:分别对应第一个操作数和第二个操作数,可以是B或T,B时取操作数的低16 位,T时取操作数的高16位
例子:
– SMULBT R1,R2,R3 ;R2[15:0] X R3[31:16] -> R1
– SMLABT R1,R2,R3,R4 ;R2[15:0] X R3[31:16] + R4 -> R1
4.SMULWy和SMLAWy指令(2条)
(1)SMULWy:32位x16位(取48位的高32位)带符号乘法指令
(2)SMLAWy:32位x16位(取48位的高32位)带符号乘加指令
指令格式:
– SMULW {cond} Rd, Rm, Rs
– SMLAW {cond} Rd, Rm, Rs, Rn
– y:对应第二个操作数,可以是B或T,B时取操作数的低16位,T时取操作 数的高16位
2.4.4 Load/Store内存访问指令
1.LDR和STR指令(2条)
(1)LDR:从存储器读数,送寄存器
(2)STR:将寄存器中的数,存入存储器
---共有3种情况
- 字(32位)或无符号字节(8位)传输
– 指令格式:
» op{cond} {B} {T} Rd,[Rn]
» op{cond} {B} Rd,[Rn, FlexOffset] {!} ;(带写回的)前索引偏移
» op{cond} {B} Rd,label
» op{cond} {B} {T} Rd,[Rn],FlexOffset ;后索引偏移
» B:加上此后缀,表示进行无符号字节传输,Rd[7:0]
» T:加上此后缀,内存系统会认为处理器运行在用户模式上,虽然可能处理器 实际是运行在特权模式下
- 半字(16位)或带符号字节(8位)传输
– 指令格式:
» op{cond} type Rd,[Rn]
» op{cond} type Rd,[Rn, Offset] {!} ;(带写回的)前索引偏移
» op{cond} type Rd,label
» op{cond} type Rd,[Rn],Offset ;后索引偏移
» type:(S:带符号;H:半字(16位);B:字节(8位))
• SH:带符号的半字 适用指令:LDR
• H :无符号的半字 适用指令:LDR、STR
• SB:带符号的字节 适用指令:LDR
- 双字(64位)传输
– 指令格式:
» op{cond} D Rd,[Rn]
» op{cond} D Rd,[Rn, Offset] {!} ;(带写回的)前索引偏移
» op{cond} D Rd,label
» op{cond} D Rd,[Rn], Offset ;后索引偏移
» D:表示双字(64位)
2.LDM和STM指令(2条)
LDM:批量加载(连续从一片存储器读数,送一组寄存器中)
STM:批量存储(将一组寄存器中的数,连续存入一片存储器中)
• 指令格式:
op{cond} mode Rn{!}, reglist{^}
– mode(8种,2大类):
» 用于数据的加载和存储(4种)
• IA(后增):操作完成后,地址递增
• IB(先增):地址先递增,而后完成操作
• DA(后减):操作完成后,地址递减
• DB(先减):地址先递减,而后完成操作
» 用于堆栈操作(4种)
• FA(满增):满递增堆栈
• FD(满减):满递减堆栈
• EA(空增):空递增堆栈
• ED(空减):空递减堆栈
» 缩写含义:
• I:增加,Increase
• D:减少,Decrease
• A:之后(后),After
• B:之前(先),Before
• F:满,Full
• E:空,Empty
– Rn:存储器的有效地址
– {!}:表示自增(自减)
– reglist:表示多个寄存器集合
• STMIB = STMFA • LDMIB = LDMED
• STMIA = STMEA • LDMIA = LDMFD
• STMDB = STMFD • LDMDB = LDMEA
• STMDA = STMED • LDMDA = LDMFA
3.SWP指令(1条)
• SWP:交换指令,用于寄存器和存储器之间的内容交换
• 指令格式:SWP{cond} {B} Rd, Rm, [Rn]
– 先将[Rn]的内容存入Rd,再将Rm的内容存入[Rn]
– B:表示交换的数据是字
4.PLD指令(1条)
• PLD:预读取指令,指示存储器系统在接下去的几条指令中很可能会有Load指令,存储系统以此做好相应的准备,从而加速内存访问过程
• 指令格式:PLD [Rn{, FlexOffset}]
– Rn:对应内存地址的基地址– FlexOffset:灵活的偏移量,用于基址变址寻址
2.4.5 ARM协处理器指令
– ARM共有16个协处理器(Coprocessor,P0-P15)
1、CDP和CDP2指令(2条)
• (1)CDP:协处理器数据处理指令
– 指令格式:CDP {cond} coproc, opcode1, CRd, CRn, CRm {, opcode2}
» coproc:协处理器的名字(16个,P0-P15)
» CRd、CRn、CRm:协处理器寄存器(16个,C0-C15)
» opcode1、opcode2:协处理器相关的操作码
• (2)CDP2:协处理器数据处理指令(不能条件执行)
– 指令格式:CDP2 coproc, opcode1, CRd, CRn, CRm {, opcode2}
• 例子:
– CDP P3, 2, C12, C10, C3, 4
– CDP2 P6, 1, C3, C4, C5 ;完成协处理器P6的初始化
2、LDC、STC、LDC2和STC2指令(4条)
• (1)LDC:将存储器的内容,复制到协处理器寄存器中
• (2)STC:将协处理器寄存器的内容,复制到存储器中
– 指令格式:
» op {cond} {L} coproc, CRd, [Rn]
» op {cond} {L} coproc, CRd, [Rn, #{-}offset]{!}
» op {cond} {L} coproc, CRd, [Rn],#{-}offset
» L:表示长整数传送 » coproc:协处理器的名字
» CRd:协处理器寄存器 ;零偏移 ;(带写回的)前索引偏移 ;后索引偏移
• (3)LDC2:将存储器的内容,复制到协处理器寄存器中(不能进行条件执行,且没有L后缀)
• (4)STC2:将协处理器寄存器的内容,复制到存储器中(不能进行条件执行,且没有L后缀)
– 指令格式:
» op coproc, CRd, [Rn]
» op coproc, CRd, [Rn, #{-}offset]{!}
» op coproc, CRd, [Rn],#{-}offset
• 例子:
– LDC P5, C2, [R4, #0x8]! ;零偏移 ;(带写回的)前索引偏移
– STC P6, C2, [R3], #-0x7 ;后索引偏移 ;将[R4+#0x8] -> P5的C2 ; 将P6的C2 -> [R3]
3、MCR、MCR2和MCRR指令(3条)
• (1)MCR:将ARM的寄存器内容,传送到协处理器的寄存器中
– 指令格式:MCR {cond} coproc, opcode1, Rd, CRn, CRm {, opcode2}
• (2)MCR2:将ARM的寄存器内容,传送到协处理器的寄存器中(不能 进行条件执行)
– 指令格式:MCR2 coproc, opcode1, Rd, CRn, CRm {, opcode2}
• (3)MCRR:将ARM的寄存器内容,传送到协处理器的寄存器中(只有 1个协处理器相关的操作码)
– 指令格式:MCRR {cond} coproc, opcode1, Rd, Rn, CRm
4、MRC、MRC2和MRRC指令(3条)
• (1)MRC:将协处理器的寄存器内容,传送到ARM的寄存器中
– 指令格式:MRC {cond} coproc, opcode1, Rd, CRn, CRm {, opcode2}
• (2)MRC2:将协处理器的寄存器内容,传送到ARM的寄存器中(不 能进行条件执行)
– 指令格式:MCR2 coproc, opcode1, Rd, CRn, CRm {, opcode2}
• (3)MRRC:将协处理器的寄存器内容,传送到ARM的寄存器中(只 有1个协处理器相关的操作码)
– 指令格式:MRRC {cond} coproc, opcode1, Rd, Rn, CRm
• 例子:
– MRC P4, 3, R1, C5, C6, 1 ;将协处理器P4的C5、C6寄存器内容,传送到ARM的寄存器R1中
2.4.6 杂项指令
1、SWI指令(1条)
• SWI:软件中断指令
– 指令格式:SWI {cond} immed_24
» immed_24:表示24位的立即数
2、MRS和MSR指令(2条)
• (1)MRS:状态寄存器(CPSR、SPSR)读指令
– 指令格式:
» MRS {cond} Rd, psr ; psr-> Rd
• psr:CPSR或SPSR
• (2)MSR:状态寄存器(CPSR、SPSR)写指令
– 指令格式:
» MSR {cond} _, #immed_8r ; #immed_8r -> psr
» MSR {cond} _, Rm ; Rm-> psr
• psr:CPSR或SPSR
• field:CPSR或SPSR的域(4个域)
• 标志位域:f,[31,24]
• 状态域:s,[23,16]
• 扩展域:x,[15,8]
• 控制域:c,[7,0]
• #immed_8r:8位结构的常数
• 例子:
– MRS R5, SPSR ; SPSR -> R5
– MSR CPSR_f, R7 ;R7->CPSR_f,即更新状态寄存器的标志位
3、BKPT指令(1条)
• BKPT:断点指令,使ARM处理器进入Debug模式
– 指令格式:BKPT immed_16
» immed_16:16位的整数
2.4.7 饱和算术指令
• 4条指令:
• (1)QADD指令:加法指令,Q位会被置位
• (2)QSUB指令:减法指令,Q位会被置位
• (3)QDADD指令:加法指令,饱和运算,SAT(Rm+ SAT(RnX2))
• (4)QDSUB指令:减法指令,饱和运算,SAT(Rm-SAT(RnX2))
– Q位(Q标识位):CPSR的第27位,在ARM V5的E系列处理器中,CPSR的 bit[27]称为q标识位,主要用于指示增强的dsp指令是否发生了溢出。同样的 spsr的bit[27]位也称为q标识位,用于在异常中断发生时保存和恢复CPSR中的Q 标识位。在ARM V5以前的版本及ARM V5的非E系列的处理器中,Q标识位没 有被定义
– SAT:饱和运算
• 指令格式:op {cond} Rd, Rm, Rn
2.4.8 ARM伪指令
1、ADR:小范围的地址读取伪指令(用于读取基于PC相对偏 移的地址或基于寄存器相对偏移的地址)
2、ADRL:中等范围的地址读取伪指令
3、LDR:大范围的地址读取伪指令
4、NOP:空操作伪指令
• 2.5 Thumb指令简介
2.5.1 Thumb跳转指令
1、B:基本的跳转指令
• 指令格式:B{cond}, label
2、BL:带链接的长跳转指令
• 指令格式:BL label
3、BX:在跳转的同时,会选择性的切换指令集
• 指令格式:BX Rm
4、BLX:带链接的跳转,并选择性的切换指令集
• 指令格式:– BLX Rm
– BLX label
2.5.2 Thumb通用数据处理指令
1、AND、ORR、EOR和BIC指令(4条)
2、ASR、LSL、LSR和ROR指令(4条)
3、CMP和CMN指令(2条指令)
4、MOV、MVN和NFG指令(3条指令)
• (1)MOV:传送指令
• (2)MVN:反值(按位取反)传送指令
• (3)NFG:负值(乘以-1)传送指令
5、TST指令(1条)
• TST:位测试
2.5.3 Thumb算术指令
1、低寄存器(R0-R7)的ADD(加法)和SUB(减法)指令
2、高寄存器(R8-R15)或低寄存器(R0-R7)的ADD(加法)指令
3、SP(堆栈指针)的ADD(加法)和SUB(减法)指令
• 指令格式:– ADD SP, #expr
– SUB SP, #exp
4、PC或SP相关的ADD(加法)指令
• 指令格式:– ADD Rd, Rp, #expr
» Rd:R0-R7
» Rp:SP或PC
5、ADC(带进位的加法)、SBC(带进位的减法)和MUL(乘法)指令
• 指令格式:– op Rd, Rm
2.5.4 Thumb内存访问指令
1、立即数偏移的LDR(取数)和STR(存数)指令
2、寄存器偏移的LDR(取数)和STR(存数)指令
共有8种形式:
– (1)LDR:取数(4个字节)指令
– (2)STR:存数(4个字节)指令
– (3)LDRH:取数(2个字节无符号数)指令
– (4)LDRSH:取数(2个字节带符号数)指令
– (5)STRH:存数(2个字节)指令
– (6)LDRB:取数(1个字节无符号数)指令
– (7)LDRSB:取数(1个字节带符号数)指令
– (8)STRB:存数(1个字节)指令
3、PC或SP相关的LDR(取数)和STR(存数)指令
4、PUSH(压栈)和POP(出栈)指令
• 指令格式:
– PUSH {reglist}
– POP {reglist}
– PUSH {reglist, LR}
– POP {reglist, pc}
» LR:LR(R14),连接寄存器
» SP:SP,R13,堆栈指针
» PC:PC,R15,程序计数器
5、LDMIA和STMIA指令
• LDM:批量加载(连续从一片存储器读数,送一组寄存器中)
• STM:批量存储(将一组寄存器中的数,连续存入一片存储器中)
• IA(后增):先完成指令操作,再完成地址递增
• 指令格式:– op Rn!, {reglist}
» !:表示自增(自减)
2.5.5 Thumb软中断和断点指令
1、SWI:软中断指令,会引起SWI异常,导致处理器切换到ARM 状态
• 指令格式:– SWI immed_8
2、BKPT:断点指令,使ARM处理器进入Debug模式
• 指令格式:– BKPT immed_8
2.5.6 Thumb伪指令
1、ADR
Thumb伪指令:读取一个程序的相对地址到寄存器
• 指令格式:ADR register, expr
2、LDR
Thumb伪指令:读取32位的常量到低寄存器(R0-R7)中
• 指令格式:LDR register, =[expr | label-exp]