第3章 ARM微处理器的指令系统
第3章 ARM9汇编指令系统
第三章
例如
例如: LDR R8,[R10] ;R8←[R10] LDRNE R2,[R5,#960]! ;( 有 条 件 地 ) R2←[R5+960],R5←R5+960 LDR R0,localdata ;加载一个字到R0寄存 器,该字存 于localdata所指地址处 STR R5,[R7],#-8! ;R5→[R7],R7←R7-8 STRB R0,[R3,-R8 ASR #2] ;R0→[R3-R8/4], 存储R0的最低有效字节,R3和R8不变
其中:type 必须是下面所列的形式之一: SH 带符号半字(仅对LDR); H 无符号半字; SB 带符号字节(仅对LDR)。 label 程序相对偏移表达式。偏移量必须是在 当前指令的上下255字节范围内。 offset 加在Rn上的偏移量。其形式是下列两种 之一: ① #expr 是取值范围为-255~+255的整数, 经常是常量或常量表达式。 ② {-} Rm Rm是内含偏移量的寄存器,它不 能是R15。
第三章
存储器访问指令(续)
(3)LDR和STR ----双字:加载/存储两个相邻 的寄存器,64位双字。其句法有4种:
Op {cond} D Rd,[Rn] 零偏移 Op {cond} D Rd,[Rn,offset] {!} 前索引偏移 Op {cond} D Rd,label 程序相对偏移 Op {cond} D {T} Rd,[Rn],offset 后索引偏移
第三章
存储器访问指令(续)
(1) SWP:在寄存器和存储器之间 进行数据交换,其句法是: SWP {cond} {B} Rd,Rm,[Rn] 其中:B是可选后缀,若有B,则交换字 节,否则交换字。该指令作用是数据从 存储器加裁到Rd中,Rm中的内容存储 到存储器,需交换数据存储单元的首地 址在Rn中。在此,Rd和Rm可以相同, 但Rn必须与Rd、Rm不同。
第三章 ARM指令系统.ppt
(6)多寄存器寻址
一条指令可以完成多个寄存器值的传送,这种寻址方式可以用一条 指令完成传送最多16个通用寄存器的值,如:
LDMIA R0!,{R1—R4}
; R1 ; R2 ; R3 ; R4
[R0] [R0+4] [R0+8] [R0+12]
该指令的后缀IA表示在每次执行完加载/存储操作后,R0按字长度 增加,因此,指令可将连续存储单元的值传送到R1~R4。
;入栈 ;出栈
嵌入式技术基础
3.2 ARM指令寻址方式
(8)相对寻址 以程序计数器 PC 的当前值为基地址,指令中的地址标号作为偏移
量,将两者相加之后得到操作数的有效地址。 以下程序段完成子程序调用的返回,跳转指令BL采用了相对寻址
方式,如: BL NEXT …
NEXT MOV R1,#1 … MOV PC,LR
BL{条件} 目标地址
如:
BL DELAY
BL指令执行跳转操作的同时,还将PC的值保存到LR寄存器中, ARM使用BL实现待返回值的跳转功能。
嵌入式技术基础
3.3 ARM指令集
3、BX指令 BX指令是带状态切换的跳转指令,只有当条件完全符合时才执
行。 指令格式如下: BX{条件} 目标地址 跳转到目标地址指定的地址执行程序,若目标地址的位[0]为1,则
[27:20]:指令代 码域
[19:16]:地址基 址Rn域
[15:12]:目标或 源寄存器Rd域
[11:0]:地址偏移 或操作寄存器 、操作数区域
嵌入式技术基础
3.1 ARM指令系统简介
◆ 指令的条件域: 当处理器工作在ARM状态时,几乎所有的指令均根据CPSR中条件
码的状态和指令的条件域有条件的执行。 当指令的执行条件满足时,指令被执行,否则指令被忽略。 每一条ARM指令包含4位的条件码,位于指令的最高4位[31:28]。 每种条件码可用两个字符表示,这两个字符可以添加在指令助记
ARM处理器指令系统
跳转指令(4)
CODE32 … blx TSUB … CODE16 TSUB … bx R14
;ARM代码 ;调用Thumb指令子程序TSUB
;Thumb代码
;返回ARM代码 (R14=LR)
数据处理指令
❖数据运算指令 ❖前导零计数指令 ❖乘法指令
数据运算指令(1)
ARM处理器指令系统
本讲内容
介绍ARM体系的指令系统和寻址方式,包括 32位的ARM指令集和16位的Thumb指令集, 以及ARM宏汇编与汇编程序设计基础。
ARM处理器指令集概述(1)
❖ ARM处理器指令集为加载/存储型 ❖ ARM处理器指令集分为ARM指令集(32位编码长度)
和Thumb指令集(16位编码长度)。 ❖ Thumb指令集是ARM指令集的一个子集,即所有的
灵活的第二操作数形式 (3)
➢寄存器内容的移位结果 格式:Rm {, shift} ▪ Rm:存储未移位第二操作数的通用寄存器; ▪ shift为可选的移位操作。它可以是以下任何一种形式。
➢SR/LSR/LSL/ROR #n (移动位数在32或31以内, 以不冗余移位为原则。) ➢RRX (带进位的循环右移1位) ➢ASR/LSR/LSL/ROR Rs
当前程序状态寄存器CPSR
❖当前程序状态寄存器CPSR
▪N:补码形式的有符号数运算时,1为负,0为正;
▪Z:1表示结果为零;
▪C:加减法的进位或借位,以及非加减法的最后移 位;
▪V:1表示补码形式的有符号数加减运算时符号位溢 出;
31 30 29 28 27
7 6 54
0
N Z C V Q 保留 I F T M
第3章 ARM微处理器的指令系统
R3 0x02 0x?? STMIA R0!,{R2-R7,R12} R2 0x01 0x?? R1 0x40000000 0x40000010
0x02 0x40000004 ;将寄存器R2~R7、R12的值保 0x01 0x40000000
;存到R0指向的存储; 单元中 存储器 ;(R0自动加1)
;R2~R7、R12中(R1自动加1)
LDMIA R1!,{R2-R4,R6}
3.1 ARM处理器寻址方式
寻址方式分类——堆栈寻址 堆栈是一个按特定顺序进行存取的存储区,操 作顺序为“后进先出” 。堆栈寻址是隐含的,它使 用一个专门的寄存器(堆栈指针)指向一块存储区域 (堆栈),指针所指向的存储单元即是堆栈的栈顶。 存储器堆栈可分为两种:
ARM指令集与Thumb指令集的关系 Thumb指令集 具有灵活、小 巧的特点 ARM指令集支持 ARM核所有的特 性,具有高效、 快速的特点
3.1 ARM处理器寻址方式
寻址方式分类
寻址方式是根据指令中给出的地址码字段来实 现寻找真实操作数地址的方式。ARM处理器具有8 种基本寻址方式。
1.寄存器寻址; 3.寄存器移位寻址; 5.基址寻址; 2.立即寻址; 4.寄存器间接寻址; 6.多寄存器寻址;
7.堆栈寻址;
8.相对寻址。
3.1 ARM处理器寻址方式
寻址方式分类——寄存器寻址 操作数的值在寄存器中,指令中的地址码字段 指出的是寄存器编号,指令执行时直接取出寄存器 值来操作。寄存器寻址指令举例如下:
MOV SUB R1,R2 R0,R1,R2 ;将R2的值存入R1
R2 0xAA ;将R1的值减去R2的值,结果保存到R0 R1 0xAA 0x55
ANDS R1,R1,R2,LSL R3
第三章ARM微处理器的指令系统
(2).立即寻址
立即寻址指令中的操作码字段后面的地址码部分即是 操作数本身,也就是说,数据就包含在指令当中,取出指 令也就取出了可以立即使用的操作数(这样的数称为立即数)。 程序存储 立即寻址指令举例如下: MOV R0,#0xFF00 从代码中获得数据 SUBS R0,R0,#1 ;R0减1,结果放入R0,并且影响标志 R0 0xFF00 0x55 位
ASR
LSL:逻辑左移(Logical Shift Left) ROR LSR:逻辑右移(Logical Shift Right) ASR:算术右移(Arithmetic Shift Right) C ROR:循环右移(Rotate Right) RRX RRX:带扩展的循环右移(Rotate Right eXtended by 1 place )
STMEA r13!, {r0-r3} ; Push onto an Empty Ascending Stack
LDMEA r13!, {r0-r3} ; Pop from an Empty Ascending Stack STMED r13!, {r0-r3} ; Push onto Empty Descending Stack
LDMED r13!, {r0-r3} ; Pop from an Empty Descending Stack
注意: 1.不论那时压栈过程还是出栈过程,存储器中的高地址的数据对应高编号寄存器
.并且与大括号中寄存器的排放顺序无关
0x40000000 0x40000004 0x40000008 0x4000000C 0x40000010 0x40000014 0x40000018 0x4000001C 0x40000020
ARM体系结构还采用了一些特别的技术,在保证高性能的前 提下尽量缩小芯片的面积,并降低功耗。
第3章 ARM微处理器的指令系统
第3章ARM微处理器的指令系统本章介绍ARM指 集 正具umb指 集 及各类指 对应的寻址方式 通过对本章的阅读 希望读者能了解ARM微处理器所支持的指 集及 体的使用方法本章的 要内容有ARM指 集 正具umb指 集概述ARM指 集的 类 体应用正具umb指 集简介及应用场合3.1 ARM微处理器的指 集概述3.1.1 ARM微处理器的指令的分类与格式ARM微处理器的指 集是 载/ 储型的 也即指 集仅能处理寄 器中的数据 而 处理结果都要放回寄 器中 而对系统 储器的 问则需要通过 门的 载/ 储指 来完成 ARM微处理器的指 集可 跳转指 数据处理指 程序状态寄 器 PSR 处理指 载/ 储指 协处理器指 和 常产生指 六大类 体的指 及 能如表3-1所示 表中指 基本ARM指 包括派生的ARM指表3-1 ARM指令及 能描述助记符指令 能描述ADC 带进 法指ADD 法指AND 逻辑 指B 跳转指BIC 清零指BL 带返回的跳转指BLX 带返回和状态 换的跳转指BX 带状态 换的跳转指CDP 协处理器数据操作指CMN 较 值指CMP 较指EOR 或指LDC 储器到协处理器的数据传输指LDM 载多个寄 器指LDR 储器到寄 器的数据传输指MCR ARM寄 器到协处理器寄 器的数据传输指MLA 乘 算指MOV 数据传送指MRC 协处理器寄 器到ARM寄 器的数据传输指MRS 传送CPSR或SPSR的内容到通用寄 器指MSR 传送通用寄 器到CPSR或SPSR的指MUL 32 乘法指MLA 32 乘 指MVN 数据取 传送指ORR 逻辑或指RSB 逆向减法指RSC 带借 的逆向减法指SBC 带借 减法指STC 协处理器寄 器写入 储器指STM 批量内 写入指STR 寄 器到 储器的数据传输指SUB 减法指SWI 软 中断指SWP 交换指TEQ 相等测试指TST 测试指3.1.2 指令的条件域当处理器 作在ARM状态时 几乎所有的指 均根据CPSR中条 码的状态和指 的条 域有条 的执行 当指 的执行条 满足时 指 被执行 否则指 被忽略每一条ARM指 包 4 的条 码 于指 的最高4 [31:28] 条 码共有16种 每种条 码可用两个 符表示 两个 符可 添 在指 助记符的后面和指 同时使用 例如 跳转指 B 可 后缀EQ变 BEQ表示 相等则跳转 即当CPSR中的Z 置 时发生跳转 在16种条 码中 有15种可 使用 如表3-2所示 第16种 1111 系统保留 暂时 能使用表3-2 指令的条件码条件码助记符后缀 志 义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 忽略无条 执行3.2 ARM指 的寻址方式所谓寻址方式就是处理器根据指 中给出的地址信息来寻找物理地址的方式 目前ARM指 系统支持如 几种常见的寻址方式3.2.1 立即寻址立即寻址也 立即数寻址 是一种特殊的寻址方式 操作数本身就在指 中给出 要取出指 也就取到了操作数 个操作数被 立即数 对应的寻址方式也就 做立即寻址 例如 指ADD R0 R0 #1 R0←R0 1ADD R0 R0 #0x3f R0←R0 0x3f在 两条指 中 第 个源操作数即 立即数 要求 # 前缀 对于 十六进制表示的立即数 要求在 # 后 0x 或 &3.2.2 寄存器寻址寄 器寻址就是利用寄 器中的数值作 操作数 种寻址方式是各类微处理器经常采用的一种方式 也是一种执行效率较高的寻址方式 指ADD R0 R1 R2 R0←R1 R2指 的执行效果是将寄 器R1和R2的内容相 结果 放在寄 器R0中3.2.2 寄存器间接寻址寄 器间接寻址就是 寄 器中的值作 操作数的地址 而操作数本身 放在 储器中 例如 指ADD R0 R1 [R2] R0←R1 [R2]LDR R0 [R1] R0←[R1]S正R R0 [R1] [R1]←R0在第一条指 中 寄 器R2的值作 操作数的地址 在 储器中取得一个操作数后 R1相 结果 入寄 器R0中第 条指 将 R1的值 地址的 储器中的数据传送到R0中第 条指 将R0的值传送到 R1的值 地址的 储器中3.2.3 基址变址寻址基址变址寻址就是将寄 器 寄 器一般 作基址寄 器 的内容 指 中给出的地址偏移量相 而得到一个操作数的有效地址 变址寻址方式常用于 问某基地址 的地址单元 采用变址寻址方式的指 常见有 几种形式 如 所示LDR R0 [R1 #4] R0←[R1 4]LDR R0 [R1 #4]! R0←[R1 4] R1←R1 4LDR R0 [R1] #4 R0←[R1] R1←R1 4LDR R0 [R1 R2] R0←[R1 R2]在第一条指 中 将寄 器R1的内容 4形成操作数的有效地址 而取得操作数 入寄 器R0中在第 条指 中 将寄 器R1的内容 4形成操作数的有效地址 而取得操作数 入寄 器R0中 然后 R1的内容自增4个 节在第 条指 中 寄 器R1的内容作 操作数的有效地址 而取得操作数 入寄 器R0中 然后 R1的内容自增4个 节在第四条指 中 将寄 器R1的内容 寄 器R2的内容形成操作数的有效地址 而取得操作数 入寄 器R0中3.2.4 多寄存器寻址采用多寄 器寻址方式 一条指 可 完成多个寄 器值的传送 种寻址方式可 用一条指 完成传送最多16个通用寄 器的值 指LDMIA R0 {R1 R2 R3 R4} R1←[R0]R2←[R0 4]R3←[R0 8]R4←[R0 12]指 的后缀IA表示在每次执行完 载/ 储操作后 R0按 长度增 因 指 可将连续 储单元的值传送到R1~R43.2.5 相对寻址基址变址寻址方式相类似 相对寻址 程序计数器PC的当前值 基地址 指 中的地址 号作 偏移量 将两者相 之后得到操作数的有效地址 程序段完成子程序的调用和返回 跳转指 BL采用了相对寻址方式BL NEXT 跳转到子程序NEXT处执行……NEX正……MOV PC LR 子程序返回3.2.6 堆 寻址堆 是一种数据结构 按先进后出 First In Last Out FILO 的方式 作 使用一个 作堆 指针的 用寄 器指示当前的操作 置 堆 指针总是指向 顶当堆 指针指向最后压入堆 的数据时 满堆 Full Stack 而当堆 指针指向 一个将要放入数据的空 置时 空堆 Empty Stack同时 根据堆 的生成方式 又可 递增堆 Ascending Stack 和递减堆 Decending Stack 当堆 由 地址向高地址生成时 递增堆 当堆 由高地址向 地址生成时 递减堆 样就有四种类型的堆 作方式 ARM微处理器支持 四种类型的堆 作方式 即满递增堆 堆 指针指向最后压入的数据 由 地址向高地址生成满递减堆 堆 指针指向最后压入的数据 由高地址向 地址生成空递增堆 堆 指针指向 一个将要放入数据的空 置 由 地址向高地址生成 空递减堆 堆 指针指向 一个将要放入数据的空 置 由高地址向 地址生成3.3 ARM指 集本节对ARM指 集的六大类指 进行 细的 述3.3.1 跳转指令跳转指 用于实 程序流程的跳转 在ARM程序中有两种方法可 实 程序流程的跳转 — 使用 门的跳转指— 直接向程序计数器PC写入跳转地址值通过向程序计数器PC写入跳转地址值 可 实 在4GB的地址空间中的任意跳转 在跳转之前结合使用MOV LR PC等类似指 可 保 将来的返回地址值 而实 在4GB连续的线性地址空间的子程序调用 ARM指 集中的跳转指 可 完成 当前指 向前或向后的32MB的地址空间的跳转 包括 4条指— B 跳转指— BL 带返回的跳转指— BLX 带返回和状态 换的跳转指— BX 带状态 换的跳转指1、B指令B指 的格式B{条 二 目 地址B指 是最简单的跳转指 一旦遇到一个 B 指 ARM 处理器将立即跳转到给定的目 地址 那 继续执行 注意 储在跳转指 中的实 值是相对当前PC值的一个偏移量 而 是一个绝对地址 它的值由汇编器来计算 参考寻址方式中的相对寻址 它是 24 有符号数 移两 后有符号扩展 32 表示的有效偏移 2际 (前后32MB的地址空间) 指B Label 程序无条 跳转到 号Label处执行CMP R1 #0 当CPSR寄 器中的Z条 码置 时 程序跳转到 号Label处执行BEQ Label2、BL指令BL指 的格式BL{条 二 目 地址BL 是另一个跳转指 但跳转之前 会在寄 器R14中保 PC的当前内容 因 可 通过将R14 的内容 新 载到PC中 来返回到跳转指 之后的那个指 处执行 指 是实 子程序调用的一个基本但常用的手段 指BL Label 当程序无条 跳转到 号Label处执行时 同时将当前的PC值保 到R14中3、BLX指令BLX指 的格式BLX 目 地址BLX指 ARM指 集跳转到指 中所指定的目 地址 并将处理器的 作状态有ARM状态 换到正具umb状态 指 同时将PC的当前内容保 到寄 器R14中 因 当子程序使用正具umb指 集 而调用者使用ARM指 集时 可 通过BLX指 实 子程序的调用和处理器 作状态的 换 同时 子程序的返回可 通过将寄 器R14值复制到PC中来完成4、BX指令BX指 的格式BX{条 二 目 地址BX指 跳转到指 中所指定的目 地址 目 地址处的指 既可 是ARM指 也可 是正具umb 指3.3.2 数据处理指令数据处理指 可 数据传送指 算术逻辑 算指 和 较指 等数据传送指 用于在寄 器和 储器之间进行数据的 向传输算术逻辑 算指 完成常用的算术 逻辑的 算 类指 但将 算结果保 在目的寄 器中 同时更新CPSR中的相应条较指 保 算结果 更新CPSR中相应的条数据处理指 包括— MOV 数据传送指— MVN 数据取 传送指— CMP 较指— CMN 值 较指— 正S正 测试指— 正EQ 相等测试指— ADD 法指— ADC 带进 法指— S此B 减法指— SBC 带借 减法指— RSB 逆向减法指— RSC 带借 的逆向减法指— AND 逻辑 指— ORR 逻辑或指— EOR 逻辑 或指— B存C 清除指1、MOV指令MOV指 的格式MOV{条 二{S二 目的寄 器 源操作数MOV指 可完成 另一个寄 器 被移 的寄 器或将一个立即数 载到目的寄 器 中S 选项决定指 的操作是否影响CPSR中条 的值 当没有S时指 更新CPSR中条 的值指 示例MOV R1 R0 将寄 器R0的值传送到寄 器R1MOV PC R14 将寄 器R14的值传送到PC 常用于子程序返回MOV R1 R0 LSL#3 将寄 器R0的值 移3 后传送到R12、MVN指令MVN指 的格式MVN{条 二{S二 目的寄 器 源操作数MVN指 可完成 另一个寄 器 被移 的寄 器 或将一个立即数 载到目的寄 器 MOV 指 同之处是在传送之前按 被取 了 即把一个被取 的值传送到目的寄 器中 中S决定指 的操作是否影响CPSR中条 的值 当没有S时指 更新CPSR中条 的值 指 示例MVN R0 #0 将立即数0取 传送到寄 器R0中 完成后R0=-13、CMP指令CMP指 的格式CMP{条 二 操作数1 操作数2CMP指 用于把一个寄 器的内容和另一个寄 器的内容或立即数进行 较 同时更新CPSR中条 的值 指 进行一次减法 算 但 储结果 更改条 表示的是操作数1 操作数2的关系(大 小 相等) 例如 当操作数1大于操作操作数2 则 后的有G正 后缀的指 将可 执行指 示例CMP R1 R0 将寄 器R1的值 寄 器R0的值相减 并根据结果 置CPSR的 CMP R1 #100 将寄 器R1的值 立即数100相减 并根据结果 置CPSR的4、CMN指令CMN指 的格式CMN{条 二 操作数1 操作数2CMN指 用于把一个寄 器的内容和另一个寄 器的内容或立即数取 后进行 较 同时更新CPSR中条 的值 指 实 完成操作数1和操作数2相 并根据结果更改条 指 示例CMN R1 R0 将寄 器R1的值 寄 器R0的值相 并根据结果 置CPSR的 CMN R1 #100 将寄 器R1的值 立即数100相 并根据结果 置CPSR的5、TST指令正S正指 的格式正S正{条 二 操作数1 操作数2正S正指 用于把一个寄 器的内容和另一个寄 器的内容或立即数进行按 的 算 并根据 算结果更新CPSR中条 的值 操作数1是要测试的数据 而操作数2是一个 掩码 指 一般用来检测是否 置了特定的指 示例TST R1 #%1 用于测试在寄 器R1中是否 置了最 %表示 进制数TST R1 #0xffe 将寄 器R1的值 立即数0xffe按 并根据结果 置CPSR的 6、TEQ指令正EQ指 的格式正EQ{条 二 操作数1 操作数2正EQ指 用于把一个寄 器的内容和另一个寄 器的内容或立即数进行按 的 或 算 并根据 算结果更新CPSR中条 的值 指 通常用于 较操作数1和操作数2是否相等 指 示例TEQ R1 R2 将寄 器R1的值 寄 器R2的值按 或 并根据结果 置CPSR的 7、ADD指令ADD指 的格式ADD{条 二{S二 目的寄 器 操作数1 操作数2ADD指 用于把两个操作数相 并将结果 放到目的寄 器中 操作数1应是一个寄 器 操作数2可 是一个寄 器 被移 的寄 器 或一个立即数指 示例ADD R0 R1 R2 R0 = R1 + R2ADD R0 R1 #256 R0 = R1 + 256ADD R0 R2 R3 LSL#1 R0 = R2 + (R3 << 1)8、ADC指令ADC指 的格式ADC{条 二{S二 目的寄 器 操作数1 操作数2ADC指 用于把两个操作数相 再 CPSR中的C条 的值 并将结果 放到目的寄 器中 它使用一个进 样就可 做 32 大的数的 法 注意 要 记 置S后缀来更改进 操作数1应是一个寄 器 操作数2可 是一个寄 器 被移 的寄 器 或一个立即数指 序列完成两个128 数的 法 第一个数由高到 放在寄 器R7~R4 第 个数由高到 放在寄 器R11~R8 算结果由高到 放在寄 器R3~R0ADDS R0 R4 R8 端的ADCS R1 R5 R9 第 个 带进ADCS R2 R6 R10 第 个 带进ADC R3 R7 R11 第四个 带进9、SUB指令S此B指 的格式S此B{条 二{S二 目的寄 器 操作数1 操作数2S此B指 用于把操作数1减去操作数2 并将结果 放到目的寄 器中 操作数1应是一个寄 器 操作数2可 是一个寄 器 被移 的寄 器 或一个立即数 指 可用于有符号数或无符号数的减法 算指 示例SUB R0 R1 R2 R0 = R1 - R2SUB R0 R1 #256 R0 = R1 - 256SUB R0 R2 R3 LSL#1 R0 = R2 - (R3 << 1)10、SBC指令SBC指 的格式SBC{条 二{S二 目的寄 器 操作数1 操作数2SBC指 用于把操作数1减去操作数2 再减去CPSR中的C条 的 码 并将结果 放到目的寄 器中 操作数1应是一个寄 器 操作数2可 是一个寄 器 被移 的寄 器 或一个立即数 指 使用进 来表示借 样就可 做大于32 的减法 注意 要 记 置S 后缀来更改进 指 可用于有符号数或无符号数的减法 算指 示例SUBS R0 R1 R2 R0 = R1 - R2 - !C 并根据结果 置CPSR的进 11、RSB指令RSB指 的格式RSB{条 二{S二 目的寄 器 操作数1 操作数2RSB指 逆向减法指 用于把操作数2减去操作数1 并将结果 放到目的寄 器中 操作数1应是一个寄 器 操作数2可 是一个寄 器 被移 的寄 器 或一个立即数 指 可用于有符号数或无符号数的减法 算指 示例RSB R0 R1 R2 R0 = R2 – R1RSB R0 R1 #256 R0 = 256 – R1RSB R0 R2 R3 LSL#1 R0 = (R3 << 1) - R212、RSC指令RSC指 的格式RSC{条 二{S二 目的寄 器 操作数1 操作数2RSC指 用于把操作数2减去操作数1 再减去CPSR中的C条 的 码 并将结果 放到目的寄 器中 操作数1应是一个寄 器 操作数2可 是一个寄 器 被移 的寄 器 或一个立即数 指 使用进 来表示借 样就可 做大于32 的减法 注意 要 记 置S 后缀来更改进 指 可用于有符号数或无符号数的减法 算指 示例RSC R0 R1 R2 R0 = R2 – R1 - !C13、AND指令AND指 的格式AND{条 二{S二 目的寄 器 操作数1 操作数2AND指 用于在两个操作数 进行逻辑 算 并把结果放置到目的寄 器中 操作数1应是一个寄 器 操作数2可 是一个寄 器 被移 的寄 器 或一个立即数 指 常用于屏蔽操作数1的某些指 示例AND R0 R0 #3 指 保持R0的0 1 余 清零14、ORR指令ORR指 的格式ORR{条 二{S二 目的寄 器 操作数1 操作数2ORR指 用于在两个操作数 进行逻辑或 算 并把结果放置到目的寄 器中 操作数1应是一个寄 器 操作数2可 是一个寄 器 被移 的寄 器 或一个立即数 指 常用于 置操作数1的某些指 示例ORR R0 R0 #3 指 置R0的0 1 余 保持 变15、EOR指令EOR指 的格式EOR{条 二{S二 目的寄 器 操作数1 操作数2EOR指 用于在两个操作数 进行逻辑 或 算 并把结果放置到目的寄 器中 操作数1应是一个寄 器 操作数2可 是一个寄 器 被移 的寄 器 或一个立即数 指 常用于 转操作数1的某些指 示例EOR R0 R0 #3 指 转R0的0 1 余 保持 变16、BIC指令B存C指 的格式B存C{条 二{S二 目的寄 器 操作数1 操作数2B存C指 用于清除操作数1的某些 并把结果放置到目的寄 器中 操作数1应是一个寄 器 操作数2可 是一个寄 器 被移 的寄 器 或一个立即数 操作数2 32 的掩码 如果在掩码中 置了某一 则清除 一 未 置的掩码 保持 变指 示例BIC R0 R0 #%1011 指 清除 R0 中的 0 1 和 3 余的 保持 变 3.3.3 乘法指令与乘 指令ARM微处理器支持的乘法指 乘 指 共有6条 可 算结果 32 和 算结果 64 两类 前面的数据处理指 同 指 中的所有操作数 目的寄 器必须 通用寄 器 能对操作数使用立即数或被移 的寄 器 同时 目的寄 器和操作数1必须是 同的寄 器 乘法指 乘 指 共有 6条— M此L 32 乘法指— MLA 32 乘 指— SM此LL 际4 有符号数乘法指— SMLAL 际4 有符号数乘 指— 此M此LL 际4 无符号数乘法指— 此MLAL 际4 无符号数乘 指1、MUL指令M此L指 的格式M此L{条 二{S二 目的寄 器 操作数1 操作数2M此L指 完成将操作数1 操作数2的乘法 算 并把结果放置到目的寄 器中 同时可 根据 算结果 置CPSR中相应的条 中 操作数1和操作数2均 32 的有符号数或无符号数指 示例MUL R0 R1 R2 R0 = R1 × R2MULS R0 R1 R2 R0 = R1 × R2 同时 置CPSR中的相关条2、MLA指令MLA指 的格式MLA{条 二{S二 目的寄 器 操作数1 操作数2 操作数3MLA指 完成将操作数1 操作数2的乘法 算 再将乘 操作数3 并把结果放置到目的寄 器中 同时可 根据 算结果 置CPSR中相应的条 中 操作数1和操作数2均 32 的有符号数或无符号数指 示例MLA R0 R1 R2 R3 R0 = R1 × R2 + R3MLAS R0 R1 R2 R3 R0 = R1 × R2 + R3 同时 置CPSR中的相关条3、SMULL指令SM此LL指 的格式SM此LL{条 二{S二 目的寄 器Low 目的寄 器 字i其具 操作数1 操作数2SM此LL指 完成将操作数1 操作数2的乘法 算 并把结果的 32 放置到目的寄 器Low 中 结果的高32 放置到目的寄 器High中 同时可 根据 算结果 置CPSR中相应的条 中 操作数1和操作数2均 32 的有符号数指 示例SMULL R0 R1 R2 R3 R0 = R2 × R3 的 32R1 = R2 × R3 的高324、SMLAL指令SMLAL指 的格式SMLAL{条 二{S二 目的寄 器Low 目的寄 器 字i其具 操作数1 操作数2SMLAL指 完成将操作数1 操作数2的乘法 算 并把结果的 32 同目的寄 器Low中的值相 后又放置到目的寄 器Low中 结果的高32 同目的寄 器High中的值相 后又放置到目的寄 器High中 同时可 根据 算结果 置CPSR中相应的条 中 操作数1和操作数2均 32 的有符号数对于目的寄 器Low 在指 执行前 放际4 数的 32 指 执行后 放结果的 32 对于目的寄 器字i其具 在指 执行前 放际4 数的高32 指 执行后 放结果的高32指 示例SMLAL R0 R1 R2 R3 R0 = R2 × R3 的 32 R0R1 = R2 × R3 的高32 R15、UMULL指令此M此LL指 的格式此M此LL{条 二{S二 目的寄 器Low 目的寄 器 字i其具 操作数1 操作数2此M此LL指 完成将操作数1 操作数2的乘法 算 并把结果的 32 放置到目的寄 器Low 中 结果的高32 放置到目的寄 器High中 同时可 根据 算结果 置CPSR中相应的条 中 操作数1和操作数2均 32 的无符号数指 示例UMULL R0 R1 R2 R3 R0 = R2 × R3 的 32R1 = R2 × R3 的高326、UMLAL指令此MLAL指 的格式此MLAL{条 二{S二 目的寄 器Low 目的寄 器 字i其具 操作数1 操作数2此MLAL指 完成将操作数1 操作数2的乘法 算 并把结果的 32 同目的寄 器Low中的值相 后又放置到目的寄 器Low中 结果的高32 同目的寄 器High中的值相 后又放置到目的寄 器High中 同时可 根据 算结果 置CPSR中相应的条 中 操作数1和操作数2均 32 的无符号数对于目的寄 器Low 在指 执行前 放际4 数的 32 指 执行后 放结果的 32 对于目的寄 器字i其具 在指 执行前 放际4 数的高32 指 执行后 放结果的高32指 示例UMLAL R0 R1 R2 R3 R0 = R2 × R3 的 32 R0R1 = R2 × R3 的高32 R13.3.4 程序状态寄存器访问指令ARM微处理器支持程序状态寄 器 问指 用于在程序状态寄 器和通用寄 器之间传送数据 程序状态寄 器 问指 包括 两条— MRS 程序状态寄 器到通用寄 器的数据传送指— MSR 通用寄 器到程序状态寄 器的数据传送指1、MRS指令MRS指 的格式MRS{条 二 通用寄 器 程序状态寄 器 CPSR或SPSRMRS指 用于将程序状态寄 器的内容传送到通用寄 器中 指 一般用在 几种情况 当需要改变程序状态寄 器的内容时 可用MRS将程序状态寄 器的内容读入通用寄 器 修改后再写回程序状态寄 器当在 常处理或进程 换时 需要保 程序状态寄 器的值 可先用 指 读出程序状态寄 器的值 然后保指 示例MRS R0 CPSR 传送CPSR的内容到R0MRS R0 SPSR 传送SPSR的内容到R02、MSR指令MSR指 的格式MSR{条 二 程序状态寄 器 CPSR或SPSR _<域位 操作数MSR指 用于将操作数的内容传送到程序状态寄 器的特定域中 中 操作数可 通用寄 器或立即数 <域位用于 置程序状态寄 器中需要操作的 32 的程序状态寄 器可 4个域[31 24] 条 域 用f表示[23 1际] 状态 域 用s表示[1附 8] 扩展 域 用x表示[7 0] 控制 域 用c表示指 通常用于恢复或改变程序状态寄 器的内容 在使用时 一般要在MSR指 中指明将要操作的域指 示例MSR CPSR R0 传送R0的内容到CPSRMSR SPSR R0 传送R0的内容到SPSRMSR CPSR_c R0 传送R0的内容到SPSR 但仅仅修改CPSR中的控制 域3.3.5 载/存储指令ARM微处理器支持 载/ 储指 用于在寄 器和 储器之间传送数据 载指 用于将 储器中的数据传送到寄 器 储指 则完成相 的操作 常用的 载 储指 如 — LDR 数据 载指— LDRB 节数据 载指— LDR字 半 数据 载指— S正R 数据 储指— S正RB 节数据 储指— S正R字 半 数据 储指1、LDR指令LDR指 的格式LDR{条 二 目的寄 器 < 储器地址位LDR指 用于 储器中将一个32 的 数据传送到目的寄 器中 指 通常用于 储器中读取32 的 数据到通用寄 器 然后对数据进行处理 当程序计数器PC作 目的寄 器时 指 储器中读取的 数据被当作目的地址 而可 实 程序流程的跳转 指 在程序 计中 较常用 寻址方式灵活多样 请读者认真掌握指 示例LDR R0 [R1] 将 储器地址 R1的 数据读入寄 器R0LDR R0 [R1 R2] 将 储器地址 R1+R2的 数据读入寄 器R0LDR R0 [R1 #8] 将 储器地址 R1+8的 数据读入寄 器R0LDR R0 [R1 R2] ! 将 储器地址 R1+R2的 数据读入寄 器R0 并将新地址R1 R2写入R1LDR R0 [R1 #8] ! 将 储器地址 R1+8的 数据读入寄 器R0 并将新地址R1 8写入R1LDR R0 [R1] R2 将 储器地址 R1的 数据读入寄 器R0 并将新地址R1 R2写入R1LDR R0 [R1 R2 LSL#2]! 将 储器地址 R1 R2×4的 数据读入寄 器R0 并将新地址R1 R2×4写入R1LDR R0 [R1] R2 LSL#2 将 储器地址 R1的 数据读入寄 器R0 并将新地址R1 R2×4写入R12、LDRB指令LDRB指 的格式LDR{条 二B 目的寄 器 < 储器地址位LDRB指 用于 储器中将一个8 的 节数据传送到目的寄 器中 同时将寄 器的高24 清零 指 通常用于 储器中读取8 的 节数据到通用寄 器 然后对数据进行处理 当程序计数器PC作 目的寄 器时 指 储器中读取的 数据被当作目的地址 而可 实 程序流程的跳转指 示例LDRB R0 [R1] 将 储器地址 R1的 节数据读入寄 器R0 并将R0的高24 清零 LDRB R0 [R1 #8] 将 储器地址 R1 8的 节数据读入寄 器R0 并将R0的高24 清零 3、LDRH指令LDR字指 的格式LDR{条 二字 目的寄 器 < 储器地址位LDR字指 用于 储器中将一个1际 的半 数据传送到目的寄 器中 同时将寄 器的高1际 清零 指 通常用于 储器中读取1际 的半 数据到通用寄 器 然后对数据进行处理 当程序计数器PC作 目的寄 器时 指 储器中读取的 数据被当作目的地址 而可 实 程序流程的跳转指 示例LDRH R0 [R1] 将 储器地址 R1的半 数据读入寄 器R0 并将R0的高16 清零 LDRH R0 [R1 #8] 将 储器地址 R1 8的半 数据读入寄 器R0 并将R0的高16 清零 LDRH R0 [R1 R2] 将 储器地址 R1 R2的半 数据读入寄 器R0 并将R0的高16 清零4、STR指令S正R指 的格式S正R{条 二 源寄 器 < 储器地址位S正R指 用于 源寄 器中将一个32 的 数据传送到 储器中 指 在程序 计中 较常用 寻址方式灵活多样 使用方式可参考指 LDRSTR R0 [R1] #8 将R0中的 数据写入 R1 地址的 储器中 并将新地址R1 8写入R1 STR R0 [R1 #8] 将R0中的 数据写入 R1 8 地址的 储器中5、STRB指令S正RB指 的格式S正R{条 二B 源寄 器 < 储器地址位S正RB指 用于 源寄 器中将一个8 的 节数据传送到 储器中 节数据 源寄 器中的 8指 示例STRB R0 [R1] 将寄 器R0中的 节数据写入 R1 地址的 储器中STRB R0 [R1 #8] 将寄 器R0中的 节数据写入 R1 8 地址的 储器中6、STRH指令S正R字指 的格式S正R{条 二字 源寄 器 < 储器地址位S正R字指 用于 源寄 器中将一个1际 的半 数据传送到 储器中 半 数据 源寄 器中的 1际指 示例STRH R0 [R1] 将寄 器R0中的半 数据写入 R1 地址的 储器中STRH R0 [R1 #8] 将寄 器R0中的半 数据写入 R1 8 地址的 储器中3.3.6 批量数据 载/存储指令ARM微处理器所支持批量数据 载/ 储指 可 一次在一片连续的 储器单元和多个寄 器之间传送数据 批量 载指 用于将一片连续的 储器中的数据传送到多个寄 器 批量数据 储指 则完成相 的操作 常用的 载 储指 如— LDM 批量数据 载指— S正M 批量数据 储指LDM 或STM 指令LDM 或S正M 指 的格式LDM 或S正M {条 二{类型二 基址寄 器{!二 寄 器列表{∧二LDM 或S正M 指 用于 由基址寄 器所指示的一片连续 储器到寄 器列表所指示的多个寄 器之间传送数据 指 的常见用途是将多个寄 器的内容入 或出 中 {类型二 几种情况存A 每次传送后地址 1存B 每次传送前地址 1DA 每次传送后地址减1DB 每次传送前地址减1FD 满递减堆ED 空递减堆FA 满递增堆EA 空递增堆{!二 可选后缀 若选用 后缀 则当数据传送完 之后 将最后的地址写入基址寄 器 否则基址寄 器的内容 改变基址寄 器 允许 R1附 寄 器列表可 R0~R1附的任意组合{∧二 可选后缀 当指 LDM 寄 器列表中包 R1附 选用 后缀时表示 除了 常的数据传送之外 将SPSR复制到CPSR 同时 后缀 表示传入或传出的是用户模式 的寄 器 而 是当前模式 的寄 器。
ARM入门教程.pdf
目录第1章 ARM微处理器概述 51.1 ARM-Advanced RISC Machines 51.2 ARM微处理器的应用领域及特点 51.2.1 ARM微处理器的应用领域 51.2.2 ARM微处理器的特点 61.3 ARM微处理器系列 61.3.1 ARM7微处理器系列 61.3.2 ARM9微处理器系列 71.3.3 ARM9E微处理器系列 71.3.4 ARM10E微处理器系列 71.3.5 SecurCore微处理器系列 81.3.6 StrongARM微处理器系列 81.3.7 Xscale处理器 81.4 ARM微处理器结构 81.4.1 RISC体系结构 81.4.2 ARM微处理器的寄存器结构 91.4.3 ARM微处理器的指令结构 91.5 ARM微处理器的应用选型 101.6 本章小节10第2章 ARM微处理器的编程模型 112.1 ARM微处理器的工作状态 112.2 ARM体系结构的存储器格式 112.3 指令长度及数据类型 122.4 处理器模式 122.5 寄存器组织 132.5.1 ARM状态下的寄存器组织 132.5.2 Thumb状态下的寄存器组织 152.5.3 程序状态寄存器 162.6 异常(Exceptions) 182.6.1 ARM体系结构所支持的异常类型 182.6.2 对异常的响应 182.6.3 从异常返回 192.6.4 各类异常的具体描述 192.6.5 异常进入/退出小节 202.6.6 异常向量(Exception Vectors) 202.6.7 异常优先级(Exception Priorities) 212.6.8 应用程序中的异常处理 212.7 本章小节21第3章 ARM微处理器的指令系统 223.1 ARM微处理器的指令集概述 223.1.1 ARM微处理器的指令的分类与格式 223.1.2 指令的条件域 233.2 ARM指令的寻址方式 233.2.1 立即寻址 243.2.2 寄存器寻址 243.2.2 寄存器间接寻址 243.2.3 基址变址寻址 243.2.4 多寄存器寻址 253.2.5 相对寻址 253.2.6 堆栈寻址 253.3 ARM指令集 253.3.1 跳转指令 253.3.2 数据处理指令 263.3.3 乘法指令与乘加指令 303.3.4 程序状态寄存器访问指令 323.3.5 加载/存储指令 323.3.6 批量数据加载/存储指令 343.3.7 数据交换指令 353.3.8 移位指令(操作) 353.3.9 协处理器指令 363.3.10 异常产生指令 383.4 Thumb指令及应用 383.5 本章小节39第4章 ARM程序设计基础 404.1 ARM汇编器所支持的伪指令 404.1.1 符号定义(Symbol Definition)伪指令 404.1.2 数据定义(Data Definition)伪指令 414.1.3 汇编控制(Assembly Control)伪指令 434.1.4 其他常用的伪指令 454.2 汇编语言的语句格式 484.2.1 在汇编语言程序中常用的符号 494.2.2 汇编语言程序中的表达式和运算符 494.3 汇编语言的程序结构 524.3.1 汇编语言的程序结构 524.3.2 汇编语言的子程序调用 524.3.3 汇编语言程序示例 534.3.4 汇编语言与C/C++的混合编程 554.4 本章小节56第5章应用系统设计与调试 575.1 系统设计概述 575.2 S3C4510B概述 585.2.1 S3C4510B及片内外围简介 585.2.2 S3C4510B的引脚分布及信号描述 615.2.3 CPU内核概述及特殊功能寄存器(Special Registers) 675.2.4 S3C4510B的系统管理器(System Manager) 725.3 系统的硬件选型与单元电路设计 825.3.1 S3C4510B芯片及引脚分析 825.3.2 电源电路 835.3.3 晶振电路与复位电路 835.3.4 Flash存储器接口电路 855.3.5 SDRAM接口电路 895.3.6 串行接口电路 935.3.7 IIC接口电路 945.3.8 JTAG接口电路 955.3.9 10M/100M以太网接口电路 965.3.10 通用I/O接口电路 1005.4 硬件系统的调试 1015.4.1 电源、晶振及复位电路 1015.4.2 S3C4510B及JTAG接口电路 1025.4.3 SDRAM接口电路的调试 1035.4.4 Flash接口电路的调试 1055.4.5 10M/100M以太网接口电路 1055.5 印刷电路板的设计注意事项 1055.5.1 电源质量与分配 1055.5.2 同类型信号线的分布 1065.6 本章小节 106 第6章部件工作原理与编程示例 1076.1 嵌入式系统的程序设计方法 1076.2 部件工作原理与编程示例 1086.2.1 通用I/O口工作原理与编程示例 1086.2.2 串行通讯工作原理与编程示例 1116.2.3 中断控制器工作原理与编程示例 1206.2.4 定时器工作原理与编程示例 1236.2.5 GDMA工作原理与编程示例 1276.2.6 IIC总线控制器工作原理 1336.2.7 以太网控制器工作原理 138主要特性139MAC功能模块 140 带缓冲DMA接口(Buffered DMA Interface) 144以太网控制器特殊功能寄存器(Ethernet Controller Special Registers) 147MAC寄存器(Media Access Control(MAC)Register) 154以太网控制器的操作(Ethernet Controller Operation) 160发送一个帧(Transmitting a Frame) 162接收一个帧(Receiving a Frame) 1626.2.8 Flash存储器工作原理与编程示例 1626.3 BootLoader简介 1676.4 本章小节 167 第7章嵌入式uClinux及其应用开发 1687.1 嵌入式uClinux系统概况 1687.2 开发工具GNU的使用 1707.2.1 GCC编译器 1707.2.2 GNU Make 1727.2.3 使用GDB调试程序 1777.3 建立uClinux开发环境 1807.3.1 建立交叉编译器 1817.3.2 uClinux针对硬件的改动 1847.3.3 编译uClinux内核 1857.3.4 内核的加载运行 1877.4 在uClinux下开发应用程序 1887.4.1 串行通信 1907.4.2 socket编程 1957.4 .3 添加用户应用程序到uClinux 2027.4.4 通过网络添加应用程序到目标系统 2057.5 本章小结 207 第8章ARM ADS集成开发环境的使用 2098.1 ADS集成开发环境组成介绍 2098.1.1 命令行开发工具 2098.1.2 ARM运行时库 2188.1.3 GUI开发环境(Code Warrior和AXD) 2198.1.4 实用程序 2218.1.5 支持的软件 2218.2 使用ADS创建工程 2228.2.1 建立一个工程 2228.2.2 编译和链接工程 2258.2.3 使用命令行工具编译应用程序 2298.3 用AXD进行代码调试 2308.4 本章小结 233第1章 ARM微处理器概述本章简介ARM微处理器的一些基本概念、应用领域及特点,引导读者进入ARM技术的殿堂。
第3章 ARM微处理器的指令系统
LOOP
;跳转到LOOP
R0,R0,R1 PC,LR
;R0 = R0 + R1 ;子程序返回
END
;文件结束
ARM处理器寻址方式小结
寻址方式是根据指令中给出的地址码字段来 实现寻找真实操作数地址的方式。ARM处理 器具有9种基本寻址方式。 1.寄存器寻址; 2.立即寻址;
3.寄存器移位寻址;
5.基址寻址;
3.1
ARM指令的寻址方式
Resources : /aalp/html/frames.html /assembler/
第3章 ARM 微处理器的指令集
ARM指令集与Thumb指令集的关系
LDR R2,[R3,#0x0C] R3 0x40000000 ;读取R3+0x0C地址上的 为地址装载数 ;存储单元的内容,放入R2
R2 0xAA 0x55
LDR R2,[R3,#0x0C] STR R1,[R0,#-4]!;先R0=R0-4,然后把R1的值
;寄存到保存到R0指定的存储单元
3.1 ARM处理器寻址方式
3.2 ARM指令集介绍
ARM指令集——第2个操作数
#immed_8r——常数表达式
该常数必须对应8位位图,即一个8位的常 数通过循环右移偶数位得到。
循环右移10位
00000000000000000000000000010010 0x00 0x00 0x00 0x12
8位常数
00000100100000000000000000000000 0x04 0x80 0x00 0x00
寻址方式分类——基址寻址
基址寻址指令举例如下:
LDR R0,[R1],#4;R0=[R1] , R1 = R1 + 4 ;后索引基址寻址 LDR R0,[R1,R2] ;R0=[R1+R2]
第三节ARM体系结构
一般的通用寄存器
寄存器类别 寄存器在汇编中的名称
用户
系统
R0(a1)
R1(a2)
R2(a3)其中R0~R7为
R3(a4)
未R分4(v1) 组的寄存器,也
通用寄存器 和程序计数
器
就R是5(v2) 说对于任何处理 R6(v3)
器R模7(v4) 式,这些寄存器 都对应于相同的32位 R8(v5)
管理 (svc) 操作系下统保访护问代码用户模系统式复位的和寄软件存中器断响就应比时进较入方此模式
中止 (abt) 未定义 (und)
用或于存支储便 可持器虚 保,以拟护而使内存且用和操这/ 作个在A系模RM统式7TD的访MI一问没有些一大用特 些处权 受任 控务 的 支软持件硬仿资件真协源处。理器的 未定义指令异常响应时进入此模式
各模式下实际访问的寄存器
用户
系统
管理
中止
未定义
RR00
在汇编语言中寄存
R1
器R0~R13为保存数据
R2
或地址值的通用寄存器。
R3
它们是完全通用的寄存器, R4
不会被体系结构作为特殊
R5
用途,并且可用于任何使
R6
用通用寄存器的指令。
R7
R8
R9
R10
R11
R12
R13
RR1133__ssvc
R13_abt
SSPPSSRR__fifqiq
ARM状态各模式下可以访问的寄存器
寄存器类别 寄存器在汇编中的名称
通用寄存器和 程序计数器
状态寄存器
R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13(SP) R14(LR) R15(PC) CPSR SPSR
第3章ARM的指令系统PPT课件
条件执行:所有指令都可条件执行 指令可以自己决定是否影响标志位
条件执行及标志位**
ARM指令可以通过添加适当的条件码后缀来达到条件 执行的目的。
这样可以提高代码密度,减少分支跳转指令数目,提高性能。
CMP r3,#0
CMP r3,#0
BEQ skip
ADDNE r0,r1,r2
ADD R2,R0,R1,LSR #5
MOV R1,R0,LSL #2
逻辑左移3位
R2 0x01
0x08
R0 0x5058
MOV R0,R2,LSL #311LSL移位操作:0
LSR移位操作:
0
ASR移位操作:
ROR移位操作:
RRX移位操作:
C
3.1 ARM处理器的寻址方式
3.1.2 内存访问指令寻址方式
;送0到R0
ADD R3,R3,#1 ;R3的值加1
CMP R7,#1000 ;R7的值和1000比较
9
3.1.1 数据处理指令寻址方式
2.寄存器寻址方式
寄存器的值可以被直接用于数据操作指令,这种寻址方 式是各类处理器经常采用的一种方式,也是一种执行效 率较高的寻址方式,如:
MOV R2,R0
后是否改变状态标志 状态标志位只有4位 有两种指令密度 无整数除法指令 大多数ARM指令都可以条件执
行 有适合DSP处理的乘加指令 Load/Store访存体系结构
x86指令集
非规整指令格式 即:非正交指令格式
二地址指令 指令隐含决定运算完毕后是否
改变状态标志 状态标志位有6位 单一指令密度 有整数除法指令 专用条件判断指令进行程序分
下表为所有可能的条件码:
注意:AL为默认状态,不需要单独指出
ARM的指令系统
操作码一般由指令助记符码、条件码等组成。操作数字段可以有 两个或者三个,第一个操作数为目的操作数,后面的操作数为源操作 数。
3
一、ARM指令格式
基本格式如下:
<opco<Rn>{,operand2}
其中:
opcode cond S Rd Rn operand2 指令助记符,如LDR. STR等。 执行条件,如EQ、NE等。 是否影响CPSR寄存器的值,书写时影响CPSR 目标寄存器。 第一个操作数的寄存器。 第二个操作数。
MOV R1, R2 ;将R2的值存入R1中
8
2.3 寄存器移位寻址
寄存器移位寻址是ARM指令集特有的寻址方式,只能对操作数使用。
MOV ANDS R0,R1,LSL #3 R1,R1,R2,LSL R3
;R1的值左移3位,结果放入R0,即R0=R1×8 ;R2的值左移R3位,然后和R1相“与”操作, ;结果放入R1中
11
2.5 基址寻址
基址寻址就是将基址寄存器的内容与指令中给出的偏移量相加,形 成操作数的有效地址。
前索引基址寻址方式,基址寄存器的值不改变。 ① 前索引基址寻址方式,基址寄存器的值不改变。
LDR R2,[R3,#0x0C] R2 [R3 #0x0C] ; [R3 + 0x0C]→ R2 R2,基址寄存器R3的值保持不变 R3
ARM嵌入式体系结构与接口技术 嵌入式体系结构与接口技术
第3章 ARM的指令系统
1
目录
一、ARM指令格式 二、寻址方式 二、ARM指令后缀
2
一、ARM指令格式
汇编指令由操作码字段 操作数字段 操作码字段和操作数字段 操作码字段 操作数字段两部分组成。 操作码字段指示处理器所要执行的操作; 操作码字段 操作数字段指出在指令执行操作的过程中所需要的操作数。 操作数字段 指令的一般格式:
微处理器体系结构及功能模块
第一节 微生物农药
2.真菌杀虫剂
典型的代表是白僵菌杀虫剂。白僵菌是一种广谱寄生的真 菌,广泛地使昆虫致病,由该菌引起的病占昆虫真菌病的 21%左右,能侵染鳞翅目、鞘翅目、直翅目、膜翅目、同翅 目的众多昆虫及螨类。白僵菌接触虫体感染,适宜条件下其 分生孢子萌发长出芽管,并能分泌出几丁质酶溶解昆虫表皮 ,使菌丝侵入体内生长繁殖,并产生毒素(白僵菌素)和草 酸钙结晶,从而使昆虫细胞组织破坏和代谢机能紊乱,最后 虫体上生出白色的棉絮状菌丝和分生孢子梗及孢子堆,整个 虫体水分被菌吸收变成白色僵尸,白僵菌因此而得名。
第一节 微生物农药
1.细菌杀虫剂
苏云金芽孢杆菌杀虫剂,简称Bt杀虫剂,是当今使用最广 泛和产量最大的细菌杀虫剂。它是由昆虫病原细菌苏云金杆 菌的发酵产物加工而成,能防治直翅目、鞘翅目、双翅目、 膜翅目等上百种害虫,如稻纵卷叶螟、棉铃虫、茶毛虫、玉 米螟等。苏云金芽孢杆菌杀虫剂之所以成为目前产量最大、 应用最广、深受欢迎的农药,除其杀虫效果好外,更重要的 是对人、畜无伤害;对植物不产生药害,不影响农作物的色 、香、味;也不伤害害虫的天敌和有益的生物,能保持使用 环境的生态平衡;对土壤、水源、空气环境不造成污染,有 利于社会经济的持续发展。
3次指令,2次数据
1次指令,2次数据
若存储器速度为系统瓶颈,则应采用微码CPU
几个概念
1. 中央处理单元 控制器、运算器、寄存器
Central Processing Unit, CPU
2. 微处理器
单
片
Micro Processing Unit, MPU
芯 片
3. 微控制单元
Micro Control Unit, MCU
第一节 微生物农药
苏云金芽孢杆菌能在细胞内形成杀虫的伴胞晶体和水溶性 的外毒素(苏云金素)。伴胞晶体被敏感性昆虫的幼虫吞食 后,在其碱性的中肠溶解成原毒素,并进而在昆虫肠道被蛋 白酶水解激活,产生毒素核心片段(δ内毒素)。它与中肠 上皮细胞膜上的特异受体结合,能快速并不可逆地插入细胞 膜,形成孔洞,从而破坏细胞的膜结构与渗透吸收特性,使 中肠上皮细胞裂解崩溃,最终导致昆虫的死亡。
第三章 ARM指令系统
3.1 ARM指令系统概述
一、指令系统概念
指令:是规定计算机进行某种操作的命令。 指令系统:计算机能够执行的各种指令的集合。
二、ARM指令的特点
– – – – – – – 所有指令都是32位的。 大多数指令都在单周期内完成。 所有指令都可以条件执行。 ARM指令为load/store类型。 基本指令仅36条,分成五类。 有7种寻址方式。 指令集可以通过协处理器扩展。
指令条件码表
条件码
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100
助记符
EQ NE CS/HS CC/LO MI PI VS VC HI 志
Z=1 Z=0 C=1 C=0 N=1 N=0 V=1 V=0 C=1且Z=0 C=0或Z=1 N=V N!=V Z=0且N=V
0 0
下列命令中,汇编器把立即数转换为移位操作:
MOV R0,#4096 ; uses 0x40 ror 26 ADD R1,R2,#0xFF0000 ; uses 0xFF ror 16
带有立即数的MOV 指令的二进制编码为:
0xF200 =0xF2循环右移(2*C)
MOV R0,#0xF200
MOV R1,#0x110000 MOV R4,#0x12800
31 0 0
SUB R3,R2,R1,LSL #2 ;R3←R2-(R1左移2位) SUB R3,R2,R1,LSR R0 ;R3←R2-(R1右移R0位)
(3)ASL:算术左移,由于左移空出的有效 位用0填充,因此它与LSL同义。 (4)ASR:算术右移 (Arithmetic Shift Right) 。算术移位的对象是带符号数,移位过程 中必须保持操作数的符号不变。如果源操作数是 正数,空出的最高有效位用0 填充,如果是负 数用1填充。
第3章 ARM微处理器的指令系统4-ARM指令应用举例
SUB R0, R2, R3 ;比较两字符的大小
MOV PC, LR
Assemble Language of ARM
16
3. 长跳转
通过直接向PC寄存器中存取数据,程序可以实 现在4GB的地址空间的任意跳转,这种跳转叫做 长跳转。
返回地址如何计算?
ADD LR, PC, #4
;保存返回地址,指向PC+12处,即return_here
R0=ABCD
R0=DCBA
EOR R1, R0, R0, ROR #16 ;R1=A^C, B^D, C^A, D^B
BIC R1, R1, #0xFF0000 ;R1=A^C, 0, C^A, D^B
MOV R0, R0, ROR #8
;R0= D, A, B, C
EOR R0, R0, R1, LSR #8 ;LSR: 0, A^C, 0, C^A
return a; }
Assemble Language of ARM
8
最大公约数ARM汇编代码:
gcd cmp r0, r1 ;reached the end?
beq stop
ቤተ መጻሕፍቲ ባይዱ
blt less
;if r0 > r1
sub r0, r0, r1 ;subtract r1 from r0
b gcd
less sub r1, r1, r0 ;subtract r0 from r1
2
2. 实现乘法的指令段
MOV R0, R0, LSL #1 ADD R0, R0, R0, LSL #1 RSB R0, R1, R0, LSL #2
;2*R0 ;3*R0 ;4*R0-R1
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第3章ARM微处理器的指令系统本章介绍ARM指令集、Thumb指令集,以及各类指令对应的寻址方式,通过对本章的阅读,希望读者能了解ARM微处理器所支持的指令集及具体的使用方法。
本章的主要内容有:-ARM指令集、Thumb指令集概述。
-ARM指令集的分类与具体应用。
-Thumb指令集简介及应用场合。
3.1ARM微处理器的指令集概述3.1.1ARM微处理器的指令的分类与格式ARM微处理器的指令集是加载/存储型的,也即指令集仅能处理寄存器中的数据,而且处理结果都要放回寄存器中,而对系统存储器的访问则需要通过专门的加载/存储指令来完成。
ARM微处理器的指令集可以分为跳转指令、数据处理指令、程序状态寄存器(PSR)处理指令、加载/存储指令、协处理器指令和异常产生指令六大类,具体的指令及功能如表3-1所示(表中指令为基本ARM指令,不包括派生的ARM指令)。
表3-1ARM指令及功能描述助记符指令功能描述ADC带进位加法指令ADD加法指令AND逻辑与指令B跳转指令BIC位清零指令BL带返回的跳转指令BLX带返回和状态切换的跳转指令BX带状态切换的跳转指令CDP协处理器数据操作指令CMN比较反值指令CMP比较指令EOR异或指令LDC存储器到协处理器的数据传输指令LDM加载多个寄存器指令LDR存储器到寄存器的数据传输指令MCR从ARM寄存器到协处理器寄存器的数据传输指令MLA乘加运算指令MOV数据传送指令MRC从协处理器寄存器到ARM寄存器的数据传输指令MRS传送CPSR或SPSR的内容到通用寄存器指令MSR传送通用寄存器到CPSR或SPSR的指令MUL32位乘法指令MLA32位乘加指令3.1.2指令的条件域当处理器工作在ARM状态时,几乎所有的指令均根据CPSR中条件码的状态和指令的条件域有条件的执行。
当指令的执行条件满足时,指令被执行,否则指令被忽略。
每一条ARM指令包含4位的条件码,位于指令的最高4位[31:28]。
条件码共有16种,每种条件码可用两个字符表示,这两个字符可以添加在指令助记符的后面和指令同时使用。
例如,跳转指令B 可以加上后缀EQ变为BEQ表示“相等则跳转”,即当CPSR中的Z标志置位时发生跳转。
在16种条件标志码中,只有15种可以使用,如表3-2所示,第16种(1111)为系统保留,暂时不能使用。
表3-2指令的条件码条件码助记符后缀标志含义0000EQ Z置位相等0001NE Z清零不相等0010CS C置位无符号数大于或等于0011CC C清零无符号数小于0100MI N置位负数0101PL N清零正数或零0110VS V置位溢出0111VC V清零未溢出1000HI C置位Z清零无符号数大于1001LS C清零Z置位无符号数小于或等于1010GE N等于V带符号数大于或等于1011LT N不等于V带符号数小于1100GT Z清零且(N等于V)带符号数大于1101LE Z置位或(N不等于V)带符号数小于或等于1110AL忽略无条件执行3.2ARM指令的寻址方式所谓寻址方式就是处理器根据指令中给出的地址信息来寻找物理地址的方式。
目前ARM指令系统支持如下几种常见的寻址方式。
3.2.1立即寻址立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数。
这个操作数被称为立即数,对应的寻址方式也就叫做立即寻址。
例如以下指令:ADD R0,R0,#1;R0←R0+1ADD R0,R0,#0x3f;R0←R0+0x3f在以上两条指令中,第二个源操作数即为立即数,要求以“#”为前缀,对于以十六进制表示的立即数,还要求在“#”后加上“0x”或“&”。
3.2.2寄存器寻址寄存器寻址就是利用寄存器中的数值作为操作数,这种寻址方式是各类微处理器经常采用的一种方式,也是一种执行效率较高的寻址方式。
以下指令:ADD R0,R1,R2;R0←R1+R2该指令的执行效果是将寄存器R1和R2的内容相加,其结果存放在寄存器R0中。
3.2.2寄存器间接寻址寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。
例如以下指令:ADD R0,R1,[R2];R0←R1+[R2]LDR R0,[R1];R0←[R1]STR R0,[R1];[R1]←R0在第一条指令中,以寄存器R2的值作为操作数的地址,在存储器中取得一个操作数后与R1相加,结果存入寄存器R0中。
第二条指令将以R1的值为地址的存储器中的数据传送到R0中。
第三条指令将R0的值传送到以R1的值为地址的存储器中。
3.2.3基址变址寻址基址变址寻址就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。
变址寻址方式常用于访问某基地址附近的地址单元。
采用变址寻址方式的指令常见有以下几种形式,如下所示:LDR R0,[R1,#4];R0←[R1+4]LDR R0,[R1,#4]!;R0←[R1+4]、R1←R1+4LDR R0,[R1],#4;R0←[R1]、R1←R1+4LDR R0,[R1,R2];R0←[R1+R2]在第一条指令中,将寄存器R1的内容加上4形成操作数的有效地址,从而取得操作数存入寄存器R0中。
在第二条指令中,将寄存器R1的内容加上4形成操作数的有效地址,从而取得操作数存入寄存器R0中,然后,R1的内容自增4个字节。
在第三条指令中,以寄存器R1的内容作为操作数的有效地址,从而取得操作数存入寄存器R0中,然后,R1的内容自增4个字节。
在第四条指令中,将寄存器R1的内容加上寄存器R2的内容形成操作数的有效地址,从而取得操作数存入寄存器R0中。
3.2.4多寄存器寻址采用多寄存器寻址方式,一条指令可以完成多个寄存器值的传送。
这种寻址方式可以用一条指令完成传送最多16个通用寄存器的值。
以下指令:LDMIA R0,{R1,R2,R3,R4};R1←[R0];R2←[R0+4];R3←[R0+8];R4←[R0+12]该指令的后缀IA表示在每次执行完加载/存储操作后,R0按字长度增加,因此,指令可将连续存储单元的值传送到R1~R4。
3.2.5相对寻址与基址变址寻址方式相类似,相对寻址以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。
以下程序段完成子程序的调用和返回,跳转指令BL采用了相对寻址方式:BL NEXT;跳转到子程序NEXT处执行……NEXT……MOV PC,LR;从子程序返回3.2.6堆栈寻址堆栈是一种数据结构,按先进后出(First In Last Out,FILO)的方式工作,使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。
当堆栈指针指向最后压入堆栈的数据时,称为满堆栈(Full Stack),而当堆栈指针指向下一个将要放入数据的空位置时,称为空堆栈(Empty Stack)。
同时,根据堆栈的生成方式,又可以分为递增堆栈(Ascending Stack)和递减堆栈(Decending Stack),当堆栈由低地址向高地址生成时,称为递增堆栈,当堆栈由高地址向低地址生成时,称为递减堆栈。
这样就有四种类型的堆栈工作方式,ARM微处理器支持这四种类型的堆栈工作方式,即:-满递增堆栈:堆栈指针指向最后压入的数据,且由低地址向高地址生成。
-满递减堆栈:堆栈指针指向最后压入的数据,且由高地址向低地址生成。
-空递增堆栈:堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成。
-空递减堆栈:堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成。
3.3ARM指令集本节对ARM指令集的六大类指令进行详细的描述。
3.3.1跳转指令跳转指令用于实现程序流程的跳转,在ARM程序中有两种方法可以实现程序流程的跳转:—使用专门的跳转指令。
—直接向程序计数器PC写入跳转地址值。
通过向程序计数器PC写入跳转地址值,可以实现在4GB的地址空间中的任意跳转,在跳转之前结合使用MOV LR,PC等类似指令,可以保存将来的返回地址值,从而实现在4GB连续的线性地址空间的子程序调用。
ARM指令集中的跳转指令可以完成从当前指令向前或向后的32MB的地址空间的跳转,包括以下4条指令:—B跳转指令—BL带返回的跳转指令—BLX带返回和状态切换的跳转指令—BX带状态切换的跳转指令1、B指令B指令的格式为:B{条件}目标地址B指令是最简单的跳转指令。
一旦遇到一个B指令,ARM处理器将立即跳转到给定的目标地址,从那里继续执行。
注意存储在跳转指令中的实际值是相对当前PC值的一个偏移量,而不是一个绝对地址,它的值由汇编器来计算(参考寻址方式中的相对寻址)。
它是24位有符号数,左移两位后有符号扩展为32位,表示的有效偏移为26位(前后32MB的地址空间)。
以下指令:B Label;程序无条件跳转到标号Label处执行CMP R1,#0;当CPSR寄存器中的Z条件码置位时,程序跳转到标号Label处执行BEQ Label2、BL指令BL指令的格式为:BL{条件}目标地址BL是另一个跳转指令,但跳转之前,会在寄存器R14中保存PC的当前内容,因此,可以通过将R14的内容重新加载到PC中,来返回到跳转指令之后的那个指令处执行。
该指令是实现子程序调用的一个基本但常用的手段。
以下指令:BL Label;当程序无条件跳转到标号Label处执行时,同时将当前的PC值保存到R14中3、BLX指令BLX指令的格式为:BLX目标地址BLX指令从ARM指令集跳转到指令中所指定的目标地址,并将处理器的工作状态有ARM状态切换到Thumb状态,该指令同时将PC的当前内容保存到寄存器R14中。
因此,当子程序使用Thumb指令集,而调用者使用ARM指令集时,可以通过BLX指令实现子程序的调用和处理器工作状态的切换。
同时,子程序的返回可以通过将寄存器R14值复制到PC中来完成。
4、BX指令BX指令的格式为:BX{条件}目标地址BX指令跳转到指令中所指定的目标地址,目标地址处的指令既可以是ARM指令,也可以是Thumb 指令。
3.3.2数据处理指令数据处理指令可分为数据传送指令、算术逻辑运算指令和比较指令等。
数据传送指令用于在寄存器和存储器之间进行数据的双向传输。
算术逻辑运算指令完成常用的算术与逻辑的运算,该类指令不但将运算结果保存在目的寄存器中,同时更新CPSR中的相应条件标志位。
比较指令不保存运算结果,只更新CPSR中相应的条件标志位。
数据处理指令包括:—MOV数据传送指令—MVN数据取反传送指令—CMP比较指令—CMN反值比较指令—TST位测试指令—TEQ相等测试指令—ADD加法指令—ADC带进位加法指令—SUB减法指令—SBC带借位减法指令—RSB逆向减法指令—RSC带借位的逆向减法指令—AND逻辑与指令—ORR逻辑或指令—EOR逻辑异或指令—BIC位清除指令1、MOV指令MOV指令的格式为:MOV{条件}{S}目的寄存器,源操作数MOV指令可完成从另一个寄存器、被移位的寄存器或将一个立即数加载到目的寄存器。