嵌入式系统软件开发 -- ARM指令集_第1页
嵌入式系统软件开发 -- ARM指令集_第2页
嵌入式系统软件开发 -- ARM指令集_第3页
嵌入式系统软件开发 -- ARM指令集_第4页
嵌入式系统软件开发 -- ARM指令集_第5页
已阅读5页,还剩124页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ARM指令集 目录 ARM指令集概述指令寻址方式数据处理指令程序状态访问指令跳转指令单数据访存指令多数据访存指令其它指令Thumb指令集 目录 ARM指令集概述指令寻址方式数据处理指令程序状态访问指令跳转指令单数据访存指令多数据访存指令其它指令Thumb指令集 ARM指令系统 ARM处理器是基于精简指令集计算机 RISC 原理设计的 指令集和相关译码机制较为简单 ARM具有32位ARM指令集和16位Thumb指令集 ARM指令集效率高 但是代码密度低 而Thumb指令集具有较高的代码密度 却仍然保持ARM的大多数性能上的优势 它是ARM指令集的子集 所有的ARM指令都是可以有条件执行的 而Thumb指令仅有一条指令具备条件执行功能 ARM程序和Thumb程序可相互调用 相互之间的状态切换开销几乎为零 ARM指令系统 ARM指令集与Thumb指令集的关系 Thumb指令集具有灵活 小巧的特点 ARM指令集支持ARM核所有的特性 具有高效 快速的特点 1指令分类 ARM指令集总体分为6类指令数据处理指令 数据传输指令 算术指令 逻辑指令 比较指令 乘法指令 前导零计数 程序状态访问指令 mrs和msr 跳转指令 b和bl 访存指令 单数据访存指令 多数据访存指令 信号量操作指令 异常中断产生指令 swi和bkpt 协处理器指令 2指令特点 所有指令都是32bit 大多数指令都在单周期内完成 所有指令都可以条件执行 load store体系结构 指令集可以通过协处理器扩展 3ARM指令的格式 s Cond 指令的条件码 Opcode 指令操作码 S 操作是否影响cpsr Rn 包含第一个操作数的寄存器编码 Rd 目标寄存器编码 Operand2 第2操作数 3ARM指令的格式 续 4ARM指令的条件执行 所有的ARM指令可包含一个可选的条件码 只有在cpsr中的条件标志位满足指定的条件时 指令才会被执行 不符合条件的代码依然占用一个时钟周期 相当于一个NOP指令 4 1ARM指令的条件域 EQ NE 等于 不等于 equal notequal HS LO 无符号数高于或等于 无符号数小于 higherorsame lower HI LS 无符号数高于 无符号数低于或等于 higher lowerorsame GE LT 有符号数大于或等于 有符号数小于 greaterorequal lessthan GT LE 有符号数大于 有符号数小于或等于 greaterthan lessorequal MI PL 负 非负VS VC 溢出 不溢出 overflowset overflowclear CS CC 进位 无进位 carryset carryclear 4 2ARM指令的条件码 4 2ARM指令的条件码 续 注 AL是默认的 NV不建议使用 目录 ARM指令集概述指令寻址方式数据处理指令程序状态访问指令跳转指令单数据访存指令多数据访存指令其它指令Thumb指令集 ARM处理器寻址方式 寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式 ARM处理器具有9种基本寻址方式 1 寄存器寻址 2 立即数寻址 3 寄存器间接寻址 4 寄存器移位寻址 5 基址寻址 6 多寄存器寻址 7 堆栈寻址 8 块拷贝寻址 9 相对寻址 ARM处理器寻址方式 寻址方式分类 寄存器寻址 操作数的值在寄存器中 指令中的地址码字段指出的是寄存器编号 指令执行时直接取出寄存器值来操作 寄存器寻址指令举例如下 MOVR1 R2 将R2的值存入R1SUBR0 R1 R2 将R1的值减去R2的值 结果保存到R0 MOVR1 R2 0 xAA ARM处理器寻址方式 寻址方式分类 立即数寻址 立即寻址指令中的操作码字段 指令名 后面的地址码部分是操作数本身 也就是说 数据就包含在指令当中 取出指令也就取出了可以立即使用的操作数 这样的数称为立即数 立即寻址指令举例如下 SUBSR0 R0 1 R0减1 结果放入R0 并且影响标志位MOVR0 0 xFF000 将立即数0 xFF000装入R0寄存器第2个源操作数为一个立即数 以 为前缀 十六进制值以在 后加 0 x 或 表示 MOVR0 0 xFF00 0 xFF00 从代码中获得数据 ARM处理器寻址方式 寻址方式分类 寄存器间接寻址 寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号 所需的操作数保存在寄存器指定地址的存储单元中 即寄存器为操作数的地址指针 寄存器间接寻址指令举例如下 LDRR1 R2 将R2指向的存储单元的数据读出 保存在R1中SWPR1 R1 R2 将寄存器R1的值和R2指定的存储 单元的内容交换 LDRR0 R2 0 xAA ARM处理器寻址方式 寻址方式分类 寄存器移位寻址 寄存器移位寻址是ARM指令集特有的寻址方式 当第2个操作数是寄存器移位方式时 第2个寄存器操作数在与第1个操作数结合之前 选择进行移位操作 寄存器移位寻址指令举例如下 MOVR0 R2 LSL 3 R2的值左移3位 结果放入R0 即是R0 R2 8ANDSR1 R1 R2 LSLR3 R2的值左移R3位 然后和R1相 与 操作 结果放入R1 R1 R1 R2 2 R3 MOVR0 R2 LSL 3 0 x08 0 x08 逻辑左移3位 寄存器移位寻址 这种寻址方式是ARM指令集特有的 第2个寄存器操作数在与第1个操作数结合之前 选择进行移位操作 ADDR3 R2 R1 LSL 3 R3 R2 8 R1寄存器R1的内容逻辑左移3位 再与寄存器R2内容相加 结果放入R3中 逻辑移位 LSL 逻辑左移 LogicalShiftLeft 寄存器中字的低端空出的位补0 LSR 逻辑右移 LogicalShiftRight 寄存器中字的高端空出的位补0 ASR 算术右移 ArithmeticShiftRight 算术移位的对象是带符号数 在移位过程中必须保持操作数的符号不变 若源操作数为正数 则字的高端空出的位补0 若源操作数为负数 则字的高端空出的位补1 ROR 循环右移 RotateRight 从字的最低端移出的位填入字的高端空出的位 RRX 扩展为1的循环右移 RotateRightExtendedby1place 操作数右移一位 空位 位 31 用原C标志填充 移位操作过程 移位操作在任何数据处理指令中 第二寄存器操作数可以有应用该操作数的移位操作 逻辑移位LSL 逻辑左移字的最小位空位清零LSR 逻辑右移字的最大位空位清零 移位操作算术移位ASR 正数的ASR LSR循环移位 ROR RRX ARM处理器寻址方式 寻址方式分类 基址寻址 变址寻址 基址寻址就是将基址寄存器的内容与指令中给出的偏移量相加 形成操作数的有效地址 基址寻址用于访问基址附近的存储单元 常用于查表 数组操作 功能部件寄存器访问等 基址寻址指令举例如下 LDRR2 R3 0 x0C 读取R3 0 x0C地址上的存储单元 的内容 放入R2STRR1 R0 4 先R0 R0 4 然后把R1的值寄存 到保存到R0指定的存储单元 LDRR2 R3 0 x0C 0 xAA 将R3 0 x0C作为地址装载数据 变址寻址 变址寻址用于访问基址附近的存储单元 包括 基址加偏移基址加索引寻址 寄存器间接寻址是偏移量为0的基址加偏移寻址 基址加偏移寻址中的基址寄存器包含地址 需加 或减 最大4KB 的偏移来计算访问的地址 LDRR0 R1 4 R0 R1 4 这是前索引寻址方式 带自动索引的前索引寻址 LDRR0 R1 4 R0 R1 4 R1 R1 4 符号表明指令在完成数据传送后应该更新基址寄存器 后索引寻址 基址不带偏移作为传送的地址 传送后自动索引 LDRR0 R1 4 R0 R1 R1 R1 4基址加索引寻址有时指令指定一个基址寄存器 再指定另一个寄存器 索引 其值作为偏移加到基址上形成存储器地址 例如指令 LDRR0 R1 R2 R0 R1 R2 ARM处理器寻址方式 寻址方式分类 多寄存器寻址 多寄存器寻址一次可传送几个寄存器值 允许一条指令传送16个寄存器的任何子集或所有寄存器 多寄存器寻址指令举例如下 LDMIAR1 R2 R7 R12 将R1指向的单元中的数据读出到 R2 R7 R12中 R1自动加1 STMIAR0 R2 R7 R12 将寄存器R2 R7 R12的值保 存到R0指向的存储单元中 R0自动加1 0 x40000010 块拷贝寻址 ARM支持两种不同角度的块寻址机制 两者都映射到相同的基本指令 多寄存器传送指令 多寄存器传送指令可以用于把一块数据从存储器的某一位置拷贝到另一位置 基于数据是存储在基址寄存器的地址之上还是之下 地址是在存储第1个值之前还是之后增加还是减少 下图说明了4种不同情况的多字节传送指令传送前后的内存变化 以及使用自动寻址时如何修改基址寄存器 指令执行前的基寄存器是R9 指令执行后的基寄存器是R9 STMIAR9 R0 R1 R5 STMIBR9 R0 R1 R5 STMDAR9 R0 R1 R5 STMDBR9 R0 R1 R5 ARM处理器寻址方式 寻址方式分类 堆栈寻址 堆栈是一个按特定顺序进行存取的存储区 操作顺序为 后进先出 堆栈寻址是隐含的 它使用一个专门的寄存器 堆栈指针 指向一块存储区域 堆栈 指针所指向的存储单元即是堆栈的栈顶 存储器堆栈可分为两种 向上生长 向高地址方向生长 称为递增堆栈 ascendingstack 向下生长 向低地址方向生长 称为递减堆栈 descendingstack ARM处理器寻址方式 寻址方式分类 堆栈寻址 0 x12345678 0 x12345678 ARM处理器寻址方式 寻址方式分类 堆栈寻址 堆栈指针指向最后压入的堆栈的有效数据项 称为满堆栈 fullstack 堆栈指针指向下一个待压入数据的空位置 称为空堆栈 emptystack 0 x12345678 ARM对堆栈的使用一般用多寄存器传送指令 是一种有效的保存处理器状态和多字节传送的有效方式 ARM硬件中的堆栈分为以下四种类型 满向上生长型 FA 堆栈按高地址方向生长 当前堆栈指针指向最高有效值 指令如LDMFA STMFA等 空向上生长型 EA 堆栈按高地址方向生长 当前堆栈指针指向第一个空值 指令如LDMEA STMEA等 满向下生长型 FD 堆栈按低地址方向生长 当前堆栈指针指向最低有效值 指令如LDMFD STMFD等 空向下生长型 ED 堆栈按低地址方向生长 当前堆栈指针指向第一个空值 指令如LDMED STMED等 若R3 R9保存的是有用的值 就应该把它们压进堆栈进行保存 即STMFDR13 R3 R9 存储寄存器到堆栈 LDMFDR13 R3 R9 从堆栈恢复其中第一条和最后一条指令的 FD 表明是满递减堆栈寻址方式 堆栈和块拷贝角度的多寄存器加载和存储指令映射 ARM处理器寻址方式 寻址方式分类 相对寻址 相对寻址是基址寻址的一种变通 由程序计数器PC提供基准地址 指令中的地址码字段作为偏移量 两者相加后得到的地址即为操作数的有效地址 相对寻址指令举例如下 BLSUBR1 调用到SUBR1子程序BEQLOOP 条件跳转到LOOP标号处 LOOPMOVR6 1 SUBR1 目录 ARM指令集概述指令寻址方式数据处理指令程序状态访问指令跳转指令单数据访存指令多数据访存指令其它指令Thumb指令集 ARM数据处理指令 数据传送指令 mov和mvn算术指令 add adc sub sbc rsb和rsc逻辑指令 and orr eor和bic比较指令 cmp cmn tst和teq ARM数据处理指令 指令编码 指令执行的条件码 I用于区别立即数 I为1 和寄存器移位 I为0 opcode数据处理指令操作码 第二操作数 Rd目标寄存器 Rn第一操作数寄存器 S设置条件码 与指令中的S位对应 1数据处理指令的特点 所有的操作数要么来自寄存器 要么来自立即数 不会来自内存 如果有结果 则结果一定是为32位宽 并且放在一个寄存器中 不会写入内存 有一个例外 长乘法指令产生64位结果 每一个操作数寄存器和结果寄存器都在指令中独立指出 即 ARM指令采用3地址模式 Rd Rn Rm 2四种寻址方式和s后缀 addr0 r1 r2 2 1四种寻址方式的硬件支持 2 2立即数方式 ARM指令中的立即数 由一个8bit的常数循环右移偶数位得到 立即数 0 255 循环右移2N位例子 合法立即数 0 x3fc 0 x0 0 xf0000000 0 xf0000001非法立即数 0 x1fe 0 xffff 0 x1010 0 xf0000010 2 2立即数方式 续 同一个立即数可能有多个表示方法 如 0 x3f0 0 x3f循环右移28位0 x3f0 0 xfc循环右移30位对立即数的编码规则 如果立即数在0 0 xff之间 移位数为0 否则 就取决于编译器了 指令 movr0 0 x3f0 在ADS1 2中被编译为0 xe3a00ffc 在arm elf gcc 2 95 3中被编译为0 xe3a00e3f 2 2立即数方式 续 对于有互补操作的指令 编译器可以做智能的转换 比如 mvnr1 0 xffffff00 movr1 0 xffaddr1 r1 0 xffffff00 subr1 r1 0 x100adcr1 r1 0 xffffff00 sbcr1 r1 0 xffandr1 r1 0 xffffff00 bicr1 r1 0 xff这样 一些原本非法的立即数也可以正常编译通过 如果一个立即数 经过上述转换后是合法的 那么它也可以用在数据操作指令中 2 3寄存器移位寻址 ASR算术右移 LSL逻辑左移 LSR逻辑右移 ROR循环右移 RRX扩展的循环右移 2 3寄存器移位寻址 续 如果移位的位数由立即数 5bit 取值范围0 31 给出 就叫作immediatespecifiedshift 如果由Rs的低5位决定 就叫做registerspecifiedshift Registerspecifiedshift的两点问题 不能使用pc 如果将pc寄存器用在Rn Rd Rm和Rs的位置上时 会产生不可预知的结果 额外代价 overhead 需要更多的周期才能完成指令 因为ARM没有能力一次读取3个寄存器 Immediatespecifiedshift没有上述问题 2 3寄存器移位寻址 续 在registerspecifiedshift寻址方式下使用pc寄存器 编译器提示如下警告 在ADS1 2种编译产生如下警告之一 WarningA1477W ThisregistercombinationresultsinUNPREDICTABLEbehaviorWarning A1320E Undefinedeffect usingPCasRnorRminregisterspecifiedshift Warning A1319E Undefinedeffect usingPCasRs 但是在arm elf gcc 2 95 3中没有报告错误 2 4后缀s 数据处理指令可以选择s后缀 以影响状态标志 但是比较指令 cmp cmn tst和teq 不需要后缀s 它们总会直接影响cpsr中的状态标志 在数据操作指令中 除了比较指令以外 其它的指令如果带有s后缀 同时又以pc为目标寄存器进行操作 则操作的同时从spsr恢复cpsr 比如 movspc 0 xff cpsr spsr pc 0 xff addspc r1 0 xffffff00 cpsr spsr pc r1 0 xffffff00 andspc r1 r2 cpsr spsr pc r1 如果在user或者system模式下使用带有s后缀的数据操作指令 同时以pc为目标寄存器 那么会产生不可预料的结果 因为user和system模式下没有spsr 3数据传送指令 语法 s s s LSL s LSL伪代码ifConditionPassed cond thenRd 第2操作数ifs 1andRd pcthencpsr spsrelseifs 1thensetNZCVflagsincpsr ARM数据处理指令 数据传送 MOV指令将8位立即数或寄存器传送到目标寄存器 Rd 可用于移位运算等操作 指令格式如下 MOV cond S Rd operand2MOV指令举例如下 MOVR1 0 x10 R1 0 x10MOVR0 R1 R0 R1MOVSR3 R1 LSL 2 R3 R1 2 并影响标志位MOVPC LR PC LR 子程序返回 ARM数据处理指令 数据传送 MVN指令将8位立即数或寄存器 operand2 按位取反后传送到目标寄存器 Rd 因为其具有取反功能 所以可以装载范围更广的立即数 指令格式如下 MVN cond S Rd operand2MVN指令举例如下 MVNR1 0 xFF R1 0 xFFFFFF00MVNR1 R2 将R2取反 结果存到R1 3数据传输指令 续 举例movr0 r1 r0 r1 不修改cpsr movr0 0 x0 r0 0 不修改cpsr movsr0 0 x0 r0 0 同时设置cpsr的Z位 movsr0 10 r0 0 xfffffff6 同时设置cpsr的N位 mvnr0 r2 r0 NOTr2 不修改cpsr mvnr0 0 xffffffff r0 0 x0 不修改cpsr mvnsr0 0 xffffffff r0 0 x0 同时设置cpsr的Z位 movr0 r1 LSL 1 r0 r1 r2 3数据传输指令 续 说明mvn意为 取反传输 它把源寄存器的每一位取反 将得到的结果写入结果寄存器 movs和mvns指令对pc寄存器赋值时有特殊含义 表示要求在赋值的同时从spsr中恢复cpsr 对于mov和mvn指令 编译器会进行智能的转化 比如指令 movr1 0 xffffff00 中的立即数是非法的 在编译时 编译器将其转化为 mvnr1 0 xff 这样就不违背立即数的要求 所以对于mov和mvn指令 可以认为 合法的立即数反码也是合法的立即数 4算术指令 语法 s s s LSL s LSL伪代码 以加法add为例 ifConditionPassed cond thenRd Rn 第2操作数ifs 1andRd pcthencpsr spsrelseifs 1thensetNZCVflagsincpsr ARM数据处理指令 算术运算 加法运算 加法运算指令 ADD指令将operand2的值与Rn的值相加 结果保存到Rd寄存器 指令格式如下 ADD cond S Rd Rn operand2应用示例 ADDSR1 R1 1 R1 R1 1 并影响标志位ADDR1 R1 R2 R1 R1 R2 ARM数据处理指令 算术运算 减法运算 减法运算指令 SUB指令用寄存器Rn减去operand2 结果保存到Rd中 指令格式如下 SUB cond S Rd Rn operand2应用示例 SUBSR0 R0 1 R0 R0 1 并影响标志位SUBSR2 R1 R2 R2 R1 R2 并影响标志位 ARM数据处理指令 算术运算 逆向减法运算 逆向减法运算指令 RSB指令将operand2的值减去Rn 结果保存到Rd中 指令格式如下 RSB cond S Rd Rn operand2应用示例 RSBR3 R1 0 xFF00 R3 0 xFF00 R1RSBSR1 R2 R2 LSL 2 R1 R2 2 R2 R2 3 ARM数据处理指令 算术运算 带进位加法运算 带进位加法指令 ADC将operand2的值与Rn的值相加 再加上CPSR中的C条件标志位 结果保存到Rd寄存器 指令格式如下 ADC cond S Rd Rn operand2应用示例 使用ADC实现64位加法 结果存于R1 R0中 ADDSR0 R0 R2 R0等于低32位相加 并影响标志位ADCR1 R1 R3 R1等于高32位相加 并加上低位进位 ARM数据处理指令 算术运算 带进位减法运算 带进位减法指令 SBC用寄存器Rn减去operand2 再减去CPSR中的C条件标志位的非 即若C标志清零 则结果减去1 结果保存到Rd中 指令格式如下 SBC cond S Rd Rn operand2应用示例 使用SBC实现64位减法 结果存于R1 R0中 SUBSR0 R0 R2 低32位相减 并影响标志位SBCR1 R1 R3 高32位相减 并减去低位借位 ARM数据处理指令 算术运算 带进位逆向减法运算 带进位逆向减法指令 RSC指令用寄存器operand2减去Rn 再减去CPSR中的C条件标志位 结果保存到Rd中 指令格式如下 RSC cond S Rd Rn operand2应用示例 使用RSC指令实现求64位数值的负数 RSBSR2 R0 0 R2 0 R0 R0 影响状态位RSCR3 R1 0 R3 R1减C状态位 4算术指令 续 举例addr0 r1 r2 r0 r1 r2 adcr0 r1 r2 r0 r1 r2 carry subr0 r1 r2 r0 r1 r2 sbcr0 r1 r2 r0 r1 r2 carry 1 rsbr0 r1 r2 r0 r2 r1 rscr0 r1 r2 r0 r2 r1 carry 1 addr0 r1 r1 LSL 31 r0 r1 r1 31 addr0 r1 r1 LSLr2 r0 r1 r1 r2 说明adds和adcs在进位时将cpsr的C标志置1 否则置0 subs和sbcs在产生借位时将cpsr的C标志置0 否则置1 5逻辑指令 语法 s s s LSL s LSL伪代码 以and为例 IfConditionPassed cond thenRd RnAND第2操作数ifs 1andRd pcthencpsr spsrelseifs 1thensetNZCVflagsincpsr ARM数据处理指令 逻辑运算 逻辑与操作指令 逻辑与操作指令 AND指令将operand2的值与寄存器Rn的值按位作逻辑 与 操作 结果保存到Rd中 指令格式如下 AND cond S Rd Rn operand2应用示例 ANDSR0 R0 0 x01 R0 R0R2 R1 R3 ARM数据处理指令 逻辑运算 逻辑或操作指令 逻辑或操作指令 ORR指令将operand2的值与寄存器Rn的值按位作逻辑 或 操作 结果保存到Rd中 指令格式如下 ORR cond S Rd Rn operand2应用示例 ORRR0 R0 0 x0F 将R0的低4位置1MOVR1 R2 LSR 24 使用ORR指令将R2的高8位ORRR3 R1 R3 LSL 8 数据移入到R3低8位中 ARM数据处理指令 逻辑运算 逻辑异或操作指令 逻辑异或操作指令 EOR指令将operand2的值与寄存器Rn的值按位作逻辑 异或 操作 结果保存到Rd中 指令格式如下 EOR cond S Rd Rn operand2应用示例 EORR1 R1 0 x0F 将R1的低4位取反EORR2 R1 R0 R2 R1 R0EORSR0 R5 0 x01 将R5和0 x01进行逻辑异或 结果保存到R0 并影响标志位 ARM数据处理指令 逻辑运算 位清除指令 位清除指令 BIC指令将寄存器Rn的值与operand2的值的反码按位作逻辑 与 操作 结果保存到Rd中 指令格式如下 BIC cond S Rd Rn operand2应用示例 BICR1 R1 0 x0F 将R1的低4位清零 其它位不变BICR1 R2 R3 将R3的取反和R2相逻辑 与 结果保存到R1中 5逻辑指令 续 举例andr0 r1 r2 r0 r1ANDr2 andr1 r1 0 xffffff00 r1 r1AND0 xffffff00 orrr0 r1 r2 r0 r1ORr2 eorr0 r1 r2 r0 r1XORr2 bicr0 r1 r2 r0 r1ANDNOTr2 bicr1 r1 0 x0f 清空r1的低4位 andr0 r1 r1 LSL 31 r0 r1AND r1 r2 6比较指令 语法 LSL LSL伪代码 以cmp为例 IfConditionPassed cond thenalu out Rn 第2操作数setNZCVflagsincpsr ARM数据处理指令 比较指令 比较指令 比较指令 CMP指令将寄存器Rn的值减去operand2的值 根据操作的结果更新CPSR中的相应条件标志位 以便后面的指令根据相应的条件标志来判断是否执行 指令格式如下 CMP cond Rn operand2应用示例 CMPR1 10 R1与10比较 设置相关标志位CMPR1 R2 R1与R2比较 设置相关标志位注意 CMP指令与SUBS指令的区别在于CMP指令不保存运算结果 在进行两个数据的大小判断时 常用CMP指令及相应的条件码来操作 ARM数据处理指令 比较指令 负数比较指令 负数比较指令 CMN指令使用寄存器Rn的值加上operand2的值 根据操作的结果更新CPSR中的相应条件标志位 以便后面的指令根据相应的条件标志来判断是否执行 指令格式如下 CMN cond Rn operand2应用示例 CMNR0 1 R0 1 判断R0是否为1的补码 如果是 则设置Z标志位注意 CMN指令与ADDS指令的区别在于CMN指令不保存运算结果 CMN指令可用于负数比较 比如CMNR0 1指令则表示R0与 1比较 若R0为 1 即1的补码 则Z置位 否则Z复位 ARM数据处理指令 比较指令 位测试指令 位测试指令 TST指令将寄存器Rn的值与operand2的值按位作逻辑 与 操作 根据操作的结果更新CPSR中的相应条件标志位 以便后面的指令根据相应的条件标志来判断是否执行 指令格式如下 TST cond Rn operand2应用示例 TSTR0 0 x01 判断R0的最低位是否为0TSTR1 0 x0F 判断R1的低4位是否为0注意 TST指令与ANDS指令的区别在于TST指令不保存运算结果 TST指令通常与EQ NE条件码配合使用 当所有测试位均为0时 EQ有效 而只要有一个测试位不为0 则NE有效 ARM数据处理指令 比较指令 相等测试指令 相等测试指令 TEQ指令将寄存器Rn的值与operand2的值按位作逻辑 异或 操作 根据操作的结果更新CPSR中的相应条件标志位 以便后面的指令根据相应的条件标志来判断是否执行 指令格式如下 TEQ cond Rn operand2应用示例 TEQR0 R1 比较R0与R1是否相等 不影响V位和C位 注意 TEQ指令与EORS指令的区别在于TEQ指令不保存运算结果 使用TEQ进行相等测试时 常与EQ NE条件码配合使用 当两个数据相等时 EQ有效 否则NE有效 6比较指令 续 举例cmpr1 r2 根据r1 r2的结果设置cpsr 结果不写回 cmnr1 r2 根据r1 r2的结果设置cpsr 结果不写回 tstr1 r2 根据r1ANDr2的结果设置cpsr 结果不写回 teqr1 r2 根据r1XORr2的结果设置cpsr 结果不写回 cmpr2 5 根据r2 5的结果设置cpsr 结果不写回 cmpr1 r2 LSL 5 根据r1 r2 5 设置cpsr cmpr1 r2 LSLr3 根据r1 r2 r3 设置cpsr 说明如果不考虑结果的写回 cmp cmn tst和teq分别等价于subs adds ands和eors 目录 ARM指令集概述指令寻址方式数据处理指令程序状态访问指令跳转指令单数据访存指令多数据访存指令其它指令Thumb指令集 程序状态访问指令 当需要修改cpsr spsr的内容时 首先要读取它的值到一个通用寄存器 然后修改某些位 最后将数据写回到状态寄存器 cpsr spsr不是通用寄存器 不能使用mov指令来读写 在ARM处理器中 只有mrs指令可以读取cpsr spsr 只有msr可以写cpsr spsr 程序状态寄存器 条件标识位N 结果为负Z 结果为零C 进位V 溢出Q标识位指示stickyoverflow的发生J标识位J 1 处理器处于Jazelle状态 中断使能位I 1 禁止IRQ F 1 禁止FIQ T标识位只在xT系列内核中有效T 0 处理器处于ARM状态T 1 处理器处于Thumb状态模式位指示当前处理器模式 27 31 NZCVQ 28 6 7 IFTmode 16 23 8 15 5 4 0 24 f s x c Undefined J 1读指令mrs 语法mrs cpsr spsr伪代码ifConditionPassed cond thenifR 1thenRd spsrelseRd cpsr 1读指令mrs 续 举例mrsr0 cpsr 读取cpsr到r0 mrsr3 spsr 读取spsr到r3 说明user和system模式没有spsr 因此这些模式下不能读取spsr 2写指令msr的二进制格式 2 1写指令msr的语法 msr msr 表示合法的立即数 8bit循环右移偶数位代表cpsr或spsr指定传送的区域 可进一步细分 只能小写 c控制域字节 psr 7 0 x扩展域字节 psr 15 8 s状态域字节 psr 23 16 f标志域字节 psr 31 24 2 2写指令msr的伪代码 ifConditionPassed cond thenifopcode 25 1operand 8立即数Rotate Right rot 2 else opcode 25 0 operand RmifR 0theniffield mask 0 1andInAPrivilegeMode thencpsr 7 0 operand 7 0 iffield mask 1 1andInAPrivilegeMode thencpsr 15 8 operand 15 8 iffield mask 2 1andInAPrivilegeMode thencpsr 23 16 operand 23 16 iffield mask 3 1thencpsr 31 24 operand 31 24 else R 1 iffield mask 0 1andCurrentModeHasSPSR thenspsr 7 0 operand 7 0 iffield mask 1 1andCurrentModeHasSPSR thenspsr 15 8 operand 15 8 iffield mask 2 1andCurrentModeHasSPSR thenspsr 23 16 operand 23 16 iffield mask 3 1andCurrentModeHasSPSR thenspsr 31 24 operand 31 24 2 3msr举例和说明 举例msrcpsr c 0 xd3 切换到SVC模式 msrcpsr cxsf r3 cpsr r3 说明user和system模式没有spsr 因此这些模式下不能对spsr操作 由于权限问题 在user模式下对cpsr 23 0 修改无效 如果使用立即数 要使用合法的立即数 程序不能通过 msr修改cpsr的T位 来完成ARM Thumb态的切换 必须使用bx指令 因为bx属于分支指令 它会打断流水线 实现处理器状态切换 如果要修改读出的值 仅修改必要的位 其它位保持不变 这样保持了最大兼容性 mrsr14 CPSR gettheprocessorstatusbicr14 r14 CPSR Mode Maskorrr14 r14 CPSR Mode SVC OR CPSR Int Mask msrcpsr cf r14 SVC32modewithinterruptsdisabled 目录 ARM指令集概述指令寻址方式数据处理指令程序状态访问指令跳转指令单数据访存指令多数据访存指令其它指令Thumb指令集 ARM数据处理指令 跳转 分支 指令 分支指令 在ARM中有两种方式可以实现程序的跳转 一种是使用分支指令直接跳转 另一种则是直接向PC寄存器赋值实现跳转 分支指令有以下三种 分支指令B 带链接的分支指令BL 带状态切换的分支指令BX ARM分支指令 指令编码 分支指令B BL指令编码格式 分支指令B BL指令编码格式 指令执行的条件码 L区别B指令 L为0 和BL指令 L为1 24位有符号立即数 偏移量 ARM数据处理指令 分支指令 B指令 分支指令 B指令 该指令跳转范围限制在当前指令的 32M字节地址内 ARM指令为字对齐 最低2位地址固定为0 指令格式如下 B cond Label应用示例 BWAITA 跳转到WAITA标号处B0 x1234 跳转到绝对地址0 x1234处 跳转指令 续 当转移指令执行时 处理器将指令中的offset 24bit 左移2bit 变成26bit 表示 32M的范围 pc从新的地址执行 流水线重新填充 如果是 bl 指令 将返回地址写入lr寄存器 子程序返回时只需要用lr恢复pc就可以 movpc lr b 指令不影响lr寄存器 目录 ARM指令集概述指令寻址方式数据处理指令程序状态访问指令跳转指令单数据访存指令多数据访存指令其它指令Thumb指令集 存储器访问指令 ARM处理器是典型的RISC处理器 对存储器的访问只能使用加载和存储指令实现 ARMV4其后处理器是哈佛存储结构 程序空间 RAM空间及I O映射空间统一编址 除对RAM操作以外 对外围IO 程序数据的访问均要通过加载 存储指令进行 存储器访问指令分为单寄存器操作指令和多寄存器操作指令 ARM存储器访问指令 单寄存器访问 ARM存储器访问指令 单寄存器访问 LDR STR指令用于对内存变量的访问 内存缓冲区数据的访问 查表 外围部件的控制操作等 若使用LDR指令加载数据到PC寄存器 则实现程序跳转功能 这样也就实现了程序跳转 所有单寄存器加载 存储指令可分为 字和无符号字节加载存储指令 和 半字和有符号字节加载存储指令 ARM存储器访问指令 单寄存器访问 LDR和STR 字和无符号字节加载 存储指令编码 指令执行的条件码 I为0时 偏移量为12位立即数 为1时 偏移量为寄存器移位 P表示前 后变址 U表示加 减 B为1表示字节访问 为0表示字访问 W表示回写 为指令的寻址方式 Rd为源 目标寄存器 Rn为基址寄存器 L用于区别加载 L为1 或存储 L为0 ARM存储器访问指令 单寄存器访问 LDR STR指令寻址非常灵活 它由两部分组成 其中一部分为一个基址寄存器 可以为任一个通用寄存器 另一部分为一个地址偏移量 地址偏移量有以下3种格式 立即数 立即数可以是一个无符号的数值 这个数据可以加到基址寄存器 也可以从基址寄存器中减去这个数值 如 LDRR1 R0 0 x12 寄存器 寄存器中的数值可以加到基址寄存器 也可以从基址寄存器中减去这个数值 如 LDRR1 R0 R2 寄存器及移位常数 寄存器移位后的值可以加到基址寄存器 也可以从基址寄存器中减去这个数值 如 LDRR1 R0 R2 LSL 2 ARM存储器访问指令 单寄存器访问 从寻址方式的地址计算方法分 加载 存储指令有以下4种格式 零偏移 如 LDRRd Rn 前索引偏移 如 LDRRd Rn 0 x04 程序相对偏移 如 LDRRd label后索引偏移 如 LDRRd Rn 0 x04注意 大多数情况下 必须保证字数据操作的地址是32位对齐的 简单的基址寻址 基址寄存器数据访问strr0 r1 ldrr2 r1 前索引偏移 strr0 r1 12 mem32 r1 12 r0r1 r1 r1 r1 12 后索引偏移 strr0 r1 12mem32 r1 r0 r1 r1 12 ARM存储器访问指令 单寄存器访问 LDR和STR指令应用示例 1 加载 存储字和无符号字节指令LDRR2 R5 将R5指向地址的字数据存入R2STRR1 R0 0 x04 将R1的数据存储到R0 0 x04地址LDRBR3 R2 1 将R2指向地址的字节数据存入R3 R2 R2 1STRBR6 R7 将R6低字节数据存入R7指向地址2 加载 存储半字和有符号字节指令LDRSBR1 R0 R3 将R0 R3地址上的字节数据存入R1 高24位用符号扩展LDRHR6 R2 2 将R2指向地址的半字数据存入R6 高16位用0扩展 读出后 R2 R2 2STRHR1 R0 2 将R1的半字数据保存到R0 2地址 只修改低2字节数据 R0 R0 2 目录 ARM指令集概述指令寻址方式数据处理指令程序状态访问指令跳转指令单数据访存指令多数据访存指令其它指令Thumb指令集 目录 ARM指令集概述指令寻址方式数据处理指令程序状态访问指令跳转指令单数据访存指令多数据访存指令其它指令Thumb指令集 ARM存储器访问指令 多寄存器存取 多寄存器加载 存储指令可以实现在一组寄存器和一块连续的内存单元之间传输数据 LDM为加载多个寄存器 STM为存储多个寄存器 允许一条指令传送16个寄存器的任何子集或所有寄存器 它们主要用于现场保护 数据复制 常数传递等 ARM存储器访问指令 多寄存器存取 LDM和STM 多寄存器加载 存储指令编码 指令执行的条件码 S对应于指令中的 符号 P表示前 后变址 U表示加 减 W表示回写 寄存器列表 Rn为基址寄存器 L用于区别加载 L为1 或存储 L为0 ARM存储器访问指令 多寄存器存取 多寄存器加载 存储指令的8种模式如下表所示 右边四种为堆栈操作 左边四种为数据传送操作 进行数据复制时 先设置好源数据指针和目标指针 然后使用块拷贝寻址指令LDMIA STMIA LDMIB STMIB LDMDA STMDA LDMDB STMDB进行读取和存储 进行堆栈操作操作时 要先设置堆栈指针 SP 然后使用堆栈寻址指令STMFD LDMFD STMED LDMED STMFA LDMFA和STMEA LDMEA实现堆栈操作 ARM存储器访问指令 多寄存器存取 数据块传送指令操作过程如右图所示 其中R1为指令执行前的基址寄存器 R1 则为指令执行后的基址寄存器 ARM存储器访问指令 多寄存器存取 使用数据块传送指令进行堆栈操作STMDAR0 R5 R6 LDMIBR0 R5 R6 使用堆栈指令进行堆栈操作STMEDR0 R5 R6 LDMEDR0 R5 R6 两段代码的执行结果是一样的 但是使用堆栈指令的压栈和出栈操作编程很简单 只要前后一致即可 而使用数据块指令进行压栈和出栈操作则需要考虑空与满 加与减对应的问题 ARM处理器寻址方式 每行指令都具有相同的多寄存器操作 相同颜色必须成对出现 从而实现多寄存器传送 其它指令 信号量操作指令 用于进程间的同步互斥 提供对信号量的原子操作 异常中断产生指令 用于系统调用和调试 1信号量操作指令 语法swp swpb 例子swpr1 r2 r3 将内存单元 r3 中的字读取到r1 同时将r2中的数据写入内存单元 r3 中 swpr1 r1 r2 将r1寄存器内容和内存单元 r2 的内容互换 说明swpb读取8bit数据到寄存器后会对高24位清零 写到内存的8bit数来自寄存器低8位 1信号量操作指令 续 ARM指令集 软中断指令 SWI指令用于产生软中断 从而实现在从用户模式变换到管理模式 并且将CPSR保存到管理模式的SPSR中 然后程序跳转到SWI异常入口 在其它模式下也可使用SWI指令 处理器同样地切换到管理模式 该指令主要用于用户程序调用操作系统的系统服务 操作系统在SWI异常处理程序中进行相应的系统服务 SWI cond immed 24 SWI指令格式 SWI指令编码 指令执行的条件码 指令传递的参数 24位立即数 ARM指令集 软中断指令 根据SWI指令传递的参数SWI异常处理程序可以作出相应的处理 SWI指令传递参数有以下两种方法 指令中的24位立即数指定了用户请求的服务类型 参数通过通用寄存器传递 M

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论