2010-第3章 ARM9指令系统
第3章 ARM指令系统
嵌入式技术基础
陈长顺
第三章 ARM指令系统
嵌入式技术基础
第三章 ARM指令系统
第三章 ARM指令系统
嵌入式技术基础
复习引入
ARM寄存器是如何组织的? ARM程序状态寄存器是如何定义的? ARM储存器采用哪些存储格式?如何定义?
第三章 ARM指令系统
嵌入式技术基础
ARM状态下的寄存器组织
C
31
0 RRX移位操作
第三章 ARM指令系统
嵌入式技术基础
ARM寻址方式_寄存器间接寻址
寄存器间接寻址是指操作数保存在存储器指定地址 的存储单元中,地址通过寄存器给出,寄存器为操 作数的地址指针。ARM的传送指令都是基于寄存 器的间接寻址,即通过Load/Store完成对数据的传 送操作。 实例
1
ARM指令概述
2
ARM指令寻址方式
3
ARM指令集
4 Thumb指令集 5 ARM汇编伪指令 6
ARM 汇编程序设计
第三章 ARM指令系统
嵌入式技术基础
ARM指令集
ARM指令集可以分为分支指令、数据处理指令、寄存 器访问指令、加载/存储指令、协处理器指令、异常产 生指令、伪指令七大类 。
第三章 ARM指令系统
第三章 ARM指令系统
嵌入式技术基础
ARM指令集_分支指令
带链接的跳转指令BL 指令格式
BL{cond} label
指令功能
将下一条指令的地址复制到R14(即LR)链接寄存器中, 然后跳转到指定地址运行程序。
实例
BL DELAY ;跳转到DELAY标号处,同时将 ; PC的值保存到LR寄存器中
ASR:算术右移,移位过程中保持符号位不变,即 若源操作数为正数,则字的高位空出位补0,否则 补1;
第3章 ARM9指令系统
3.1 ARM处理器寻址方式
寻址方式:是根据指令中给出的地址信息来实现寻找真实操作 数地址的方式。
寻址:寻找真实操作数地址。
ARM处理器具有8种基本寻址方式。
1.寄存器寻址; 3.寄存器间接寻址; 5.寄存器移位寻址; 7.堆栈寻址;
2.立即寻址; 4.基址寻址; 6.多寄存器寻址; 8.相对寻址。
寻址:寻找真实操作数地址。
• 寻址方式分类——相对寻址
相对寻址是基址寻址的一种变通。由程序计数 器PC提供基准地址,指令中的地址码字段作为偏移 量,两者相加后得到的地址即为操作数的有效地址。 相对寻址指令举例如下:
BL
SUBR1
;调用到SUBR1子程序
BEQ LOOP
;条件跳转到LOOP标号处
...
其中<>号内的项是必须的,{}号内的项是可选的。 各项的说明如下:
opcode:指令助记符; cond:执行条件;
S:是否影响CPSR寄存器的值;
Rd:目标寄存器;
Rn:第1个操作数的寄存器;
op2:第2个操作数;
3.2 指令集介绍
• ARM指令集——条件码
ARM指令的基本格式如下:
<opcode> {<cond>} {S} <Rd> ,<Rn>{,<operand2>}
MOV
PC,LR
END
;声明代码段Example1 ;标识程序入口 ;声明32位ARM指令 ;设置参数
;调用子程序ADD_SUB ;跳转到LOOP
;R0 = R0 + R1 ;子程序返回 ;文件结束
3.2 指令集介绍
• ARM指令集——指令格式
第三章 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微处理器的指令系统
第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 同时 后缀 表示传入或传出的是用户模式 的寄 器 而 是当前模式 的寄 器。
第3章 ARM9指令系统
b++;
;若R0>R1,则R0=R0+1
ADDLS R1,R1,#1 ;若R0≤R1,则R1=R1+1
8
3.1.1 寄存器装载及存储指令
Load/Store指令用于寄存器和内存间数据的传送. Load用于把内存中的数据装载到寄存器中 Store则用于把寄存器中的数据存入内存。
外围模块或芯片
24
1、单一数据加载/存储指令
(5) LDRSB 有符号的字节数据加载指令 格式:LDR{<cond>}SB <Rd>,<addr> 功能:同LDRB指令,但该指令将寄存器Rd的高 24位设置成所装载的字节数据符号位的值。
例如: LDRSB R0,[R1] ;将内存中起始地址为R1的一个字节数据装入R0中 ,R0的高24位设置成该字节数据的符号位
28
1、单一数据加载/存储指令
(8)STRH指令
格式为:
STR{条件}H 源寄存器,<存储器地址>
STRH指令是无符号半字存储指令,用于从
源寄存器中将一个16位的半字数据传送到存储
器中。该半字数据为源寄存器中的低16位。
29
1、单一数据加载/存储指令
指令示例: STRH R3,[R1] ;将寄存器R3中的半字数据写入以R1为地址的存 储器中。 STRH R3,[R1,#8] ;将寄存器R3中的半字数据写入以R1+8为地址 的存储器中。
15
1、单一数据加载/存储指令
(2)STR指令
格式为:
STR{条件}
源寄存器,<存储器地址>
STR指令是字存储指令,用于从源寄存器
中将一个32位的字数据传送到存储器中。使用方
第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]
arm9协处理器指令
ARM协处理器指令什么是协处理器?协处理器是一种芯片,用于减轻系统微处理器的特定处理任务。
例如,数学协处理器可以控制数字处理;图形协处理器可以处理视频绘制。
例如,intel pentium 微处理器就包括内置的数学协处理器。
协处理器可以附属于ARM处理器。
一个协处理器通过扩展指令集或提供配置寄存器来扩展内核处理功能。
一个或多个协处理器可以通过协处理器接口与ARM内核相连。
协处理器可以通过一组专门的、提供load-store类型接口的ARM指令来访问。
例如协处理器15(CP15),ARM处理器使用协处理器15的寄存器来控制cache、TCM和存储器管理。
协处理器也能通过提供一组专门的新指令来扩展指令集。
例如,有一组专门的指令可以添加到标准ARM指令集中,以处理向量浮点(VFP)运算。
这些新指令是在ARM流水线的译码阶段被处理的。
如果在译码阶段发现是一条协处理器指令,则把它送给响应的协处理器。
如果该协处理器不存在,或不认识这条指令,则ARM认为发生了未定义指令异常。
这也使得编程者可以用软件来仿真协处理器的行为(使用未定义指令异常服务子程序)。
80486CPU之前有协处理器,提高浮点运算能力,那时cpu较弱才有的协处理器,现在速度是原来数百倍不止,pc机一般不存在协处理器了。
ARM 微处理器可支持多达16 个协处理器,用于各种协处理操作,在程序执行的过程中,每个协处理器只执行针对自身的协处理指令,忽略ARM 处理器和其他协处理器的指令。
ARM 的协处理器指令主要用于ARM 处理器初始化ARM 协处理器的数据处理操作,以及在ARM 处理器的寄存器和协处理器的寄存器之间传送数据,和在ARM 协处理器的寄存器和存储器之间传送数据。
ARM 协处理器指令包括以下 5 条:—CDP 协处理器数操作指令—LDC 协处理器数据加载指令—STC 协处理器数据存储指令—MCR ARM 处理器寄存器到协处理器寄存器的数据传送指令—MRC 协处理器寄存器到ARM 处理器寄存器的数据传送指令1、CDP 指令CDP 指令的格式为:CDP{条件} 协处理器编码,协处理器操作码1,目的寄存器,源寄存器1,源寄存器2,协处理器操作码2。
第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为默认状态,不需要单独指出
第4讲(ARM指令系统)
10/14/2010
《ARM嵌入式应用技术基础》第3章
11
1.5 基址寻址
基址寻址就是将基址寄存器的内容与指令中给出的偏移量相加,形 成操作数的有效地址。 前索引基址寻址方式,基址寄存器的值不改变。 ① 前索引基址寻址方式,基址寄存器的值不改变。
LDR R2,[R3,#0x0C] R2 [R3 #0x0C] ; [R3 + 0x0C]→ R2 R2,基址寄存器R3的值保持不变 R3
10/14/2010
《ARM嵌入式应用技术基础》第3章
13
三、ARM指令后缀
基本格式如下:
<opcode> {cond} {*} <Rd> ,<Rn>{,operand2}
其中:
cond * 执行条件后缀。 其他后缀:S后缀、!后缀、字长后缀、索引后缀、T后缀等等
10/14/2010
《ARM嵌入式应用技术基础》第3章
10/14/2010
《ARM嵌入式应用技术基础》第3章
7
2.2 寄存器寻址
寄存器寻址是指:操作数的值在寄存器中,指令中的地址码字段 指出的是寄存器的编号,指令执行时直接取出寄存器值来操作。 例:寄存器寻址举例
MOV R1, R2 ;将R2的值存入R1中
10/14/2010
《ARM嵌入式应用技术基础》第3章
8
2.3 寄存器移位寻址
寄存器移位寻址是ARM指令集特有的寻址方式,只能对第2个操作数使用。
MOV ANDS R0,R1,LSL #3 R1,R1,R2,LSL R3 ;R1的值左移3位,结果放入R0,即R0=R1×8 ;R2的值左移R3位,然后和R1相“与”操作, ;结果放入R1中
嵌入式系统-第3章 ARM9指令系统_new
LDM/STM加下列后缀即成为多寄存器寻址指令
➢ IA(Increment After) : 操作完成后地址增 ➢ IB(Increment Before) :操作完成前地址增
➢ DA(Decrement After) :操作完成后地址减
➢ DB(Decrement Before) :操作完成前地址减
LSR操作: LSR(Logical Shift Right) 逻辑右移
格式为: 通用寄存器,LSR 操作数
Logical Shift Right
...0 Destination
CF
LSR可完成对通用寄存器中的内容进行右移的操作,按操作 数所指定的数量向右移位,左端用零来填充,最后一个右移出 的位放在状态寄存器的C位CPSR[29]中,如图3-2所示。其中, 操作数可以是通用寄存器,也可以是立即数(0~31)。
这种移位对有符号数据使用时可以保持符号位不变。
16
3.1.5 寄存器移位寻址
31 30 29
10
C
操作示例: MOV R0, R1, ASR #5 ;将R1中的内容右移5位后传送到R0中,符号位保持不变。 ;最后移出的位同时也送入状态位C中。
17
3.1.5 寄存器移位寻址
Rotate Right through Carry
寄存器寻址 立即寻址 寄存器间接寻址 变址寻址 寄存器移位寻址 多寄存器寻址 堆栈寻址 相对寻址
4
3.1.1 寄存器寻址
寄存器寻址就是利用寄存器中的内容作为操作数,寄 存器本身就是操作数地址。这种寻址方式是各类微处理器 经常采用的一种方式,也是一种执行效率较高的寻址方式。
例如指令:
LDR R0,[R1],#2
;R0←[R1],R1←R1+2 后变址
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2、CMN指令
格式: CMN{条件} 操作数1,操作数2 用于把一个寄存器的内容和另一个寄存器 的内容或立即数取负后进行比较,同时更 新CPSR中条件标志位的值。实际完成操作 数1和操作数2相加,并根据结果更改条件 标志位。 即 操作数1 - ( - 操作数2)
37
CMN R1,R0 ;将R1的值与R0的值相加,并根据结果设置 CPSR的标志位 CMN R1,#100 ;将R1的值与立即数100相加(与-100相 减),并根据结果设置CPSR的标志位
ADDEQS R0,R1,#3
14
指令的条件域表-1
条件码 0000 0001 0010 0011 0100 0101 0110 0111 后缀 EQ NE CS CC MI PL VS VC 标 志 Z置位 Z清零 C置位 C清零 N置位 N清零 V置位 V清零 含 义 相等 不相等
无符号数大于或等于
数据处理指令 跳转指令(分支) 加载/存储指令 程序状态寄存器传输指令(略) 异常中断指令(略) 协处理器指令(略)
18
一、数据处理指令
数据传送指令 算术逻辑运算指令
寄存器及立即数间 传数据 保存运算结果, 影响CPSR
比较指令 乘法和乘加指令
不保存结果,但影 响CPSR
19
一、数据处理指令
35
(四)比较指令 1、CMP指令
格式: CMP{条件} 操作数1,操作数2 用于把一个寄存器的内容和另一个寄存器 的内容或立即数进行比较,同时更新CPSR 中条件标志位的值。该指令进行一次减法 运算,但不存储结果,只更改条件标志位。 CMP R1,R0 CMP R1,#100
36
跳转指令 数据处理指令 装载/存储指令 程序状态寄存器传输指令 异常中断指令 协处理器指令
5
ARM9微处理器指令表-1
助记符 ADC ADD AND B BIC BL BLX BX
指令功能描述 带进位加法指令 加法指令 逻辑与指令 跳转指令 位清零指令 带返回的跳转指令 带返回和状态切换的跳转指令 带状态切换的跳转指令
4. Arm指令的条件执行
大多数Arm指令都可以条件执行,也就 是根据CPSR中的条件标志位决定是否执 行该指令。 当条件满足时该指令执行,条件不满足 时被当作一条NOP指令
13
指令的条件域
CPSR条件位: [31:28] 条件码共有16种 每种条件码可用两个字符表示,这两个 字符可以添加在指令助记符的后面和指 令同时使用。
26
7、AND指令
AND指令的格式为: AND{条件}{S} 目的寄存器,操作数1,操作数2 用于在两个操作数上进行逻辑与运算,并把结 果放置到目的寄存器中。 该指令常用于屏蔽操作数1的某些位。 AND R0,R0,#3 ; 该指令保持R0的0、1位,其余位清零。
ห้องสมุดไป่ตู้
27
8、ORR指令
29
10、BIC指令
BIC指令的格式为: BIC{条件}{S} 目的寄存器,操作数1,操作 数2 用于清除操作数1的某些位,并把结果放置 到目的寄存器中。 操作数2为32位的掩码,如果在掩码中设置 了某一位,则清除这一位。未设置的掩码位 保持不变。 BIC R0,R0,#%1011 ; 该指令清除 R0 中的位 0、1、和 3,其余 的位保持不变。
32
(三)乘法和乘加指令 1.MUL指令
格式: MUL{条件}{S} 目的寄存器,操作数1,操作数2 进行操作数1与操作数2的乘法运算,并把结果 放置到目的寄存器中,同时可以根据运算结果 设置CPSR中相应的条件标志位。其中,操作数 1和操作数2均为32位的有符号数或无符号数。 MUL R0,R1,R2 ;R0 = R1 × R2 MULS R0,R1,R2 ;R0 = R1 × R2,同时设置CPSR中的相关条 件标志位
协处理器寄存器写入存储器指令
批量内存字写入指令
寄存器到存储器的数据传输指令
减法指令
9
ARM微处理器指令表-5
助记符 SWI SWP TEQ TST 指令功能描述 软件中断指令 交换指令 相等测试指令 位测试指令
10
2. 典型的Arm指令的语法格式
一条典型的Arm指令语法格式为 <opcode>{cond}{S} <Rd>,<Rn>,<shift_op>
指令 助记 符
例子:
指令执 行的条 件码
源操作数 1寄存器
决定指令的 执行是否影 响CPSR的值
操作数2 目的寄 存器
ADDEQS R0,R1,#3
11
3. 典型的Arm指令的编码格式
ADDEQS R0,R1,#3
opcode:指令操作符编码 cond:指令执行的条件码 S:决定指令的执行是否影响CPSR的值 Rn:包含第一个源操作数的寄存器编码 Rd:目的寄存器编码 shift_oprand:第二个源操作数编码
助记符 指令功能描述
MLA
MUL
乘加运算指令
32位乘法指令
MRC
MRS MSR
协处理器寄存器内容到ARM寄存器
传送CPSR或SPSR内容到通用寄存器 传送通用寄存器内容到CPSR或SPSR 数据传送指令 数据取反传送指令
8
MOV MVN
ARM微处理器指令表-4
助记符 ORR RSB RSC SBC STC STM STR SUB 指令功能描述 逻辑或指令 逆向减法指令 带借位的逆向减法指令 带借位减法指令
33
2.MLA指令
格式: MLA{条件}{S} 目的寄存器,操作数1,操 作数2,操作数3 目的寄存器=操作数1*操作数2+操作数3 其中,操作数1和操作数2均为32位的有符 号数或无符号数。
34
MLA R0,R1,R2,R3 ;R0=R1×R2+R3
MLAS R0,R1,R2,R3 ;R0 = R1 × R2 + R3,同时设置CPSR中的 相关条件标志位
38
3、TST指令
TST指令的格式为: TST{条件} 操作数1,操作数2 用于把一个寄存器的内容和另一个寄存器 的内容或立即数进行按位的与运算,并根 据运算结果更新CPSR中条件标志位的值。 操作数1是要测试的数据,而操作数2是一 个位掩码,该指令一般用来检测是否设置 了特定的位。
25
6、RSC指令
RSC指令的格式为: RSC{条件}{S} 目的寄存器,操作数1,操作 数2 目的寄存器=操作数2 - 操作数1- !C 该指令可以做大于32位的减法,注意不要忘 记设置S后缀来更改进位标志。该指令可用 于有符号数或无符号数的减法运算。 RSC R0,R1,R2 ; R0 = R2 – R1 - !C
6
ARM9微处理器指令表-2
助记符 CDP CMN CMP EOR LDC LDM LDR MCR 指令功能描述 协处理器数据操作指令 比较反值指令 比较指令 异或指令
存储器到协处理器的数据传输指令
加载多个寄存器指令
存储器到寄存器的数据传输指令
ARM寄存器到协处理器寄存器数据 传输指令
7
ARM微处理器指令表-3
ADCS R3,R6,R9
22
3、SUB指令
SUB指令的格式为: SUB{条件}{S} 目的寄存器,操作数1,操作数2 目的寄存器=操作数1-操作数2 该指令可用于有符号数或无符号数的减法运算。 SUB R0,R1,R2 SUB R0,R1,#256 SUB R0,R2,R3,LSL#1
23
3
3.1 ARM9指令系统
3.1.1
1.
概述
Arm9指令的分类 2. 典型的Arm9指令的语法格式 3. Arm9指令的一般编码格式 4. Arm9指令的条件执行
4
1. Arm9 指令的分类
ARM9微处理器的指令集是加载/存储型的, 也即指令集中多数指令仅能处理寄存器中 的数据,且处理结果都要放回寄存器中, 而对系统存储器的访问则需要通过专门的 加载/存储指令来完成。 指令分类:
嵌入式系统基础
李建义 lijianyi001@
1
第3章 ARM9指令系统
student_ljy@ student_ljy
2
第3章 ARM9指令系统
3.1 ARM9指令系统 概述 ARM9指令分类介绍 汇编器伪指令 3.2 Thumb指令集 3.3 ARM汇编语言程序设计 3.4 C语言与ARM汇编语言混合调用
4、SBC指令
SBC指令的格式为: SBC{条件}{S} 目的寄存器,操作数1,操作 数2 目的寄存器=操作数1 - 操作数2-!C 该指令可以做大于32位的减法,注意不要忘 记设置S后缀来更改进位标志。该指令可用 于有符号数或无符号数的减法运算。 SUBS R0,R1,R2 ?....
R6 R5 R4 R9 R8 R7 R3 R2 R1
24
5、RSB指令
RSB指令的格式为: RSB{条件}{S} 目的寄存器,操作数1,操作 数2 RSB指令称为逆向减法指令,用于把操作数 2减去操作数1,并将结果存放到目的寄存器 中。该指令可用于有符号数或无符号数的减 法运算。 RSB R0,R1,R2 ; R0 = R2 – R1 RSB R0,R1,#256 ; R0 = 256 – R1 RSB R0,R2,R3,LSL#1 ;R0=(R3<<1)-R2