免费预览已结束,剩余92页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第四章ARM体系结构及汇编程序设计基础 三 ARM指令系统1 复习2 ARM寻址方式3 ARM指令格式和常见指令使用方法 ARM微处理器的寄存器结构 ARM处理器共有37个寄存器 被分为若干个组 BANK 这些寄器包括 31个通用寄存器 包括程序计数器 PC指针 均为32位的寄存器 6个状态寄存器 用以标识CPU的工作状态及程序的运行状态 均为32位 目前只使用了其中的一部分 处理器运行模式ARM微处理器支持7种运行模式 分别为 usr 用户模式 ARM处理器正常程序执行模式 fiq 快速中断模式 用于高速数据传输或通道处理irq 外部中断模式 用于通用的中断处理svc 管理模式 操作系统使用的保护模式abt 数据访问终止模式 当数据或指令预取终止时进入该模式 可用于虚拟存储及存储保护 sys 系统模式 运行具有特权的操作系统任务 und 未定义指令中止模式 当未定义的指令执行时进入该模式 可用于支持硬件协处理器的软件仿真 注 大多数的应用程序运行在用户模式下 当处理器运行在用户模式下时 某些被保护的系统资源是不能被访问的 特权模式 异常模式 用户与系统模式 处理器工作状态ARM处理器有32位ARM和16位Thumb两种工作状态 在32位ARM状态下执行字对齐的ARM指令在16位Thumb状态下执行半字对齐的Thumb指令在Thumb状态下 程序计数器PC ProgramCounter 使用位 1 选择另一个半字 注意 两个状态之间的切换并不影响处理器模式或寄存器内容 使用BX指令将ARM内核的操作状态在ARM状态和Thumb状态之间进行切换 程序如下所示 从Arm状态切换到Thumb状态LDRR0 Lable 1BXR0 从Thumb状态切换到ARM状态LDRR0 LableBXR0 地址最低位为1 表示切换到Thumb状态 地址最低位为0 表示切换到ARM状态 跳转地址标号 ARM处理器的寄存器组织ARM处理器的37个寄存器被安排成部分重叠的组 不能在任何模式都可以使用 寄存器的使用与处理器状态和工作模式有关 如图2 3 1所示 每种处理器模式使用不同的寄存器组 其中15个通用寄存器 R0 R14 1或2个状态寄存器和程序计数器是通用的 31个通用32位寄存器 包括程序计数器PC 未分组寄器R0 R7 分组寄存器R8 R14 程序计数器PC R15 6个状态寄存器 可访问的寄存器取决于处理器的模式 一般的通用寄存器 寄存器R13 R14分别有6个分组的物理寄存器 一个用于用户和系统模式 其余5个分别用于5种异常模式 R14寄存器与子程序调用 MOVPC LR R14 地址A 1 程序A执行过程中调用程序B 操作流程 2 程序跳转至标号Lable 执行程序B 同时硬件将 BLLable 指令的下一条指令所在地址存入R14 3 程序B执行最后 将R14寄存器的内容放入PC 返回程序A 读R15的限制 正常操作时 从R15读取的值是处理器正在取指的地址 即当前正在执行指令的地址加上8个字节 两条ARM指令的长度 程序状态寄存器 CPSR ARM内核包含1个CPSR和5个供异常处理程序使用的SPSR CPSR反映了当前处理器的状态 其包含 4个条件代码标志 负 N 零 Z 进位 C 和溢出 V 2个中断禁止位 分别控制一种类型的中断 5个对当前处理器模式进行编码的位 1个用于指示当前执行指令 ARM还是Thumb 的位 每个异常模式还带有一个程序状态保存寄存器 SPSR 它用于保存在异常事件发生之前的CPSR CPSR和SPSR通过特殊指令进行访问 注意 如果通过程序修改CPSR寄存器中的模式位进入异常模式 那么硬件将不会把CPSR保存至SPSR中 条件代码标志 大多数 数值处理指令 可以选择是否影响条件代码标志位 通常如果指令带S后缀 则该指令的执行会影响条件代码标志 但有一些指令的执行总是会影响条件代码标志 比如CMP TST TEQ等 N Z C和V位都是条件代码标志 通过算术操作 逻辑操作 MSR或者LDM指令可以对这些位进行设置 所有ARM指令都可按条件来执行 而Thumb指令中只有分支指令可按条件执行 举例 ADDR0 R0 R1ADDSR0 R0 R1ADDEQSR0 R0 R1 控制位 CPSR的最低8位为控制位 当发生异常时 这些位被硬件改变 当处理器处于一个特权模式时 可用软件操作这些位 它们分别是 中断禁止位 T位 模式位 中断禁止位包括I和F位 当I位置位时 IRQ中断被禁止 当F位置位时 FIQ中断被禁止 T位反映了正在操作的状态 当T位置位时 处理器正在Thumb状态下运行 当T位清零时 处理器正在ARM状态下运行 模式位包括M4 M3 M2 M1和M0 这些位决定处理器的操作模式 程序状态寄存器 条件位 N 1 结果为负 0 结果为正或0Z 1 结果为0 0 结果不为0C 1 进位 0 借位V 1 结果溢出 0结果没溢出Q位 仅ARM5TE J架构支持指示增强型DSP指令是否溢出J位仅ARM5TE J架构支持J 1 处理器处于Jazelle状态 中断禁止位 I 1 禁止IRQ F 1 禁止FIQ TBit仅ARMxT架构支持T 0 处理器处于ARM状态T 1 处理器处于Thumb状态Mode位 处理器模式位 0b10000User0b10001FIQ0b10010IRQ0b10011Supervisor0b10111Abort0b11011Undefined0b11111System ARM微处理器的异常处理 在一个正常的程序流程执行过程中 由内部或外部源产生的一个事件使正常的程序产生暂时的停止时 称之为异常 在处理异常之前 当前处理器的状态必须保留 当异常处理完成之后 恢复保留的当前处理器状态 继续执行当前程序 多个异常同时发生时 处理器将会按固定的优先级进行处理 2 4 1ARM体系结构的异常类型ARM体系结构支持7种类型的异常 异常类型 异常处理模式和优先级如表2 4 1所示 异常出现后 强制从异常类型对应的固定存储器地址开始执行程序 这些固定的地址称为异常向量 ExceptionVectors ARM体系结构的异常类型和异常处理模式 异常类型的含义 1 复位当处理器的复位电平有效时 产生复位异常 ARM处理器立刻停止执行当前指令 复位后 ARM处理器在禁止中断的管理模式下 程序跳转到复位异常处理程序处执行 从地址0 x00000000或0 xFFFF0000开始执行指令 2 未定义指令异常当ARM处理器或协处理器遇到不能处理的指令时 产生未定义指令异常 当ARM处理器执行协处理器指令时 它必须等待任一外部协处理器应答后 才能真正执行这条指令 若协处理器没有响应 就会出现未定义指令异常 若试图执行未定义的指令 也会出现未定义指令异常 未定义指令异常可用于在没有物理协处理器 硬件 的系统上 对协处理器进行软件仿真 或在软件仿真时进行指令扩展 3 软件中断异常 SoftWareInterrupt SWI 软件中断异常由执行SWI指令产生 可使用该异常机制实现系统功能调用 用于用户模式下的程序调用特权操作指令 以请求特定的管理 操作系统 函数 4 指令预取中止若处理器预取指令的地址不存在 或该地址不允许当前指令访问 存储器会向处理器发出存储器中止 Abort 信号 但当预取的指令被执行时 才会产生指令预取中止异常 5 数据中止 数据访问存储器中止 若处理器数据访问指令的地址不存在 或该地址不允许当前指令访问时 产生数据中止异常 存储器系统发出存储器中止信号 响应数据访问 加载或存储 激活中止 标记数据为无效 在后面的任何指令或异常改变CPU状态之前 数据中止异常发生 6 外部中断请求 IRQ 异常当处理器的外部中断请求引脚有效 且CPSR中的I位为0时 产生IRQ异常 系统的外设可通过该异常请求中断服务 IRQ异常的优先级比FIQ异常的低 当进入FIQ处理时 会屏蔽掉IRQ异常 7 快速中断请求 FIQ 异常当处理器的快速中断请求引脚有效 且CPSR中的F位为0时 产生FIQ异常 FIQ支持数据传送和通道处理 并有足够的私有寄存器 异常的响应过程当一个异常出现以后 ARM微处理器会执行以下几步操作 将下一条指令的地址存入相应连接寄存器LR 以便程序在处理异常返回时能从正确的位置重新开始执行 若异常是从ARM状态进入 LR寄存器中保存的是下一条指令的地址 当前PC 4或PC 8 与异常的类型有关 若异常是从Thumb状态进入 则在LR寄存器中保存当前PC的偏移量 将CPSR状态传送到相应的SPSR中 根据异常类型 强制设置CPSR的运行模式位 强制PC从相关的异常向量地址取下一条指令执行 跳转到相应的异常处理程序 还可以设置中断禁止位 以禁止中断发生 注 异常总是在ARM状态中进行处理 如果异常发生时 处理器处于Thumb状态 则当异常向量地址加载入PC时 处理器自动切换到ARM状态 异常处理完毕之后 ARM微处理器会执行以下几步操作从异常返回 将连接寄存器LR的值减去相应的偏移量后送到PC中 将SPSR内容送回CPSR中 若在进入异常处理时设置了中断禁止位 要在此清除 可以认为应用程序总是从复位异常处理程序开始执行的 因此复位异常处理程序不需要返回 注 恢复CPSR的动作会将T F和I位自动恢复为异常发生前的值 图示进入异常过程 1 程序在系统模式下运行用户程序 假定当前处理器状态为Thumb状态 允许IRQ中断 2 用户程序运行时发生IRQ中断 硬件完成以下动作 置位I位 禁止IRQ中断 清零T位 进入ARM状态 设置MOD位 切换处理器模式至IRQ模式 将下一条指令的地址存入IRQ模式的LR寄存器 将CPSR寄存器内容存入IRQ模式的SPSR寄存器 将跳转地址存入PC 实现跳转 BackAddr JumpAddr 表示对该位不关心 在异常处理结束后 异常处理程序完成以下动作 图示退出异常过程 将SPSR寄存器的值复制回CPSR寄存器 将LR寄存的值减去一个常量后复制到PC寄存器 跳转到被中断的用户程序 BackAddr JumpAddr return BackAddr 4 表示对该位不关心 当多个异常同时发生时 一个固定的优先级系统决定它们被处理的顺序 异常优先级 应用程序中的异常处理在应用程序的设计中 异常处理采用的方式是在异常向量表中的特定位置放置一条跳转指令 跳转到异常处理程序 当ARM处理器发生异常时 程序计数器PC会被强制设置为对应的异常向量 从而跳转到异常处理程序 当异常处理完成以后 返回到主程序继续执行 ARM微处理器指令系统寻址方式 基本寻址方式寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式 ARM处理器具有9种基本寻址方式 1 寄存器寻址 2 立即寻址 3 寄存器移位寻址 4 寄存器间接寻址 5 基址寻址 6 多寄存器寻址 7 堆栈寻址 8 块拷贝寻址 9 相对寻址 操作数的值在寄存器中 指令中的地址码字段指出的是寄存器编号 指令执行时直接取出寄存器值来操作 寄存器寻址指令举例如下 MOVR1 R2 将R2的值存入R1SUBR0 R1 R2 将R1的值减去R2的值 结果保存到R0 1 寄存器寻址 MOVR1 R2 0 xAA 立即寻址指令中的操作码字段后面的地址码部分即是操作数本身 也就是说 数据就包含在指令当中 取出指令也就取出了可以立即使用的操作数 这样的数称为立即数 立即寻址指令举例如下 SUBSR0 R0 1 R0减1 结果放入R0 并且影响标志位MOVR0 0 xFF000 将立即数0 xFF000装入R0寄存器 2 立即寻址 MOVR0 0 xFF00 0 xFF00 从代码中获得数据 寄存器移位寻址是ARM指令集特有的寻址方式 当第2个操作数是寄存器移位方式时 第2个寄存器操作数在与第1个操作数结合之前 选择进行移位操作 寄存器移位寻址指令举例如下 MOVR0 R2 LSL 3 R2的值左移3位 结果放入R0 即是R0 R2 8ANDSR1 R1 R2 LSLR3 R2的值左移R3位 然后和R1相 与 操作 结果放入R1 并影响标志位 3 寄存器移位寻址 MOVR0 R2 LSL 3 0 x08 0 x08 逻辑左移3位 寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号 所需的操作数保存在寄存器指定地址的存储单元中 即寄存器为操作数的地址指针 寄存器间接寻址指令举例如下 LDRR1 R2 将R2指向的存储单元的数据读出 保存在R1中SWPR1 R1 R2 将寄存器R1的值和R2指定的存储 单元的内容交换 4 寄存器间接寻址 LDRR0 R2 0 xAA 基址寻址就是将基址寄存器的内容与指令中给出的偏移量相加 形成操作数的有效地址 基址寻址用于访问基址附近的存储单元 常用于查表 数组操作 功能部件寄存器访问等 基址寻址指令举例如下 LDRR2 R3 0 x0C 读取R3 0 x0C地址上的存储单元的内容 放入R2STRR1 R0 4 先R0 R0 4 然后把R1的值寄存 到保存到R0指定的存储单元 5 基址寻址 LDRR2 R3 0 x0C 0 xAA 将R3 0 x0C作为地址装载数据 多寄存器寻址一次可传送几个寄存器值 允许一条指令传送16个寄存器的任何子集或所有寄存器 多寄存器寻址指令举例如下 LDMIAR1 R2 R7 R12 将R1指向的单元中的数据读出到R2 R7 R12中 R1自动加1 STMIAR0 R2 R7 R12 将寄存器R2 R7 R12的值保 存到R0指向的存储单元中 R0自动加1 注 使用多寄存器寻址指令时 寄存器子集的顺序是由小到大排列 连续的寄存器用 连接 否则用 分隔书写 6 多寄存器寻址 LDMIAR1 R2 R4 R6 0 x40000000 堆栈是一个按特定顺序进行存取的存储区 操作顺序为 后进先出 和 先进后出 堆栈寻址是隐含的 它使用一个专门的寄存器 堆栈指针 指向一块存储区域 堆栈 指针所指向的存储单元即是堆栈的栈顶 存储器堆栈可分为两种 向上生长 向高地址方向生长 称为递增堆栈向下生长 向低地址方向生长 称为递减堆栈 7 堆栈寻址 0 x12345678 0 x12345678 堆栈指针指向最后压入的堆栈的有效数据项 称为满堆栈 堆栈指针指向下一个待压入数据的空位置 称为空堆栈 0 x12345678 所以可以组合出四种类型的堆栈方式 满递增 堆栈向上增长 堆栈指针指向内含有效数据项的最高地址 指令如LDMFA STMFA等 空递增 堆栈向上增长 堆栈指针指向堆栈上的第一个空位置 指令如LDMEA STMEA等 满递减 堆栈向下增长 堆栈指针指向内含有效数据项的最低地址 指令如LDMFD STMFD等 空递减 堆栈向下增长 堆栈指针向堆栈下的第一个空位置 指令如LDMED STMED等 快拷贝寻址指令用于将一块数据从存储器的某一位置拷贝到另一位置 如 STMIAR0 R1 R7 将R1 R7的数据保存到存储器中 存储指针在保存第一个值之后增加 增长方向为向上增长 STMIBR0 R1 R7 将R1 R7的数据保存到存储器中 存储指针在保存第一个值之前增加 增长方向为向上增长 8 块拷贝寻址 相对寻址是基址寻址的一种变通 由程序计数器PC提供基准地址 指令中的地址码字段作为偏移量 两者相加后得到的地址即为操作数的有效地址 相对寻址指令举例如下 BLSUBR1 调用到SUBR1子程序BEQLOOP 条件跳转到LOOP标号处 LOOPMOVR6 1 SUBR1 9 相对寻址 简单的ARM程序 文件名 TEST1 S 功能 实现两个寄存器相加 说明 使用ARMulate软件仿真调试AREAExample1 CODE READONLY 声明代码段Example1ENTRY 标识程序入口 相当于main CODE32 声明32位ARM指令STARTMOVR0 0 设置参数MOVR1 10LOOPBLADD SUB 调用子程序ADD SUBBLOOP 跳转到LOOPADD SUBADDSR0 R0 R1 R0 R0 R1MOVPC LR 子程序返回END 文件结束 必须与entry配合使用 使用 进行注释 标号顶格写 实际代码段 声明文件结束 ARM指令集1 指令格式 1 基本格式 ARM指令的基本格式如下 S 其中号内的项是必须的 号内的项是可选的 各项的说明如下 opcode 指令助记符 cond 执行条件 S 是否影响CPSR寄存器的值 Rd 目标寄存器 Rn 第1个操作数的寄存器 operand2 第2个操作数 ARM指令的基本格式如下 ARM指令集 第2个操作数 S 灵活的使用第2个操作数 operand2 能够提高代码效率 它有如下的形式 Rm 寄存器方式 Rm shift 寄存器移位方式 Rm 寄存器方式在寄存器方式下 操作数即为寄存器的数值 例如 SUBR1 R1 R2MOVPC R0 Rm shift 寄存器移位方式将寄存器的移位结果作为操作数 但Rm值保持不变 移位方法如下 Rm shift 寄存器移位方式例如 ADDR1 R1 R1 LSL 3 R1 R1 R1 8 9R1SUBR1 R1 R2 LSRR3 R1 R1 R2 2R3 2 条件码几乎所有的ARM指令都包含一个可选择的条件码 即 使用指令条件码 可实现高效的逻辑操作 提高代码效率 当处理器工作在ARM状态时 几乎所有的指令均根据CPSR中条件码的状态和指令的条件域有条件的执行 当指令的执行条件满足时 指令被执行 否则指令被忽略 每一条ARM指令包含4位的条件码 位于指令的最高4位 31 28 条件码共有16种 每种条件码可用两个字符表示 这两个字符可以添加在指令助记符的后面和指令同时使用 例如 跳转指令B可以加上后缀EQ变为BEQ表示 相等则跳转 即当CPSR中的Z标志置位时发生跳转 ARM条件码如表2 5 1所示 表2 5 1ARM条件码 条件码应用举例 比较两个值大小 并进行相应加1处理C代码为 If a b a Elseb 对应的ARM指令为 其中R0为a R1为b CMPR0 R1ADDHIR0 R0 1ADDLSR1 R1 1 若两个条件均成立 则将这两个数相加C代码为 If a 10 对应ARM指令为 CMPR0 10CMPNER1 20ADDNER0 R0 R1 2 ARM存储器访问指令ARM微处理器支持加载 存储指令用于在寄存器和存储器之间传送数据 加载指令用于将存储器中的数据传送到寄存器 存储指令则完成相反的操作 ARM的加载 存储指令是可以实现字 半字 无符 有符字节操作 批量加载 存储指令可实现一条指令加载 存储多个寄存器的内容 SWP指令是一条寄存器和存储器内容交换的指令 可用于信号量操作等 ARM存储访问指令表如表2 5 2所示 表2 5 2ARM存储访问指令表 LDR和STR单寄存器加载 存储指令LDR指令用于从内存中读取单一字或字节数据存入寄存器中 STR指令用于将寄存器中的单一字或字节数据保存到内存 指令格式如下 LDR cond T Rd 将指定地址上的字数据读入RdSTR cond T Rd 将Rd中的字数据存入指定地址LDR cond B T Rd 将指定地址上的字节数据读入RdSTR cond B T Rd 将Rd中的字节数据存入指定地址 其中 T为可选后缀 若指令有T 那么即使处理器是在特权模式下 存储系统也将访问看成是在用户模式下进行的 T在用户模式下无效 不能与前索引偏移一起使用T LDR STR指令寻址非常灵活 它由两部分组成 其中一部分为一个基址寄存器 可以为任一个通用寄存器 另一部分为一个地址偏移量 地址偏移量有以下3种格式 立即数 立即数可以是一个无符号的数值 这个数据可以加到基址寄存器 也可以从基址寄存器中减去这个数值 如 LDRR1 R0 0 x12 寄存器 寄存器中的数值可以加到基址寄存器 也可以从基址寄存器中减去这个数值 如 LDRR1 R0 R2 寄存器及移位常数 寄存器移位后的值可以加到基址寄存器 也可以从基址寄存器中减去这个数值 如 LDRR1 R0 R2 LSL 2 从寻址方式的地址计算方法分 加载 存储指令有以下4种格式 零偏移 Rn的值作为传送数据的地址 即地址偏移量为0 如 LDRRd Rn 前索引偏移 在数据传送前 将偏移量加到Rn中 其结果作为传送数据的存储地址 若使用 号 则结果写回Rn中 如 LDRRd Rn 0 x04 程序相对偏移 汇编器由PC计算偏移量 并将PC作为Rn生成前索引指令 如 LDRRd labe1后索引偏移 Rn的值用作传送数据的存储地址 在数据传送后 将偏移量与Rn相加 结果写回Rn中 如 LDRRd Rn 0 x04 LDM和STM多寄存器加载 存储指令格式如下 LDM cond Rn reglist STM cond Rn reglist Rn 基址寄存器 装有传送数据的初始地址 模式 控制地址的增长方式 一共有8种模式 表示在操作结束后 将最后的地址写回Rn中 reglist 表示寄存器列表 可以包含多个寄存器 它们使用 隔开 如 R1 R2 R6 R9 寄存器由小到大排列 加入该后缀后 进行数据传送且寄存器列表不包含PC时 加载 存储的寄存器是用户模式下的 而不是当前模式的寄存器 若在LDM指令且寄存器列表中包含有PC时使用 那么除了正常的多寄存器传送外 还将CPSR也拷贝到SPSR中 这可用于异常处理返回 注意 该后缀不允许在用户模式或系统模式下使用 多寄存器加载 存储指令的8种模式如下表所示 右边四种为堆栈操作 左边四种为数据传送操作 SWP指令用于将一个内存单元 该单元地址放在寄存器Rn中 的内容读取到一个寄存器Rd中 同时将另一个寄存器Rm的内容写入到该内存单元中 使用SWP可实现信号量操作 指令格式如下 SWP cond B Rd Rm Rn 其中 B为可选后缀 若有B 则交换字节 否则交换32位字 Rd用于保存从存储器中读入的数据 Rm的数据用于存储到存储器中 若Rm与Rn相同 则为寄存器与存储器内容进行交换 Rn为要进行数据交换的存储器地址 Rn不能与Rd和Rm相同 指令示例 LDRR0 R1 将存储器地址为R1的字数据读入寄存器R0 LDRR0 R1 R2 将存储器地址为R1 R2的字数据读入寄存器R0 LDRR0 R1 8 将存储器地址为R1 8的字数据读入寄存器R0 LDRR0 R1 R2 将存储器地址为R1 R2的字数据读入寄存器R0 并将新地址R1 R2写入R1 LDRR0 R1 8 将存储器地址为R1 8的字数据读入寄存器R0 并将新地址R1 8写入R1 LDRR0 R1 R2 将存储器地址为R1的字数据读入寄存器R0 并将新地址R1 R2写入R1 LDRR0 R1 R2 LSL 2 将存储器地址为R1 R2 4的字数据读入寄存器R0 并将新地址R1 R2 4写入R1 LDRBR0 R1 8 将存储器地址为R1 8的字节数据读入寄存器R0 并将R0的高24位清零 LDRHR0 R1 R2 将存储器地址为R1 R2的半字数据读入寄存器R0 并将R0的高16位清零 STRR0 R1 8 将R0中的字数据写入以R1为地址的存储器中 并将新地址R1 8写入R1 STRBR0 R1 8 将寄存器R0中的字节数据写入以R1 8为地址的存储器中 STRHR0 R1 将寄存器R0中的半字数据写入以R1为地址的存储器中STMFDR13 R0 R4 R12 LR 将寄存器列表中的寄存器 R0 R4到R12 LR 存入堆栈 LDMFDR13 R0 R4 R12 PC 将堆栈内容恢复到寄存器 R0 R4到R12 LR SWPR0 R1 R2 将R2所指向的存储器中的字数据传送到R0 同时将R1中的字数据传送到R2所指向的存储单元 3 ARM数据处理指令数据处理指令可分为数据传送指令 算术逻辑运算指令和比较指令等 数据传送指令用于在寄存器和存储器之间进行数据的双向传输 所有ARM数据处理指令均可选择使用S后缀 以影响状态标志 比较指令不需要后缀S 它们会直接影响状态标志 算术逻辑运算指令完成常用的算术与逻辑的运算 该类指令不但将运算结果保存在目的寄存器中 同时更新CPSR中的相应条件标志位 比较指令不保存运算结果 只更新CPSR中相应的条件标志位 数据处理指令如表2 5 3所示 注意 数据处理指令只能对寄存器的内容进行操作 不能对内存中的数据进行处理 表2 5 3数据处理指令表 位清除指令 BIC指令将寄存器Rn的值与operand2的值的反码按位作逻辑 与 操作 结果保存到Rd中 BIC cond S Rd Rn operand2比较指令 CMP指令将寄存器Rn的值减去operand2的值 根据操作的结果更新CPSR中的相应条件标志位 以便后面的指令根据相应的条件标志来判断是否执行 CMP cond Rn operand2位测试指令 TST指令将寄存器Rn的值与operand2的值按位作逻辑 与 操作 根据操作的结果更新CPSR中的相应条件标志位 以便后面的指令根据相应的条件标志来判断是否执行 TST cond Rn operand2 指令示例 MOVR1 R0 将寄存器R0的值传送到寄存器R1MOVPC R14 将寄存器R14的值传送到PC 常用于子程序返回MOVR1 R0 LSL 3 将寄存器R0的值左移3位后传送到R1MVNR0 0 xff 将立即数ff取反传送到寄存器R0中 完成后R0 oxffffff00CMPR1 R0 将寄存器R1的值与寄存器R0的值相减 并根据结果设置CPSR的标志位CMNR1 R0 将寄存器R1的值与寄存器R0的值相加 并根据结果设置CPSR的标志位TSTR1 0 xffe 将寄存器R1的值与立即数0 xffe按位与 并根据结果设置CPSR的标志位TEQR1 R2 将寄存器R1的值与寄存器R2的值按位异或 并根据结果设置CPSR的标志位 ADDR0 R1 R2 R0 R1 R2ADCSR1 R5 R9 加第二个字 带进位SUBR0 R1 256 R0 R1 256RSBR0 R1 R2 R0 R2 R1RSCR0 R1 R2 R0 R2 R1 CANDR0 R0 3 该指令保持R0的0 1位 其余位清零 ORRR0 R0 3 该指令设置R0的0 1位 其余位保持不变 EORR0 R0 3 该指令反转R0的0 1位 其余位保持不变BICR1 R1 0 x0F 将R1的低4位清零 其它位不变 4 ARM跳转指令在ARM中有两种方式可以实现程序的跳转 一种是使用分支指令直接跳转 另一种则是直接向PC寄存器赋值实现跳转 分支指令有以下三种 分支指令B 带链接的分支指令BL 带状态切换的分支指令BX 分支指令 B指令 该指令跳转范围限制在当前指令的 32M字节地址内 一旦遇到一个B指令 ARM处理器直接跳转到给定的地址 指令格式如下 B cond Label应用示例 BWAITA 跳转到WAITA标号处B0 x1234 跳转到绝对地址0 x1234处 带链接的分支指令 BL指令适用于子程序调用 使用该指令后 下一条指令的地址被拷贝到R14 即LR 链接寄存器中 然后跳转到指定地址运行程序 跳转范围限制在当前指令的 32M字节地址内 指令格式如下 BL cond Label Addr1 Addr2 1 当程序执行到BL跳转指令时 硬件将下一条指令的地址Addr2装入LR寄存器 并把跳转地址装入程序计数器 PC 2 程序跳转到目标地址Label继续执行 当子程序执行结束后 将LR寄存器内容存入PC 返回调用函数继续执行 带状态切换的分支指令 BX指令 该指令可以根据跳转地址 Rm 的最低位来切换处理器状态 其跳转范围限制在当前指令的 32M字节地址内 指令格式如下 BX cond Rm 6 ARM杂项指令ARM指令集中有三条指令作为杂项指令 实际上这三条指令非常重要 它们如下所示 SWI指令用于产生软中断 从而实现由用户模式变换到管理模式 并且将CPSR保存到管理模式的SPSR中 然后程序跳转到SWI异常入口 在其它模式下也可使用SWI指令 处理器同样地切换到管理模式 该指令主要用于用户程序调用操作系统的系统服务 操作系统在SWI异常处理程序中进行相应的系统服务 SWI cond immed 24 SWI指令格式 SWI指令编码 指令执行的条件码 指令传递的参数 24位立即数 在ARM处理器中 只有MRS指令可以对状态寄存器CPSR和SPSR进行读操作 通过读CPSR可以了解当前处理器的工作状态 读SPSR寄存器可以了解到进入异常前的处理器状态 MRS cond Rd psr MRS指令格式 应用示例 MRSR1 CPSR 将CPSR状态寄存器读取 保存到R1中MRSR2 SPSR 将SPSR状态寄存器读取 保存到R2中 在ARM处理器中 只有MSR指令可以对状态寄存器CPSR和SPSR进行写操作 与MRS配合使用 可以实现对CPSR或SPSR寄存器的读 修改 写操作 可以切换处理器模式 或者允许 禁止IRQ FIQ中断等 MSR cond psr fields immed 8r MSR指令格式1 MSR cond psr fields Rm MSR指令格式2 指令执行的条件码 CPSR或SPSR 指定传送的区域 可以为以下字母 必须小写 的一个或者组合 c控制域屏蔽字节 psr 7 0 x扩展域屏蔽字节 psr 15 8 s状态域屏蔽字节 psr 23 16 f标志域屏蔽字节 psr 31 24 保存要传送到状态寄存器指定域数据的源寄存器 要传送到状态寄存器指定域的立即数 1 2 3 4 在ARM处理器中 只有MSR指令可以对状态寄存器CPSR和SPSR进行写操作 与MRS配合使用 可以实现对CPSR或SPSR寄存器的读 修改
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年黑龙江省铁力市《行测》考试笔试题库附答案详解【培优B卷】
- 2026年浙江省东阳市《行测》考试考前冲刺试卷及1套参考答案详解
- 2025年河南省沁阳市《行测》考试考前冲刺试卷及参考答案详解(黄金题型)
- 2025年黑龙江省肇东市《行测》考试考前冲刺密卷附答案详解【B卷】
- 2026年河南省新郑市《行测》考试备考题库(真题汇编)附答案详解
- 2026年四川省简阳市《行测》考试模拟试卷及完整答案详解【各地真题】
- 2026年河北省任丘市《行测》考试考前冲刺密卷审定版附答案详解
- 2026年河南省义马市《行测》考试笔试题库含答案详解【突破训练】
- 2025年湖南省韶山市《行测》考试模拟试卷附答案详解(黄金题型)
- 2025年吉林省和龙市《行测》考试考前冲刺试卷附答案详解(预热题)
- 2026广东广州市海珠区科学技术协会招聘雇员1人考试备考题库及答案详解
- 2025年邢台市水务发展集团有限公司招聘真题
- 设备购买意向性合同
- 2026年科技局事业单位招聘考试试题及答案
- 林带养护施工方案(3篇)
- 2026年《中华人民共和国保守秘密法》培训课件
- 中国宗法制度论
- 血透室消毒隔离制度
- 常见手术麻醉配合要点
- 钢结构施工工艺流程与现场施工管理
- 包装组管理制度
评论
0/150
提交评论