嵌入式系统 第二讲 ARM处理器和指令集

自己整理的笔记自用,抄录老师给的课件,只是看没有印象,所以我就敲出来了,不算原创也不算翻译,考试复习用的,有需要的伙伴可以看看,个人觉得还是有逻辑的。

• 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个)

  1. 系统模式(SYS,System)
  2. 用户模式(USR,User)
  3. 快速终端模式(FIQ)
  4. 管理员模式(SVC,Supervisor)
  5. 外部中断模式(IRQ)
  6. 数据访问终止模式(ABT,Abort)
  7. 未定义指令数据集模式(UND,Undefined,未定义模式)

特权模式=运行模式-用户模式

异常模式=特权模式-系统模式

2.2.3 ARM指令类型和指令的条件域

ARM指令类型(8类)

  1. 跳转指令
  2. 通用数据处理指令
  3. 乘法指令
  4. Load/Store内存访问指令
  5. ARM协处理器指令
  6. 杂项指令
  7. 饱和算数指令
  8. 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条)

  1. B:基本的跳转指令        -指令格式:B{cond},Label
  2. BL:带链接的跳转指        -指令格式:BL{cond},Label
  3. BX:用于ARM状态和Thumb状态之间的切换        -指令格式:BX{cond},Rm        ;Rm中存储了目标跳转地址
  4. 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]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个没有天赋的软工大学生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值