Presentation is loading. Please wait.

Presentation is loading. Please wait.

(第2版).

Similar presentations


Presentation on theme: "(第2版)."— Presentation transcript:

1 (第2版)

2 主讲内容 第1章 嵌入式系统概述 第2章 ARM微处理器概述与编程模型 第3章 ARM9指令系统 第4章 嵌入式程序设计基础
第1章 嵌入式系统概述 第2章 ARM微处理器概述与编程模型 第3章 ARM9指令系统 第4章 嵌入式程序设计基础 第5章 嵌入式内部可编程模块 第6章 嵌入式接口技术应用 第7章 软件开发环境

3 第3章 ARM9指令系统 ARM处理器的寻址方式 ARM指令集 Thumb指令集  

4 3.1 ARM处理器的寻址方式 寻址方式是处理器根据指令中给出的地址信息来寻找物理地址的方式。 目前ARM指令系统支持8种寻址方式。
寄存器寻址 立即寻址 寄存器间接寻址 变址寻址 寄存器移位寻址 多寄存器寻址 堆栈寻址 相对寻址

5 寄存器寻址 寄存器寻址就是利用寄存器中的内容作为操作数,寄存器本身就是操作数地址。这种寻址方式是各类微处理器经常采用的一种方式,也是一种执行效率较高的寻址方式。 例如指令: MOV R2, R3 ;R2←R3 R3中的内容赋给R2 ADD R2,R3,R4 ;R2←R3+R R3和R4中的内容相加,结果赋给R2 0xAA 0x55 R3 R2 0xAA MOV R2,R3

6 立即寻址 立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操作数没有存储在寄存器或存储器中,而是包含在指令的操作码中,只要取出指令也就取到了操作数。这个操作数被称为立即数,对应的寻址方式也就叫做立即寻址。 例如指令: MOV R0,#0xFF000 ;将立即数0xFF000装入R0寄存器 ADD R1,R1,#0x7f ; R1←R1+0x7f 在以上两条指令中,第二个源操作数即为立即数,要求以“#”为前缀,对于以十六进制表示的立即数,还要求在“#”后加上“0x”。 0x55 R0 MOV R0,#0xFF00 程序存储 从代码中获得数据 0xFF00 MOV R0,#0xFF00

7 3.1.3 寄存器间接寻址 寄存器间接寻址就是以寄存器中的内容作为操作数的地址,而操作数本身存放在存储器中。例如指令 :
寄存器间接寻址 寄存器间接寻址就是以寄存器中的内容作为操作数的地址,而操作数本身存放在存储器中。例如指令 : LDR R1,[R2] ;R1←[R2] STR R1,[R2] ;[R2]←R1 第一条指令将以R2中的内容为地址,将该地址中的数据传送到R1中。 第二条指令将R1中的内容传送到以R2中的内容为地址的存储器中。 0x55 R1 R2 0x 0xAA 0xAA LDR R1,[R2]

8 变址寻址 变址寻址就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。变址寻址方式常用于访问某基地址附近的地址单元。 例如指令: LDR R0,[R1,#8] ;R0←[R1+8] LDR R0,[R1,#8]! ;R0←[R1+8],R1←R1+8 LDR R0,[R1],#2 ;R0←[R1],R1←R1+2 LDR R0,[R1,R2] ;R0←[R1+R2] 0x55 R0 R1 0x 0xAA 0x 将R1+0x08作为地址装载数据 0xAA LDR R0,[R1,#0x08]

9 寄存器移位寻址 寄存器移位寻址是ARM指令集独有的寻址方式,操作数由寄存器的数值进行相应移位而得到;移位的方式在指令中以助记符的形式给出,而移位的位数可用立即数或寄存器寻址方式表示。 ARM微处理器内嵌的桶型移位器(Barrel Shifter),移位操作在ARM指令集中不作为单独的指令使用,它只能作为指令格式中的一个字段,在汇编语言中表示为指令中的选项。 例如,数据处理指令的第2个操作数为寄存器时,就可以加入移位操作选项对它进行各种移位操作。移位操作包括如下6种类型.

10 3.1.5 寄存器移位寻址 LSL(或ASL)操作 格式为: 通用寄存器,LSL(或ASL) 操作数
寄存器移位寻址 LSL(或ASL)操作 格式为: 通用寄存器,LSL(或ASL) 操作数 LSL(或ASL)可完成对通用寄存器中的内容进行逻辑(或算术)的左移操作,按操作数所指定的数量向左移位,低位用零来填充,最后一个左移出的位放在状态寄存器的C位CPSR[29]中,如图3-1所示。 其中,操作数可以是通用寄存器,也可以是立即数(0~31)。

11 3.1.5 寄存器移位寻址 ;将R1中的内容左移4位后传送到R0中, ;其中把最后移出的位赋给程序状态寄存器的C位CPSR[29]。
寄存器移位寻址 31 C 30 29 1 操作示例: MOV R0, R1, LSL#4 ;将R1中的内容左移4位后传送到R0中, ;其中把最后移出的位赋给程序状态寄存器的C位CPSR[29]。

12 3.1.5 寄存器移位寻址 LSR操作 格式为: 通用寄存器,LSR 操作数
寄存器移位寻址 LSR操作 格式为: 通用寄存器,LSR 操作数 LSR可完成对通用寄存器中的内容进行右移的操作,按操作数所指定的数量向右移位,左端用零来填充,最后一个右移出的位放在状态寄存器的C位CPSR[29]中,如图3-2所示。其中,操作数可以是通用寄存器,也可以是立即数(0~31)。

13 3.1.5 寄存器移位寻址 ;将R1中的内容右移4位后传送到R0中。 ;其中把最后移出的位赋给程序状态寄存器的C位CPSR[29]。
寄存器移位寻址 31 C 30 29 1 操作示例: MOV R0, R1, LSR#4 ;将R1中的内容右移4位后传送到R0中。 ;其中把最后移出的位赋给程序状态寄存器的C位CPSR[29]。

14 3.1.5 寄存器移位寻址 ROR(Rotate Right)操作 格式为: 通用寄存器,ROR 操作数
寄存器移位寻址 ROR(Rotate Right)操作 格式为: 通用寄存器,ROR 操作数 ROR可完成对通用寄存器中的内容进行循环右移的操作,按操作数所指定的数量向右循环移位,右端移出的位填充在左侧的空位处,最后一个右移出的位同时也放在状态寄存器的C位CPSR[29]中,如图3-3所示。其中,操作数可以是通用寄存器,也可以是立即数(0~31)。

15 3.1.5 寄存器移位寻址 操作示例: MOV R0, R1, ROR#4 ;将R1中的内容循环右移4位后传送到R0中,
寄存器移位寻址 31 C 30 29 1 操作示例: MOV R0, R1, ROR#4 ;将R1中的内容循环右移4位后传送到R0中, ;其中把最后移出的位赋给程序状态寄存器的C位CPSR[29]。

16 3.1.5 寄存器移位寻址 ASR操作 格式为: 通用寄存器,ASR 操作数
寄存器移位寻址 ASR操作 格式为: 通用寄存器,ASR 操作数 ASR可完成对通用寄存器中的内容进行右移的操作,按操作数所指定的数量向右移位,最左端的位保持不变,最后一个右移出的位放在状态寄存器的C位CPSR[29] ,如图3-4所示。其中,操作数可以是通用寄存器,也可以是立即数(0~31)。 这种移位对有符号数据使用时可以保持符号位不变。

17 3.1.5 寄存器移位寻址 操作示例: MOV R0, R1, ASR#4 ;将R1中的内容右移4位后传送到R0中,符号位保持不变。
寄存器移位寻址 31 C 30 29 1 操作示例: MOV R0, R1, ASR#4 ;将R1中的内容右移4位后传送到R0中,符号位保持不变。 ;最后移出的位同时也送入状态位C中。

18 3.1.5 寄存器移位寻址 RRX操作 RRX操作的格式为: 通用寄存器,RRX 操作数
寄存器移位寻址 RRX操作 RRX操作的格式为: 通用寄存器,RRX 操作数 RRX可完成对通用寄存器中的内容进行带扩展的循环右移的操作,按操作数所指定的数量向右循环移位,左侧空位由状态寄存器C位来填充,右侧移出的位移进状态位C中,如图3-5所示。其中,操作数可以是通用寄存器,也可以是立即数(0~31)。

19 3.1.5 寄存器移位寻址 ;将R1中的内容进行带扩展的循环右移两位后传送到R0中。 操作示例: MOV R0, R1, RRX#2 31
寄存器移位寻址 31 C 30 29 1 操作示例: MOV R0, R1, RRX#2 ;将R1中的内容进行带扩展的循环右移两位后传送到R0中。

20 3.1.6 多寄存器寻址 使用多寄存器寻址指令时,寄存器子集的顺序是按由小到大的顺序排列,连续的寄存器可用“-”连接;否则用“,”分隔书写。
多寄存器寻址 采用多寄存器寻址方式,一条指令可以完成多个寄存器值的传送。这种寻址方式可以一次对多个寄存器寻址,多个寄存器由小到大排列,最多可传送16个寄存器。 例如: LDMIA R1!,{R2-R4,R5} ;R2←[R1] ;R3←[R1+4] ;R4←[R1+8] ;R5←[R1+12] 该指令的后缀IA表示在每次执行完加载/存储操作后,R1按字长度增加,因此,指令可将连续存储单元的值传送到R2~R5。 0x R1 R2 0x?? 0x01 R3 R4 R5 0x02 0x03 0x04 0x 0x 0x C 存储器 0x01 0x02 0x03 0x04 使用多寄存器寻址指令时,寄存器子集的顺序是按由小到大的顺序排列,连续的寄存器可用“-”连接;否则用“,”分隔书写。 0x LDMIA R1!,{R2-R4,R5}

21 堆栈寻址 堆栈是一种数据结构,按先进后出(First In Last Out,FILO)的方式工作,使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。 当堆栈指针指向最后压入堆栈的数据时,称为满堆栈(Full Stack);而当堆栈指针指向下一个将要放入数据的空位置时,称为空堆栈(Empty Stack)。 同时,根据堆栈的生成方式,又可以分为递增堆栈(Ascending Stack)和递减堆栈(Decending Stack),当堆栈由低地址向高地址生成时,称为递增堆栈,当堆栈由高地址向低地址生成时,称为递减堆栈。 栈顶 SP 栈底 空堆栈 满堆栈 压栈 0x 压栈 0x 栈顶 SP 0x 栈顶 SP

22 3.1.7 堆栈寻址 ARM微处理器支持这四种类型的堆栈工作方式,即:
堆栈寻址 ARM微处理器支持这四种类型的堆栈工作方式,即: 满递增方式FA(Full Ascending):堆栈指针指向最后入栈的数据位置,且由低地址向高地址生成。 满递减方式FD(Full Decending):堆栈指针指向最后入栈的数据位置,且由高地址向低地址生成。 空递增方式EA(Empty Ascending):堆栈指针指向下一个入栈数据的空位置,且由低地址向高地址生成。 空递减方式ED(Empty Decending):堆栈指针指向下一个入栈数据的空位置,且由高地址向低地址生成。

23 相对寻址 与基址变址寻址方式相类似,相对寻址以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。以下程序段完成子程序的调用和返回,跳转指令BL采用了相对寻址方式: BL NEXT;跳转到子程序NEXT处执行 …… NEXT MOV PC,LR;从子程序返回

24 3.2 ARM指令集 ARM微处理器的指令集是加载/存储型的.
即指令集仅能处理寄存器中的数据,处理结果仍要放回寄存器中,而对系统存储器的访问则需要通过专门的加载/存储指令来完成。 ARM9指令集,包括 ARM指令集 Thumb指令集。 首先介绍ARM指令的基本格式及灵活的操作数,然后介绍条件码,再把ARM指令集、Thumb指令集按类分别说明。

25 <opcode> {<cond>} {S} <Rd> ,<Rn>{,<op2>}
指令格式 ARM指令的基本格式如下: <opcode> {<cond>} {S} <Rd> ,<Rn>{,<op2>} 其中<>号内的项是必须的,{}号内的项是可选的。各项的说明如下: opcode:指令助记符; cond:执行条件; S:是否影响CPSR寄存器的值; Rd:目标寄存器;Rn:第1个操作数的寄存器; op2:第2个操作数;

26 <opcode> {<cond>} {S} <Rd> ,<Rn>{,<op2>}
3.2 指令集介绍 ARM指令集——第2个操作数 ARM指令的基本格式如下: <opcode> {<cond>} {S} <Rd> ,<Rn>{,<op2>} 灵活的使用第2个操作数“op2”能够提高代码效率。它有如下的形式: #immed_8r——常数表达式; Rm——寄存器方式; Rm,shift——寄存器移位方式;

27 3.2 指令集介绍 ARM指令集——第2个操作数 #immed_8r——常数表达式
3.2 指令集介绍 ARM指令集——第2个操作数 #immed_8r——常数表达式 该常数必须对应8位位图,即必须是一个8位的常数通过循环右移偶数位可以得到的数。 循环右移10位 0x00 0x12 1 移位前的8位常数0x12 0x00 0x80 1 0x04 移位后得到的常数0x

28 3.2 指令集介绍 ARM指令集——第2个操作数 例如: MOV R0,#1 AND R1,R2,#0x0F
3.2 指令集介绍 ARM指令集——第2个操作数 #immed_8r——常数表达式 该常数必须对应8位位图,即必须是一个8位的常数通过循环右移偶数位可以得到的数。 例如: MOV R0,#1 AND R1,R2,#0x0F MOV R1,#0xC000 ;0xC000可由0x03循环右移16位得到

29 ? × √ 思考与练习 1.以下8位图立即数是否合法? 2.请列举2个8位图立即数? 0x0103C000 0x12800000
可以由0x4A循环右移10位得到 × 2.请列举2个8位图立即数? 0x B(0xED循环右移2位) 0x0016C000(0x5B循环右移18位)

30 3.2 指令集介绍 ARM指令集——第2个操作数 Rm——寄存器方式 在寄存器方式下,操作数即为寄存器的数值。 例如:
3.2 指令集介绍 ARM指令集——第2个操作数 Rm——寄存器方式 在寄存器方式下,操作数即为寄存器的数值。 例如: SUB R1,R1,R2 MOV PC,R0

31 条件码 当处理器工作在ARM状态时,几乎所有的指令均根据CPSR中条件码的状态和指令的条件域有条件的执行。当指令的执行条件满足时,指令被执行,否则指令被忽略。 每一条ARM指令包含4位的条件码,位于指令的最高4位[31:28]。条件码共有16种,每种条件码可用两个字符表示,这两个字符可以添加在指令助记符的后面和指令同时使用。例如,跳转指令B可以加上后缀EQ变为BEQ表示“相等则跳转”,即当CPSR中的Z标志置位时发生跳转。 在16种条件标志码中,只有15种可以使用。

32 3.2.2 条件码 条件码 助记符后缀 标 志 含 义 0000 EQ Z置位 相等 0001 NE Z清零 不相等 0010 CS C置位
条件码 条件码 助记符后缀 标 志 含 义 0000 EQ Z置位 相等 0001 NE Z清零 不相等 0010 CS C置位 无符号数大于或等于 0011 CC C清零 无符号数小于 0100 MI N置位 负数 0101 PL N清零 正数或零 0110 VS V置位 溢出 0111 VC V清零 未溢出 1000 HI C置位Z清零 无符号数大于 1001 LS C清零Z置位 无符号数小于或等于 1010 GE N等于V 带符号数大于或等于 1011 LT N不等于V 带符号数小于 1100 GT Z清零且(N等于V) 带符号数大于 1101 LE Z置位或(N不等于V) 带符号数小于或等于 1110 AL 忽略 无条件执行

33 3.2.2 条件码 示例: C代码: if(a > b) a++; else b++; 对应的汇编代码: CMP R0,R1
条件码 示例: C代码: if(a > b) a++; else b++; 对应的汇编代码: CMP R0,R1 ;R0与R1比较 ADDHI R0,R0,#1 ;若R0>R1,则R0=R0+1 ADDLS R1,R1,#1 ;若R0≤R1,则R1=R1+1

34 ARM 存储器访问指令 ARM微处理器内部没有RAM,而ARM除了寄存器(即R0~R15)外没有别的存储单元;在以ARM为核的嵌入式系统中,所有的外围模块都和存储单元一样,是ARM微处理器的不同的地址单元。不管这些模块的功能如何(如输入/输出、定时器、存储器等),也不管这些模块的位置如何(如片内或片外),ARM微处理器都把它们看作是外部存储器。其操作过程和对存储器的操作是相同的。

35 ARM 存储器访问指令 因此,在ARM微处理器的数据传送中,数据的源和数据的目标只有两种:一种是ARM的寄存器R0~R15;另一种就是外部存储器(它们可能是外围模块的寄存器、外部数据存储器或可访问的程序存储器等)。 我们把数据从存储器到寄存器的传送叫加载,数据从寄存器到存储器的传送叫存储。 存储器 寄存器(R0-R15) ARM微处理器 外围模块或芯片 存储 加载

36 3.2.3 ARM 存储器访问指令 加载指令:LDR 目标寄存器,源地址 存储指令:STR 源寄存器,目标地址 存储器 源地址 目标寄存器

37 ARM 存储器访问指令 加载/存储指令可分为3类: 单一数据加载/存储指令 批量数据加载/存储指令 数据交换指令

38 3.2.3 ARM 存储器访问指令 1.单一数据加载/存储指令 (1)LDR指令 格式为:

39 3.2.3 ARM 存储器访问指令 指令示例: LDR R3,[R4] ;将存储器地址为R4的字数据读入寄存器R3。
零偏移: 如:LDR Rd,[Rn] 前索引偏移: 如:LDR Rd,[Rn,#0x04]! 程序相对偏移: 如:LDR Rd,labe1 后索引偏移: 如:LDR Rd,[Rn],#0x04 指令示例: LDR R3,[R4] ;将存储器地址为R4的字数据读入寄存器R3。 LDR R3,[R1,R2] ;将存储器地址为R1+R2的字数据读入寄存器R3。 LDR R3,[R1,#8] ;将存储器地址为R1+8的字数据读入寄存器R3。 LDR R3,[R1,R2]! ;将存储器地址为R1+R2的字数据读入寄存器R3,并将新地址R1+R2写入R1。 LDR R3,[R1,#8] ! ;将存储器地址为R1+8的字数据读入寄存器R3,并将新地址R1+8写入R1。

40 3.2.3 ARM 存储器访问指令 应用示例: LDR R3,[R4];将R4指向地址的字数据存入R3 0x55 R3 R4

41 3.2.3 ARM 存储器访问指令 LDR R3,[R1],R2 ;将存储器地址为R1的字数据读入寄存器R3,并将新地址R1+R2写入R1。
LDR R3,[R1,R2,LSL#3]! ;将存储器地址为R1+R2×8的字数据读入寄存器R3,并将新地址R1+R2×8写入R1。 LDR R3,[R1],R2,LSL#3 ;将存储器地址为R1的字数据读入寄存器R3,并将新地址R1+R2×8写入R1。 注:R15不可以作为偏移寄存器使用。

42 3.2.3 ARM 存储器访问指令 (2)LDRB指令 格式为: LDR{条件}B 目的寄存器,<存储器地址>
该指令通常用于从存储器中读取8位的字节数据到通用寄存器,然后对数据进行处理。

43 3.2.3 ARM 存储器访问指令 指令示例: LDRB R3,[R1] ;将存储器地址为R1的字节数据读入寄存器R3,并

44 3.2.3 ARM 存储器访问指令 (3)LDRH指令 格式为: LDR{条件}H 目的寄存器,<存储器地址>

45 3.2.3 ARM 存储器访问指令 指令示例: LDRH R3,[R1]
;将存储器地址为R1的半字数据读入寄存器R3,并将R3的高16位清零。 LDRH R3,[R1,#8] ;将存储器地址为R1+8的半字数据读入寄存器R3,并 将R3的高16位清零。 LDRH R3,[R1,R2] ;将存储器地址为R1+R2的半字数据读入寄存器R3, 并将R3的高16位清零。

46 3.2.3 ARM 存储器访问指令 (4)STR指令 格式为: STR{条件} 源寄存器,<存储器地址>
STR指令是字存储指令,用于从源寄存器中将一个32位的字数据传送到存储器中。该指令在程序设计中比较常用,且寻址方式灵活多样,使用方式可参考指令LDR。

47 3.2.3 ARM 存储器访问指令 指令示例: STR R3,[R1],#8
;将R3中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1。 STR R3,[R1,#8] ;将R3中的字数据写入以R1+8为地址的存储器中。

48 3.2.3 ARM 存储器访问指令 (5)STRB指令 格式为: STR{条件}B 源寄存器,<存储器地址>

49 3.2.3 ARM 存储器访问指令 指令示例: STRB R3,[R1] ;将寄存器R3中的字节数据写入以R1为地址的存储器中。

50 3.2.3 ARM 存储器访问指令 (6)STRH指令 格式为: STR{条件}H 源寄存器,<存储器地址>

51 3.2.3 ARM 存储器访问指令 指令示例: STRH R3,[R1] ;将寄存器R3中的半字数据写入以R1为地址的存储器中。

52 3.2.3 ARM 存储器访问指令 2.批量数据加载/存储指令

53 3.2.3 ARM 存储器访问指令 常用的加载存储指令如下: LDM(或STM)指令 格式为:

54 3.2.3 ARM 存储器访问指令 IA 每次传送后地址加1,递增方式; IB 每次传送前地址加1,递增方式;
DA 每次传送后地址减1,递减方式; DB 每次传送前地址减1,递减方式; FD 满递减堆栈; ED 空递减堆栈; FA 满递增堆栈; EA 空递增堆栈;

55 ARM 存储器访问指令 {!}为可选后缀,若选用该后缀,则当数据传送完毕之后,将最后的地址写入基址寄存器,否则基址寄存器的内容不改变。 基址寄存器不允许为R15。 寄存器列表可以为R0~R15的任意组合,若使用连续的寄存器时,可以使用“-”表示省略。 {∧}为可选后缀,这是一个只是在数据块传送中使用的后缀,当指令为LDM且寄存器列表中包含R15,选用该后缀时表示:除了正常的数据传送之外,还将SPSR复制到CPSR。同时,该后缀还表示传入或传出的是用户模式下的寄存器,而不是当前模式下的寄存器。

56 3.2.3 ARM 存储器访问指令 指令示例: STMFD R13!,{R0,R4-R12,LR}
LDMFD R13!,{R0,R4-R12,PC} ;将堆栈内容恢复到寄存器(R0,R4到R12,LR)。 在通用存储区,数据存储的方式和堆栈区相近。下面通过存储R1、R2和R3 3个寄存器的4种后缀指令执行前后的存储情况如图3-7所示。

57 3.2.3 ARM 存储器访问指令 3.交换指令 (1)SWP指令 格式为: SWP{条件} 目的寄存器,源寄存器1,[源寄存器2]

58 3.2.3 ARM 存储器访问指令 指令示例: SWP R1,R2,[R3] ;将R3所指向的存储器中的字数据传送到R1,同时
SWPEQ R1,R1,[R2] ;Z=1时,完成将R2所指向的存储器中的字数据与 ;R1中的字数据交换。

59 3.2.3 ARM 存储器访问指令 STMIB R0!,{R1,R2,R3} STMIA R0!,{R1,R2,R3} 指令执行前
指令执行后 R0 R3 R2 R1 STMIA R0!,{R1,R2,R3} 地址增 STMDA R0!,{R1,R2,R3} STMDB R0!,{R1,R2,R3} 地址减

60 3.2.3 ARM 存储器访问指令 (2)SWPB指令 格式为: SWP{条件}B 目的寄存器,源寄存器1,[源寄存器2]

61 3.2.3 ARM 存储器访问指令 指令示例: SWPB R1,R2,[R3]
;将R3所指向的存储器中的字节数据传送到R1,R1的高24位清零,同时将R2中的低8位数据传送到R3所指向的存储单元。 SWPB R1,R1,[R2] ;该指令完成将R2所指向的存储器中的字节数据与R1中的低8位数据交换。

62 3.2.4 ARM 数据处理类指令 数据传送指令 算术逻辑运算指令 比较指令
数据处理指令只能对寄存器的内容进行操作,不允许对存储器中的数据进行操作,也不允许指令直接使用存储器的数据或在寄存器与存储器之间传送数据。 数据处理指令可分为3大类: 数据传送指令 算术逻辑运算指令 比较指令

63 3.2.4 ARM 数据处理类指令 数据传送指令用于在寄存器和存储器之间进行数据的双向传输。
算术逻辑运算指令完成常用的算术与逻辑的运算,该类指令不但将运算结果保存在目的寄存器中,同时更新CPSR中的相应条件标志位。 比较指令是完成对指定的两个寄存器(或1个寄存器,1个立即数)进行比较,不保存运算结果,只影响CPSR中相应的条件标志位。

64 数据传送指令 1.数据传送指令MOV和MVN (1)MOV指令 格式为: MOV{条件}{S} 目的寄存器,源操作数
其中S选项决定指令的操作是否影响CPSR中条件标志位的值,当没有S时指令不更新CPSR中条件标志位的值。

65 数据传送指令 指令示例: MOV R4,R5 ;将寄存器R5的内容传送到寄存器R4 MOV PC,R14
;将寄存器R14的内容传送到PC,常用于子程序返回 MOVNE R4,R5,LSL#2 ;当Z=0时,将寄存器R5的内容逻辑左移2位后传送到R4

66 数据传送指令 (2)MVN指令 格式为: MVN{条件}{S} 目的寄存器,源操作数
MVN指令可完成在寄存器之间或寄存器与第2操作数之间进行数据非传送。与MOV指令不同之处是在传送之前按位被取反了,即把一个被取反的值传送到目的寄存器中。 其中S决定指令的操作是否影响CPSR中条件标志位的值,当没有S时指令不更新CPSR中条件标志位的值。

67 数据传送指令 (2)MVN指令 格式为: MVN{条件}{S} 目的寄存器,源操作数
MVN指令可完成在寄存器之间或寄存器与第2操作数之间进行数据非传送。与MOV指令不同之处是在传送之前按位被取反了,即把一个被取反的值传送到目的寄存器中。 其中S决定指令的操作是否影响CPSR中条件标志位的值,当没有S时指令不更新CPSR中条件标志位的值。

68 数据传送指令 指令示例: MVN R0,#0 ;将立即数0取反传送到寄存器R0中,完成后R0=-1 MVN R1,R2

69 算术逻辑运算指令 2.算术逻辑运算指令 (1)ADD指令 格式为: ADD{条件}{S} 目的寄存器,操作数1,操作数2
操作数1应是一个寄存器。 操作数2可以是一个寄存器,被移位的寄存器,或一个立即数 .

70 算术逻辑运算指令 指令示例: ADDS R0,R3,R4 ; R0 = R3 + R4,设置标志位 ADDC R0,R3,#10
ADD R0,R2,R3,LSL#2 ; R0 = R2 + R3×4

71 算术逻辑运算指令 (2)ADC指令 格式为: ADC{条件}{S} 目的寄存器,操作数1,操作数2
ADC指令是带进位加法指令,用于把两个操作数相加,再加上CPSR中的C条件标志位的值,并将结果存放到目的寄存器中。它使用一个进位标志位,这样就可以做比32位大的数的加法,注意不要忘记设置S后缀来更改进位标志。 操作数1应是一个寄存器。 操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。

72 算术逻辑运算指令 以下指令序列实现64位二进制数的加法: R2、R1= R2、R1+ R4、R3
ADDS R1,R1,R3 ;R1= R1+ R3 ADC R2,R2,R ;R2= R2+ R4+C

73 算术逻辑运算指令 (3)SUB指令 格式为: SUB{条件}{S} 目的寄存器,操作数1,操作数2
操作数1应是一个寄存器。 操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。

74 算术逻辑运算指令 指令示例: SUBS R0,R3,R4 ; R0 = R3 – R4,设置标志位 SUB R0,R1,#0x10
SUB R0,R2,R3,LSL#1 ; R0 = R2 - (R3 << 1)

75 算术逻辑运算指令 (4) SBC指令 格式为: SBC{条件}{S} 目的寄存器,操作数1,操作数2
SBC指令是带借位减法指令,用于把操作数1减去操作数2,再减去CPSR中的C条件标志位的反码,并将结果存放到目的寄存器中。该指令可用于有符号数或无符号数的减法运算。 操作数1应是一个寄存器。 操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令使用进位标志来表示借位,这样就可以做大于32位的减法,注意不要忘记设置S后缀来更改进位标志。 指令示例: SBC R2,R2,R ; R2 = R2 – R4-C

76 算术逻辑运算指令 (5)RSB指令 格式为: RSB{条件}{S} 目的寄存器,操作数1,操作数2
操作数1应是一个寄存器。 操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。

77 算术逻辑运算指令 指令示例: RSB R0,R1,R2 ; R0 = R2 – R1
RSB R0,R1,#0x ; R0 = 0x10 – R1 RSB R0,R2,R3,LSL# ; R0 =R3×2 - R2

78 算术逻辑运算指令 (6)RSC指令 格式为: RSC{条件}{S} 目的寄存器,操作数1,操作数2
RSC指令是带借位反减法指令,用于把操作数2减去操作数1,再减去CPSR中的C条件标志位的反码,并将结果存放到目的寄存器中。该指令可用于有符号数或无符号数的减法运算。 操作数1应是一个寄存器。 操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。

79 算术逻辑运算指令

80 算术逻辑运算指令 (7)AND指令 格式为: AND{条件}{S} 目的寄存器,操作数1,操作数2
操作数1应是一个寄存器。 操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。

81 算术逻辑运算指令 指令示例: AND R5,R6,R8 ; R5=R6∧R8 AND R2,R2,#3

82 算术逻辑运算指令 (8)ORR指令 格式为: ORR{条件}{S} 目的寄存器,操作数1,操作数2
操作数1应是一个寄存器。 操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。

83 算术逻辑运算指令 指令示例: ORR R5,R6,R8 ; R5=R6∨R8 ORR R2,R2,#3

84 算术逻辑运算指令 (9)EOR指令 格式为: EOR{条件}{S} 目的寄存器,操作数1,操作数2
操作数1应是一个寄存器。 操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。

85 算术逻辑运算指令 指令示例: EOR R5,R6,R8 ; R5=R6⊕R8 EOR R2,R2,#3

86 算术逻辑运算指令 (10)BIC指令 格式为: BIC{条件}{S} 目的寄存器,操作数1,操作数2
操作数1应是一个寄存器。 操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。

87 算术逻辑运算指令 指令示例: BIC R0,R2,#2_0011 ;清除 R2 中的位 0、1,其余的位保持不变。
BICS R0,R2,#0x ;清除 R2 中的位 31,其余的位保持不变,刷新标志位。

88 算术逻辑运算指令 (11)MUL指令 格式为: MUL{条件}{S} 目的寄存器,操作数1,操作数2
MUL指令是乘法指令,完成将操作数1与操作数2的乘法运算,并把结果放置到目的寄存器中,同时可以根据运算结果设置CPSR中相应的条件标志位(不会影响V)。其中,操作数1和操作数2均为32位的有符号数或无符号数。

89 算术逻辑运算指令 指令示例: MUL R0,R4,R5 ;R0 = R4 × R5 MULS R0,R4,R5

90 算术逻辑运算指令 (12)MLA指令 格式为: MLA{条件}{S} 目的寄存器,操作数1,操作数2,操作数3
MLA指令是乘加指令,完成将操作数1与操作数2的乘法运算,再将乘积加上操作数3,并把结果放置到目的寄存器中,同时可以根据运算结果设置CPSR中相应的条件标志位(不会影响V)。 其中,操作数1和操作数2均为32位的有符号数或无符号数。

91 算术逻辑运算指令 指令示例: MLA R0,R1,R2,R3 ;R0 = R1 × R2 + R3 MLAS R0,R1,R2,R3
;R0 = R1 × R2 + R3,同时设置CPSR中的相关条件标志位

92 算术逻辑运算指令 (13)SMULL指令 格式为: SMULL{条件}{S} 目的寄存器Low,目的寄存器低High,操作数1,操作数2
SMULL指令是带符号长乘法指令,完成将操作数1与操作数2的乘法运算,并把结果的低32位放置到目的寄存器Low中,结果的高32位放置到目的寄存器High中,同时可以根据运算结果设置CPSR中相应的条件标志位。 其中,操作数1和操作数2均为32位的有符号数。

93 算术逻辑运算指令 指令示例: SMULL R1,R2,R3,R4 ;R1 = (R3 × R4)的低32位

94 算术逻辑运算指令 (14)SMLAL指令 格式为: SMLAL{条件}{S} 目的寄存器Low,目的寄存器低High,操作数1,操作数2
SMLAL指令是长乘加指令,完成将操作数1与操作数2的乘法运算,并把结果的低32位同目的寄存器Low中的值相加后又放置到目的寄存器Low中,结果的高32位同目的寄存器High中的值相加后又放置到目的寄存器High中,同时可以根据运算结果设置CPSR中相应的条件标志位。其中,操作数1和操作数2均为32位的有符号数。

95 算术逻辑运算指令 对于目的寄存器Low,在指令执行前存放64位加数的低32位,指令执行后存放结果的低32位。
对于目的寄存器High,在指令执行前存放64位加数的高32位,指令执行后存放结果的高32位。 指令示例: SMLAL R1,R2,R3,R4 ;R1 = (R3 × R4)的低32位 + R1 ;R2 = (R3× R4)的高32位 + R2

96 算术逻辑运算指令 (15)UMULL指令 格式为: UMULL{条件}{S} 目的寄存器Low,目的寄存器低High,操作数1,操作数2
UMULL指令是无符号乘法指令,完成将操作数1与操作数2的乘法运算,并把结果的低32位放置到目的寄存器Low中,结果的高32位放置到目的寄存器High中,同时可以根据运算结果设置CPSR中相应的条件标志位。 其中,操作数1和操作数2均为32位的无符号数。

97 算术逻辑运算指令 指令示例: UMULL R1,R2,R3,R4 ;R1 = (R3 × R4)的低32位

98 算术逻辑运算指令 (16)UMLAL指令 格式为: UMLAL{条件}{S} 目的寄存器Low,目的寄存器低High,操作数1,操作数2
UMLAL指令是无符号长乘法指令,完成将操作数1与操作数2的乘法运算,并把结果的低32位同目的寄存器Low中的值相加后又放置到目的寄存器Low中,结果的高32位同目的寄存器High中的值相加后又放置到目的寄存器High中,同时可以根据运算结果设置CPSR中相应的条件标志位。其中,操作数1和操作数2均为32位的无符号数。

99 算术逻辑运算指令 对于目的寄存器Low,在指令执行前存放64位加数的低32位,指令执行后存放结果的低32位。
对于目的寄存器High,在指令执行前存放64位加数的高32位,指令执行后存放结果的高32位。 指令示例: UMLAL R1,R2,R3,R4 ;R1 = (R3 × R4)的低32位 + R1 ;R2= (R3× R4)的高32位 + R2

100 比较和测试指令 (1)CMP指令 格式为: CMP{条件} 操作数1,操作数2
对条件位的影响是:结果为正数则N=0,结果为负数则N=1;结果为0则Z=1,结果不为0则Z=0;如果产生借位则C=0,没有借位则C=1;结果是符号溢出则V=1,否则V=0。

101 比较和测试指令 指令示例: CMP R1,#0x30 ;比较R1和0x30
ADDCS R5,R5,#0x20 ;如果C=1,则R5=R5+0x20 ADDCC R5,R5,#0x10 ;如果C=0,则R5=R5+0x10

102 比较和测试指令 (2)CMN指令 格式为: CMN{条件} 操作数1,操作数2
CMN指令是比较非指令,也是做一次减法运算,用第1操作数减去第2操作数的非值,结果不保存,只是刷新条件标志位,对条件标志位的影响和比较指令CMP相同。

103 比较和测试指令 指令示例: CMN R1,#0x00 ;比较R1和0xFFFFFFFF ADDCS R5,R5,#0x20
;如果C=1,则R5=R5+0x20 ADDCC R5,R5,#0x10 ;如果C=0,则R5=R5+0x10

104 比较和测试指令 (3)TST指令 格式为: TST{条件} 操作数1,操作数2
TST指令是位测试指令,用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的与运算,并根据运算结果更新CPSR中条件标志位的值。 指令示例: TST R2,#0x01 ;将寄存器R1的值与立即数 0x01按位与,并根据结果设置CPSR的标志位,用来判断R2中最低位是否为0。

105 比较和测试指令 (4)TEQ指令 格式为: TEQ{条件} 操作数1,操作数2
TEQ指令是测试指令,用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的异或运算,并根据运算结果更新CPSR中条件标志位的值。该指令通常用于比较操作数1和操作数2是否相等。 指令示例: TEQ R1,#0x10 ;将寄存器R1的值与0x10按位异或,并根据结果设置 ;CPSR的标志位,若Z=1则表示R1的内容是0x10

106 ARM 分支指令 在ARM指令集中,没有专门的子程序调用指令,把分支和子程序调用看成是同一种操作,分支指令用于实现程序流程的跳转,在ARM程序中可以通过使用专门的跳转指令或是直接向程序计数器PC写入跳转地址值的方法来实现。 通过向程序计数器PC写入跳转地址值,可以实现在4GB的地址空间中的任意跳转,在跳转之前结合使用MOV LR,PC等类似指令,可以保存将来的返回地址值,从而实现在4GB连续的线性地址空间的子程序调用。

107 ARM 分支指令 ARM指令集中的跳转指令可以完成从当前指令向前或向后的32MB的地址空间的跳转,包括以下3条指令: 1. B指令 2. BL指令 3. BX指令

108 3.2.5 ARM 分支指令 1. B指令 格式为: B{条件} 目标地址
B指令是分支指令,是最简单的跳转指令。一旦遇到一个 B 指令,ARM 处理器将立即跳转到给定的目标地址,从那里继续执行。 注意存储在跳转指令中的实际值是相对当前PC值的一个偏移量,而不是一个绝对地址,它的值由汇编器来计算(参考寻址方式中的相对寻址)。

109 3.2.5 ARM 分支指令 指令实例: B Label ;程序无条件跳转到标号Label处执行
CMP R1,#0 ;当CPSR寄存器中的Z条件码置位 ;时, 程序跳转到标号Label处执行 BEQ Label

110 3.2.5 ARM 分支指令 2. BL指令 格式为: BL{条件} 目标地址
BL指令是分支和链接指令,一种可以存储分支处地址的分支指令,可用于子程序调用。具体实现过程是跳转之前,会在寄存器R14中保存PC的当前内容,因此,可以通过将R14 的内容重新加载到PC中,来返回到跳转指令之后的那个指令处执行。

111 ARM 分支指令 指令实例: BL Label ;当程序无条件跳转到标号Label处执行时, ;同时将当前的PC值保存到R14中

112 3.2.5 ARM 分支指令 3. BX指令 格式为: BX{条件} 目标地址
BX指令是分支和交换指令,可以在ARM指令集和Thumb指令集之间跳转的分支指令。

113 3.2.5 ARM 分支指令 指令实例: CODE32 ;ARM程序段,32位编码 ARM1 ;语句标号
ADR R0,THUMB1+1 ;把THUMB1所在的地址赋给R0 BX R0 ;跳转到THUMB1指令集 …… CODE16 THUMB1: ADR R0,ARM1 ;把语句标号ARM1所在的地址赋给R0 BIC R0,R0,#01 ;末位R0[0]清0 BX R0 ;跳转到ARM指令集

114 3.2.6 ARM 协处理器指令 ARM作为32位处理器,虽然能进行长乘法和乘加等运算,但没有除法指令和更复杂的运算指令。
因此, ARM可以通过外接协处理器来解决此问题,协处理器是一种专门用于进行辅助运算的芯片,其本身除了运算功能以外没有其他功能,因此,不能独立工作,必须和CPU一起工作,ARM处理器可支持多达16个协处理器,每个协处理器都有自己的编号,命名为Pn,每个协处理器都有自己的寄存器,命名为Cn。

115 ARM 协处理器指令 ARM的协处理器指令主要用于ARM处理器初始化ARM协处理器的数据处理操作,以及在ARM处理器的寄存器和协处理器的寄存器之间传送数据,和在ARM协处理器的寄存器和存储器之间传送数据。 ARM协处理器指令包括以下5条: CDP指令 LDC指令 STC指令 MCR和MRC指令

116 ARM 协处理器指令 1. CDP指令 格式为: CDP{条件} 协处理器编码,协处理器操作码1,目的寄存器,源寄存器1,源寄存器2,协处理器操作码2。 CDP指令是协处理器数据操作指令,用于ARM处理器通知ARM协处理器执行特定的操作,若协处理器不能成功完成特定的操作,则产生未定义指令异常。其中协处理器操作码1和协处理器操作码2为协处理器将要执行的操作,目的寄存器和源寄存器均为协处理器的寄存器,指令不涉及ARM处理器的寄存器和存储器。

117 3.2.6 ARM 协处理器指令 指令示例: CDP P1,2,C1,C2,C3 ;命令1号(P1)协处理器把自己的寄存器(协处理器

118 3.2.6 ARM 协处理器指令 2. LDC指令 格式为: LDC{条件}{L} 协处理器编码,目的寄存器,[源寄存器]

119 3.2.6 ARM 协处理器指令 指令示例: LDC P3,C4,[R5] ;将ARM处理器的寄存器R5所指向的存储器中的字

120 3.2.6 ARM 协处理器指令 3. STC指令 格式为: STC{条件}{L} 协处理器编码,源寄存器,[目的寄存器]

121 3.2.6 ARM 协处理器指令 指令示例: STCEQ P2,C4,[R5] ;当Z=1时,执行将协处理器P2的寄存器C4中的字数
;据传送到ARM处理器的寄存器R5所指向的存储器中。

122 3.2.6 ARM 协处理器指令 4. MCR和MRC指令 格式为:
这两条指令是用来在两个寄存器之间进行数据传送。 从ARM处理器寄存器中的数据传送到协处理器寄存器使用MCR指令; 从协处理器寄存器中的数据传送到ARM处理器寄存器使用MRC指令。

123 3.2.6 ARM 协处理器指令 ARM处理器指定一个寄存器作为传送数据的源或接收数据的目标。
协处理器指定两个寄存器,同时可以像CDP指令一样指定操作要求。 这类指令可以用在浮点数运算和传送中,ARM处理器把数据传送给协处理器,然后可以从协处理器读出浮点数的计算结果。

124 3.2.6 ARM 协处理器指令 指令示例: MCR P2,3,R2,C4,C5,6
;该指令将ARM处理器寄存器R2中的数据传送到协处理器P2的寄存器C4和C5中。具体实现是:指定协处理器P2执行第6种操作,操作数是C4和C5,把操作结果传送给R2 。 MRC P0,3,R2,C4,C5,6 ;该指令将协处理器P0的寄存器中的数据传送到ARM处理器寄存器中。具体实现是:指定协处理器P0执行第3种操作,操作类型是6,操作数之一是 R2,结果放在C4中。

125 ARM 软件中断指令 ARM指令集中的软件中断指令是唯一一条不使用寄存器的ARM指令,也是一条可以条件执行的指令。因为ARM指令在用户模式中受到很大的局限,有一些资源不能够访问。 所以,在需要访问这些资源时,使用软件控制的唯一方法就是使用软件中断指令SWI。

126 3.2.7 ARM 软件中断指令 SWI指令的格式为: SWI{条件} 24位的立即数
操作系统在SWI的异常处理程序中提供相应的系统服务,指令中24位的立即数指定用户程序调用系统例程的类型,相关参数通过通用寄存器传递,当指令中24位的立即数被忽略时,用户程序调用系统例程的类型由通用寄存器R0的内容决定,同时,参数通过其他通用寄存器传递。

127 3.2.7 ARM 软件中断指令 指令示例: SWI 0x02 ;实现中断,指明调用2号功能段。
执行SWI指令,软件中断进入的是管理模式,中断后会改变程序状态寄存器中的相关位。中断后ARM处理器把0x 赋给PC,并把中断处地址保存在LR中,同时把CPSR保存在SPSR中。

128 3.3 Thumb指令集 为兼容数据总线宽度为16位的应用系统,ARM体系结构除了支持执行效率很高的32位ARM指令集以外,同时支持16位的Thumb指令集。 Thumb指令集是ARM指令集的一个子集,允许指令编码为16位的长度。 与等价的32位代码相比较,Thumb指令集在保留32代码优势的同时,大大的节省了系统的存储空间。

129 3.3 Thumb指令集 Thumb指令集与ARM指令集在以下几个方面有区别:
跳转指令。条件跳转在范围上有更多的限制,转向子程序只具有无条件转移。 数据处理指令。对通用寄存器进行操作,操作结果需放入其中一个操作数寄存器,而不是第三个寄存器。 单寄存器加载和存储指令。Thumb状态下,单寄存器加载和存储指令只能访问寄存器R0~R7。 批量寄存器加载和存储指令。LDM和STM指令可以将任何范围为R0~R7的寄存器子集加载或存储,PUSH和POP指令使用堆栈指针R13作为基址实现满递减堆栈,除R0~R7外,PUSH指令还可以存储链接寄存器R14,并且POP指令可以加载程序指令PC。

130 3.3 Thumb指令集 Thumb指令集没有包含进行异常处理时需要的一些指令,因此,在异常中断时还是需要使用ARM指令。这种限制决定了Thumb指令不能单独使用而需要与ARM指令配合使用。 Thumb数据处理指令、存储器访问指令中的加载/存储指令使用方法和ARM指令集中相对应的指令类似,本节不做详细介绍,仅对有区别的指令介绍。

131 3.3 Thumb指令集 1. PUSH和POP 指令格式: PUSH {低寄存器的全部或其子集} POP {低寄存器的全部或其子集}
PUSH低寄存器的全部或其子集,LR} POP {低寄存器的全部或其子集,PC} 这两条指令是栈操作指令,用于在寄存器和堆栈之间进行成组的数据传送,PUSH指令用于把寄存器列表中的寄存器数据推进堆栈;POP指令用于把栈区的数据弹出列表的寄存器中。

132 3.3 Thumb指令集 堆栈指针是隐含的地址基址,Thumb指令中的堆栈是满递减堆栈,堆栈向下增长,堆栈指针总是指向最后入栈的数据。使用入栈指令PUSH时,每传送一个数据,堆栈指针就自动减4;使用出栈指令POP时,每传送一个数据,堆栈指针就自动加4。 POP {低寄存器的全部或其子集,PC}这条指令引起处理器转移到从堆栈弹出给PC的地址,这通常是从子程序返回,其中LR在子程序开头压进堆栈。这些指令不影响条件码标志。

133 3.3 Thumb指令集 指令示例: PUSH {R0,R4,R6} ;把R0、R4、R6的数据顺序推进栈区 PUSH {R4-R7,LR}
;把R4、R5、R6、R7、LR顺序入栈 POP {R0,R4,R6} ;把R0、R4、R6的数据弹出栈区 POP {R0-R7,PC} ;恢复现场

134 3.3 Thumb指令集 2. 分支指令 (1)B指令 这是Thumb指令集中唯一的有条件指令。 指令格式为: B{条件} 目标地址
2. 分支指令 (1)B指令 这是Thumb指令集中唯一的有条件指令。 指令格式为: B{条件} 目标地址 若使用条件,则目标地址必须在当前指令的-256~+256字节范围内。若指令是无条件的,则目标地址必须在±2KB范围内。若条件满足或不使用条件,则B指令引起处理器转移到目标地址。目标地址必须在指定限制内。ARM链接器不能增加代码来产生更长的转移。

135 3.3 Thumb指令集 指令示例: CMP R2,#0x20 ;比较R2和0x20 BNE START ;不相等时,即当Z=0时,则跳转
…… START ADD R3,R4 ;跳转处

136 3.3 Thumb指令集 (2)BL指令 格式为: BL 目标地址
BL指令是分支和链接指令,将下一条指令的地址复制到R14(链接寄存器),并引起处理器转移到目标地址,但目标地址不可以是ARM指令。BL指令不能转移到当前指令±4MB以外的地址。

137 3.3 Thumb指令集 指令示例: BL START ;分支跳转 ADD R3,R4 ;分支的下一条指令 …… START

138 3.3 Thumb指令集 (3) BX 格式为: BX 寄存器
当寄存器的位[0]为0时,表明目标地址处是ARM指令,此时,要求字对准。

139 3.3 Thumb指令集 指令示例: CODE16 ;Thumb程序段 ADR R0,ARM1 ;把标号ARM1处地址赋给R0
BIC R0,#01 ;清R0的位[0] BX R0 ;跳转到ARM1指令集 LET1: …… CODE32 ARM1: …… ADD R3,R ;ARM语句 ADR R0,LET+1 ;把LET1所在的地址赋给R0,置R0的位[0] BX R0 ;跳转到ARM指令集

140 3.3 Thumb指令集 3. SWI指令 指令格式: SWI 立即数
SWI指令为软件中断指令,用于产生软件中断,即能够引起SWI异常。这意味着处理器状态切换到ARM态;处理器模式切换到管理模式,CPSR保存到管理模式的SPSR中,执行转移到SWI向量地址。立即数要求是一个8位的无符号数,范围是0~255之间的整数。 指令示例: SWI ;产生软件中断,进入管理方式时带入 ;参数12,作为SWI中断请求号


Download ppt "(第2版)."

Similar presentations


Ads by Google