3.ARM寻址方式与指令系统.ppt_第1页
3.ARM寻址方式与指令系统.ppt_第2页
3.ARM寻址方式与指令系统.ppt_第3页
3.ARM寻址方式与指令系统.ppt_第4页
3.ARM寻址方式与指令系统.ppt_第5页
已阅读5页,还剩178页未读 继续免费阅读

下载本文档

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

文档简介

第三章ARM寻址方式与指令系统 本章提要 ARM指令的编码格式 3 1 1指令特点 所有指令都是32bit 大多数指令都在单周期内完成 大多数指令都可以条件执行 load store体系结构 指令集可以通过协处理器扩展 3 1 2ARM指令的格式 Cond 指令的条件码 Opcode 指令操作码 S 操作是否影响cpsr Rn 包含第一个操作数的寄存器编码 Rd 目标寄存器编码 Operand2 第2操作数 1 典型的ARM指令编码格式如下 2 典型的ARM指令助记符格式如下 opcode cond s Rd Rn operand2 opcode 指令的助记符 cond 指令执行的条件 3 1 3条件域 cond 大多数的ARM指令可包含一个可选的条件码 只有在cpsr中的条件标志位满足指定的条件时 指令才会被执行 不符合条件的代码依然占用一个时钟周期 相当于一个NOP指令 在ARMV5之前的版本 所有的指令都是条件执行 V5版开始引入了一些指令必须无条件执行 几乎所的ARM数据处理指令均可以根据执行结果来选择是否需要更新条件标志 若要更新条件标志 则指令中必须含有后缀 S ARM指令的条件域 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 ARM指令的条件码 本章提要 ARM指令的编码格式 3 2寻址方式 寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式 ARM指令寻址方式可分为四大类 数据处理指令寻址Load Store指令的寻址批量Load Store指令的寻址协处理指令寻址 3 2 1数据处理指令寻址方式 一 数据处理指令第2操作数的构成方式1 立即数方式 立即寻址 每个立即数由一个8位的常数进行32位循环右移偶数位得到 其中循环右移的位数由一个4位二进制的两倍表示 即 immed 8进行32位循环右移 2 rotate 4 位 合法的立即数 MOVR0 0 x0000F200MOVR1 0 x00110000MOVR2 0 x00012800非法的立即数 0 x10100 x001020 xFF1008位立即数不需要经过移位间接表示 而可以直接表示 2 寄存器方式 寄存器寻址 操作数即为寄存器的数值如 MOVR3 R2ADDR0 R1 R2 3 寄存器移位方式 寄存器移位寻址 寄存器移位寻址是ARM指令集特有的寻址方式 当第2个操作数是寄存器移位方式时 第2个寄存器操作数在与第1个操作数结合之前 选择进行移位操作 操作数为寄存器的数值做相应的移位而得到 在ARM指令中移位操作包括逻辑左移 逻辑右移 算术左移 算术右移 循环右移和带扩展的循环右移 移位方式 硬件支持 二 具体寻址类型 1 第二操作数为立即数汇编语法格式 如 MOVR0 0 xFC0 2 第二操作数为寄存器汇编语法格式 如 MOVR0 R1ADDR0 R1 R2 3 第二操作数为寄存器移位方式 且移位的位数为一个5位的立即数汇编语法格式 如 MOVR0 R0 LSL nMOVR0 R2 LSL 3 4 第二操作数为寄存器移位方式 且移位数值放在寄存器中汇编语法格式 如 ANDSR1 R1 R2 LSLR3 5 第二操作数为寄存器进行RRX移位得到汇编语法格式 RRX 如果移位的位数由立即数给出 立即数只能取5bit位 取值范围0 31 如果移位的位数由寄存器Rs给出 移位的位数由Rs的低5位决定 注意 指令中的任意一个寄存器 Rn Rd Rm和Rs 都不能使用pc 使用了pc将会产生不可预知的结果 额外代价 overhead 需更多的周期才能完成指令 因为ARM没有能力一次读取3个寄存器 移位的位数 3 2 2Load Store指令寻址 Load Store指令是对内存进行存储 加载数据操作的指令 根据访问的数据格式的不同 将这类指令的寻址分为字 无符号字节的Load Store指令寻址和半字 有符号字节Load Store指令寻址两大类 一 地址计算方法 1 寄存器间接寻址操作数保存在寄存器所指定地址的存储单元中 即寄存器为操作数的地址指针 寄存器间接寻址指令举例如下 STRR0 R1 将寄存器R0的值传送到R1指定的存储单元LDRR2 R1 将R1指向的存储单元的数据读出保存在R2中SWPR1 R1 R2 将寄存器R1的值和R2指定的存储单元的内容交换 STRR0 R1 LDRR2 R1 2 基址加变址寻址将基址寄存器的内容与指令给出的位移量相加 形成操作数的有效地址 有两种形式 前变址法 基地址寄存器中的值和地址偏移量先作加减运算 生成的操作数作为内存访问的地址 后变址法 将基地址寄存器中的值直接作为内存访问的地址进行操作 内存访问完毕后基地址寄存器中的值和地址偏移量作加减运算 并更新基地址寄存器 二 字 无符号字节寻址 汇编指令语法格式为 LDR B T STR B T 1 Addressing mode中的偏移量为立即数前变址不回写形式 前变址回写形式 后变址回写形式 前变址寻址 前索引 STRR0 R1 12 Mem32 R1 12 r0 R1 R1 12 表示指令在完成数据传送后应该更新基址寄存器 加了 可称为带自动索引的前变址寻址 这种索引不消耗额外时间 归纳 先运算后访问 后变址寻址 后索引 STRR0 Rl 12mem32 R1 R0 R1 R1 12 没有 只使用立即数作为基址寄存器的修改量 归纳 先传送 后改变地址 偏移量为立即数的指令编码类型WP汇编语法格式01 10 11 2 Addressing mode中的偏移量为寄存器的值前变址不回写形式 前变址回写形式 后变址回写形式 偏移量为寄存器的指令编码类型对应关系WP汇编语法格式01 10 11 3 Addressing mode中的偏移量通过寄存器移位得到前变址不回写形式 shift amount 前变址回写形式 shift amount 后变址回写形式 shift amount 偏移量为移位寄存器的指令编码类型对应关系WP汇编语法格式01 shift amount 10 shift amount11 shift amount 三 半字 有符号字节寻址 这类指令可用来加载有符号字节 加载有符号半字 加载 存储无符号半字 Load Store指令对半字 有符号字节操作指令编码格式如下 加载有符号字节到寄存器 LDR SB 加载有符号半字到寄存器 LDR SH 加载无符号半字到寄存器 LDR H 存储无符号半字到内存 STR H 1 Addressing mode中的偏移量为立即数前变址不回写形式 前变址回写形式 后变址回写形式 偏移量为立即数的指令编码类型WP汇编语法格式01 10 11 2 Addressing mode中的偏移量为寄存器的值前变址不回写形式 前变址回写形式 后变址回写形式 偏移量为寄存器值的指令编码类型对应关系WP汇编语法格式01 10 11 3 2 3批量Load Store指令寻址方式 ARM指令系统提供了批量Load Store指令寻址方式 即通常所说的多寄存器寻址 也就是一次可以传送几个寄存器的值 允许一条指令最多传送16个寄存器 多寄存器寻址 多寄存器寻址方式中 一条指令可实现一组寄存器值的传送 允许一条指令传送16个寄存器的任何子集或所有寄存器 编码格式 批量加载 LDM 批量存储 STM LDMIAR1 R2 R7 R12 将R1指向的单元中的数据读出 到R2 R7 R12中 R1自动加4 STMIAR0 R2 R7 R12 将寄存器R2 R7 R12的值保 存到R0指向的存储单元中 R0自动加4 register list表示要加载或存储的寄存器列表 bit 15 0 可以表示16个寄存器 如果某位为1 则该位的位置作为寄存器的编号 此寄存器参预加载或存储 S用于恢复CPSR和强制用户位 当程序计数器PC包含在LDM指令的register list中 且S为1时 则当前模式的SPSR被拷贝到CPSR中 使处理器的程序返回和状态的恢复成为一个原子操作 如果register list中不包含程序计数器PC S为1则加载或存储的是用户模式下的寄存器组 注意事项 指令中寄存器和连续内存地址单元的对应关系 编号低的寄存器对应内存低地址单元 编号高的寄存器对应内存高地址单元 内存操作 块拷贝寻址实现把一块数据从存储器的某个位置拷贝到另一个位置 后增IA IncrementAfter 每次数据传送后地址加4 先增IB IncrementBefore 每次数据传送前地址加4 后减DA DecrementAfter 每次数据传送后地址减4 先减DB DecrementBefore 每次数据传送前地址减4 它们与指令编码中P U的对应关如下表所示LDM STM的地址变化方式addr modePUDA00IA01DB10IB11 堆栈操作 栈的分类按栈指针分类栈指针指向最后压入堆栈的有效数据项 称为满堆栈 fullstack 在push前先修改栈指针 栈指针指向下一个数据项放入的空位置 称为空堆栈 emptystack 在push后修改栈指针 按生长方向分类向高地址方向生长 称递增堆栈 Ascendingstack 向低地址方向增长 称递减堆栈 Decendingstack ARM处理器支持的堆栈类型 满递增 FA 栈地址向上增长 栈指针指向内含有效数据项的最高地址 空递增 EA 栈地址向上增长 栈指针指向栈顶的空位置 满递减 FD 栈地址向下增长 栈指针指向内含有效数据项的最低地址 空递减 ED 栈地址向下增长 栈指针指向堆栈下的第一个空位置 栈操作图示 块拷贝与栈操作的对应关系 3 2 4协处理器指令寻址方式 协处理器加载 存储指令的寻址方式协处理器数据处理指令的寻址方式 协处理器加载 存储指令的寻址方式 L addressing mode 其中 opcode为指令操作码 coproc为协处理器名称 addressing mode为指令寻址模式 1 内存地址索引格式前变址不回写形式 4 前变址回写形式 4 后变址回写形式 4 2 内存地址非索引格式这种指令寻址汇编语法格式为 协处理器数据处理指令的寻址方式 协处理器数据处理指令的寻址方式主要通过寄存器寻址 根据寄存器编码来查找相应的寄存器 这部分内容在指令系统中进行详细介绍 本章提要 ARM指令的编码格式 3 3 1指令分类 数据处理指令程序状态访问指令跳转指令访存指令异常中断产生指令协处理器指令 3 3 2数据处理指令 数据传输指令 mov mvn算术指令 add adc sub sbc rsb和rsc逻辑指令 and orr eor和bic比较指令 cmp cmn tst和teq乘法指令 mla mul 1 数据处理指令的特点 所有的操作数来自寄存器或立即数 不会来自内存 运算结果一定是为32位宽 且放在一个寄存器中 不会写入内存 有一个例外 长乘法指令产生64位结果 每一个操作数寄存器和结果寄存器都在指令中独立指出 2 采用的寻址方式和S后缀 立即数寻址寄存器寻址寄存器移位寻址 寻址方式 除数据传送指令外 寻址方式是第2操作数的寻址方式 后缀S 数据处理指令可以选择s后缀 以影响状态标志 但是比较指令 cmp cmn tst和teq 不需要后缀s 它们总会直接影响cpsr中的状态标志 在数据操作指令中 除了比较指令以外 其它的指令如果带有s后缀 同时又以pc为目标寄存器进行操作 则操作的同时从spsr恢复cpsr 如果在user或者system模式下使用带有s后缀的数据操作指令 同时以pc为目标寄存器 那么会产生不可预料的结果 因为user和system模式下没有spsr 3 数据传输指令 指令的助记符格式语法 s s s LSL s LSL MOV数据传送指令MVN数据取反传送指令 伪代码ifconditionPassed cond thenRd 第二操作数ifs 1andRd pcthencpsr spsrelseifs 1thensetNZCVflagsincpsr 举例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 说明movs和mvns指令对pc寄存器赋值时有特殊含义 表示要求在赋值的同时从spsr中恢复cpsr 对于mov和mvn指令 编译器会进行智能的转化 4 算术指令 指令的助记符格式语法 s s s LSL s LSL ADD ADC SUB SBC RSB RSB反向 带借位 减法指令 伪代码 以加法为例 ifconditionPassed cond thenRd Rn 第二操作数ifs 1andRd pcthencpsr spsrelseifs 1thensetNZCVflagsincpsr 举例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 ORR EOR BIC位清除指令 伪代码 以and为例 ifconditionPassed cond thenRd RnAND第二操作数ifs 1andRd pcthencpsr spsrelseifs 1thensetNZCVflagsincpsr 举例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 注意 若指定s 则指令将 根据结果更新N和Z 计算Operand2时更新标志c 不影响标志V 6 比较指令 指令的助记符格式语法 LSL LSL CMP比较指令CMN反值比较指令TST位测试指令TEQ相等测试指令 伪代码 以cmp为例 ifConditionPassed cond thenalu out Rn 第二操作数setNZCVflagsincpsr 举例 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 MLA cond s Rd Rm Rs Rn 乘累加Rd Rm Rs RnMUL cond s Rd Rm Rs 乘法Rd Rm Rs 指令的助记符格式 MLAr0 r1 r2 r3 r0 r1 r2 r3 MULr0 r1 r2 r0 r1 r2 7 乘法指令 32位乘法指令 Operation cond s RdLo RdHi Rm Rs UMLALr1 r2 r3 r4 r2r1 r3 r4 r2r1 UMULLr0 r1 r2 r3 r1 r0 r2 r3 64位乘法指令 3 3 3程序状态访问指令 cpsr spsr不是通用寄存器 不能使用mov指令来读写 在ARM处理器中 只有mrs指令可以读取cpsr spsr 只有msr可以写cpsr spsr 程序不能直接修改cpsr spsr的内容 通常是通过 读取 修改 写回 的操作序列来实现的 1 读指令mrs 指令的助记符格式 语法mrs cpsr spsr伪代码ifConditionPassed cond thenifR 1thenRd spsrelseRd cpsr 举例Mrsr0 cpsr 读取cpsr到r0 Mrsr3 spsr 读取spsr到r3 说明user和system模式没有spsr 因此这些模式下不能读取spsr 2 写指令msr 写指令msr的二进制格式 写指令msr的助记符格式 msr msr 表示合法的立即数 8bit循环右移偶数位 代表cpsr或spsr 指定传送的区域 可进一步细分 只能小写 c控制域字节 psr 7 0 x扩展域字节 psr 15 8 s状态域字节 psr 23 16 f标志域字节 psr 31 24 写指令msr的伪代码 举例 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属于分支指令 它会打断流水线 实现处理器状态切换 如果要修改读出的值 仅修改必要的位 其它位保持不变 这样保持了最大兼容性 3 3 4跳转指令 指令的助记符格式 语法 B lableBL lable说明 寻址范围 32MB 1 跳转指令 当转移指令执行时 处理器将指令中的offset 24bit 左移2bit 变成26bit 表示 32M的范围 pc从新的地址执行 流水线重新填充 如果是 bl 指令 将返回地址写入lr寄存器 子程序返回时只需要用lr恢复pc既可 b 指令不影响lr寄存器 2 状态切换的跳转指令 指令的助记符格式 BX 目标地址寄存器 Rm的位 0 不用来为地址的一部分 若Rm的位 0 为1 则将CPSR中的标志T置1 程序状态从ARM态切换为Thumb态 若Rm的位 0 为0 则Rm的位 1 就不能为1 BLX BLXlable 用法 将下一条指令的地址拷贝到R14中 转移到lable或Rm中的地址 若下面两条中的任何一条成立 则将指令集切换到Thumb 即 Rm的位 0 为1 使用BLXlabel形式 跳转范围限制在当前指令的 32M字节地址内 举例 BLoopBLEnq 8BLbubcBLLTrtxBXR7BXVSR0BLXNER2BLXthumbsub 3 3 5Load Store指令 Load Store指令是内存访问指令 Load用于把内存中数据装载到寄存器中 而Store则用于把寄存器中的数据存入内存 Load Store指令分为3类 单数据访存指令多 批量 数据访存指令寄存器和存储器交换指令 1 单数据 单寄存器 访存指令 功能 LDR指令用于从内存中读取单一数据存入寄存器中 STR指令用于将寄存器中的单一数据保存到内存 类型 字和无符号字节加载 存储指令半字和有符号字节加载 存储指令 字和无符号字节加载 存储指令 助记符 读写字 LDR T STR T 读写无符号字节 LDRB T STRB T T为可选后缀 若有T 无论处理器处于何种模式 都将该指令当作一般用户模式下的内存操作 指令编码格式 地址偏移量 立即数 是个无符号数值 可加 减到基址寄存器中 寄存器 寄存器中的数值可加 减到基址寄存器中 寄存器及一个移位常数 寄存器中的数值可以根据指令中的移位标志及移位常数作一定的移位操作 生成一地址偏移量 地址偏移量可加 减到基址寄存器中 ldr str b ldr str b ldr str b ldr str b ldr str b ldr str b 指令的助记符格式 说明 无论如何 pc都不能作Rm 无叹号的前变址 当pc作为Rn时 内存基地址为当前指令地址加8 后变址或有叹号的前变址 当pc作为Rn时 会产生不可预知的结果 后变址或有叹号的前变址 如果Rn和Rd是同一个寄存器 会出现不可预知的结果 如果immed 5超过31 编译器报错 如果immed 12超过0 xfff 编译会出错 举例 Ldrbr0 r1 0 xfff 把r1 0 xfff地址的字节读入r0 Ldrr0 r1 r2 把r1 r2地址的32比特数读入r0 然后r1 r1 r2 Strr0 r1 r2 LSL 31 把r0 32bit 写到地址r1 r2 31 ldrr0 r1 0 xfff 把r1地址的数读入r0 然后r1 r1 0 xfff ldrr0 r1 r2 把r1地址的数读入r0 然后r1 r1 r2 ldrr0 r1 r2 LSL 31 把r1地址的数读入r0 然后r1 r1 r2 31 说明ldr str读 写一个32bit字到 从一个32bit的寄存器 要求读 写地址字对齐 Ldrb读一个8bit字节到一个32bit的寄存器 不要求地址对齐 寄存器的高24位清零 Strb将寄存器的低8位 写入内存的某个地址 不要求地址对齐 半字和有符号字节加载 存储指令 读写无符号半字 LDRH STRH读有符号半字 LDRSH读有符号字节 LDRSB 助记符 指令编码格式 addr mode指令的寻址方式S1表示有符号访问 为0表示无符号访问 H1表示半字访问 为0表示字节访问 指令助记符格式同第一类指令说明ldrh 读取16bit半字到一个32bit寄存器 要求地址半字对齐 目标寄存器的高16bit清零 strh 将寄存器的低16bit存放到内存中 要求地址半字对齐 ldrsh 将内存中的一个16bit半字读到一个32bit寄存器中 要求地址半字对齐 寄存器高16bit根据符号位扩展 ldrsb 将内存中的一个8bit字节读到一个32bit寄存器中 寄存器高24bit根据符号位扩展 不要求地址对齐 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 举例 2 批量Load Store指令 批量Load Store指令也称为多寄存器传送指令 批量访存指令可以实现一组 1 16 寄存器和一块 4 64字节 连续内存单元之间的数据传输 LDM加载多个寄存器 STM存储多个寄存器 批量Load Store的指令编码格式 寻址方式 在批量Load Store内存访问指令中 支持堆栈寻址块拷贝寻址 ldm stm 有8种 指令的助记符格式 IA IncrementAfter 事后递增IB IncrementBefore 事先递增DA DecrementAfter 事后递减DB DecrementBefore 事先递减FD FullDecrement 满递减ED EmptyDecrement 空递减FA FullAggrandizement 满递增EA EmptyAggrandizement 空递增 可选后缀 允许在用户模式或系统模式下使用 它有以下两个功能 若op是LDM且寄存器列表包含R15时 那么除了正常的多寄存器传送外 还将SPSR也复制到CPSR中 这用于异常处理返回 仅在异常模式下使用 数据传入或传出的是用户模式下的寄存器 而不是当前模式的寄存器 模拟压栈操作 ARM指令集中没有用于栈的操作指令 但可由批量Load Store指令来实现 模拟出栈操作 更新基地址的load store指令对 批量load store指令的寻址模式起始 结束地址的影响 注 N是操作寄存器的个数 例子 ldmiar0 r5 r8 将内存中 r0 到 r0 12 4个字读取到r5 r8的4个寄存器中 ldmibr0 r5 r8 将内存中 r0 4 到 r0 16 4个字读取到r5 r8的4个寄存器中 ldmdar0 r5 r8 将内存中 r0 12 到 r0 4个字读取到r5 r8的4个寄存器中 ldmdbr0 r5 r8 将内存中 r0 16 到 r0 4 4个字读取到r5 r8的4个寄存器中 说明递增方式和递减方式处理寄存器列表和内存地址对应关系时采用不同的顺序 可以总结为 编号低的寄存器对应低内存地址 pc不能作为stm指令的 否则结果不可预知 表示执行后将更新 不能在usr和system模式下使用 否则结果不可预知 在其它模式下使用时 含义和寄存器列表是否包含pc有关 批量 多数据 访存的程序例子 r12指向源数据起点 r14指向源数据终点 r13指向目标地址 Loop ldmiar12 r0 r11 读48个字节 stmiar13 r0 r11 写48个字节 cmpr12 r14 是否到末尾 bneloop 没到重复循环 3 寄存器和存储器交换 信号量操作 指令 信号量操作指令用于进程间的同步和互斥 提供对信号量的原子操作 指令的助记符格式 swp swpb 寄存器包含将保存到内存中的数据寄存器中包含将要访问的内存地址 功能 SWP指令用于将一个内存单元的内容读取到一个寄存器Rd中 同时将另一个寄存器Rm的内容写入到该内存单元中 使用SWP可实现信号量操作 例子 swpr1 r2 r3 将内存单元 r3 中的字读取到r1 同时将r2中的数据写入内存单元 r3 中 swpr1 r1 r2 将r1寄存器内容与内存单元 r2 的内容互换 swpbr1 r2 r3 将内存单元 r3 的字节数据读取到r1中 r1高24位为0 同时将r2的低8位写入到内存单元 r3 中 说明 swpb读取8bit数据到寄存器后 会对高24位清零 写到内存的8bit数来自寄存器低8位 3 3 6异常中断指令 异常中断产生指令用于系统调用和调试 ARM有两条异常中断产生指令 软中断指令SWI断点中断指令BKPT 1 软中断指令 指令编码格式 cond 1111 31 2827 2423 0 Immed 24 Immed 2424位立即数 系统调用号 说明主要用于用户程序调用操作系统的API 参数传递通常有两种方法 指令中的24bit立即数指定API号 参数通过寄存器传递 忽略指令中的24bit立即数 r0指定API号 其它参数通过其它寄存器传递 swi 指令的语法格式 2 断点中断指令 指令的语法格式BKPTimmed 1616位立即数 被调试软件用来保存额外的断点信息 说明用于产生软件断点中断 主要用于调试 ARMv5以上版本支持 3 3 7协处理器指令 ARM体系结构支持通过增加协处理器来扩展指令集的机制 ARM体系支持16个协处理器 ARM协处理器具有它们自己的专用寄存器组 它们的状态由控制ARM寄存器的指令的镜像指令来控制 三类协处理器指令协处理器的数据操作指令 协处理器的数据传送指令 协处理器的寄存器传送指令 1 协处理器的数据操作 用于控制数据在协处理器寄存器内部的操作 可改变协处理器的状态 指令编码格式 指令助记符格式CDP 说明该指令是ARM处理器用于通知ARM协处理器执行特定操作 该操作中不涉及ARM寄存器和内存单元 协处理器的数据传送指令从存储器读取数据装入协处理器寄存器或将协处理器寄存器的数据存入存储器 ARM产生存储器地址 协处理器控制传送的字数 2 协处理器的数据传送 指令编码格式 指令助记符格式LDC STC L CRd Rn LDC STC L CRd Rn LDC从存储器中读取数据装入协处理器寄存器 STC将协处理器寄存器的数据存储到存储器 L选择数据类型 如存在 选择长数据类型 N 1 是8位带符号数 说明该指令可用于任何可能存在的协处理器 如果无协处理器接收 将产生未定义指令异常中断 可使用软件仿真协处理器 地址计算在ARM中进行 字的传送数目由协处理器控制 在数据传送过程中 ARM将不影响中断请求 最大传送长度限制在16字 3 协处理器的寄存器传送 指令功能该类指令完成ARM和协处理器寄存器之间的数据传送 指令编码格式 指令的语法格式MRC MCR Rd CRn CRm MCR将ARM寄存器中的数据传送到协处理器寄存器中 MRC将协处理器寄存器中的数据传送到ARM的寄存器中 说明若将PC定义为目的寄存器Rd 则由协处理器产生32位整数的最高4位将被存放在CPSR中的N Z C和V中 伪指令 ARM中的伪指令在汇编编译器对源程序进行汇编处理时 被替换成对应的ARM或Thumb指令 序列 伪指令的类型ADR 小范围的地址读取伪指令 ADRL 中等范围的地址读取伪指令 LDR 大范围的地址读取伪指令 NOP 1ADR 小范围的地址读取伪指令 功能将基于PC的地址值或基于寄存器的地址值读取到寄存器中 指令的语法格式ADR cond register exprregister目标寄存器expr基于PC或基于寄存器的地址表达式 取址范围为 非字对准地址 在 255 255字节范围内字对准地址 在 1020 1020字节范围内 用法 在汇编时 ADR被汇编成一条指令 汇编器产生一条ADD或SUB指令来加载地址 若不能用一条指令来实现ADR的功能 则产生错误 汇编失败 2ADRL 中等范围的地址读取伪指令 功能将基于PC的地址值或基于寄存器的地址值读取到寄存器中 指令的语法格式ADRL cond register exprexpr基于PC或基于寄存器的地址表达式 取址范围 非字对准地址 在64KB范围内字对准地址 在256KB范围内 用法ADRL比ADR可读取更大范围地址 在汇编时被汇编成2条指令 即使一条指令也可完成该指令的功能 编译器也将用两条指令来替换 若不能用两条指令来实现ADRL的功能 则产生错误 汇编失败 3LDR 大范围的地址读取伪指令 功能将一个32位常数或一个地址值读取到寄存器中 指令的语法格式LDR cond register expr label expr expr为32位常量 label expr 基于PC的地址表达式或外部表达式 若expr表示的地址值在指令中地址的取值范围内时 汇编器用MOV或MVN指令代替LDR 若expr表示的地址值超过了MOV或MVN指令中地址的取值范围 编译器将该常数放在数据缓冲区中 同时使用一条基于PC的LDR指令读取该常数 用途 当需要读取到寄存器中的数据超过MOV和MVN指令可操作的范围 可以使用LDR伪指令将数据读取到寄存器中 将一个基于PC的地址值或外部的地址值读取到寄存器中 由于地址值是在连接时确定的 该代码与位置有关 4NOP NOP在汇编时将被替换成ARM中的空操作 不影响标志位 本章提要 ARM指令的编码格式 在ARM体系结构中 ARM指令是32位的 具有很高的执行效率 但是对于嵌入式设备而言 其存储空间极其有限 对于每条ARM指令都要占用4个字节 对存储空间的要求较高 为了压缩代码的存储 增加代码存储密度 ARM公司设计了16位的Thumb指令 3 4 1Thumb数据处理指令 Thumb数据处理指令可以分为5类 数据传送指令 算术运算指令 逻辑运算指令 移位操作指令和比较指令 寄存器移位指令 opcodeRd Rs shift immed 5Rd目标寄存器 Rs源操作数寄存器 shift immed 5寄存器移位的数值 取值范围为0 31 Thumb寄存器移位指令操作码编码 低位寄存器算术运算指令 1 加法与减法运算指令 对R0 R7操作 这类指令的汇编语法格式为opcodeRd Rs RmopcodeRd Rs immed 3 Rd目标寄存器 Rs源操作数寄存器 Rm第二操作数寄存器 immed 3第二操作数为立即数 I决定第二操作数是寄存器还是立即数 opcode指令操作码 2 MOV CMP ADD与SUB指令 对R0 R7操作 opcodeRd immed 8 ALU操作指令 这类指令的汇编语法格式为opcodeRd Rs 带高位寄存器操作的Thumb指令 这类指令的汇编语法格式为opcodeRd HsopcodeHd RsopcodeHd Hs 带SP PC的算术运算指令 1 SP PC加法运算指令这类指令的汇编语法格式为ADDRd

温馨提示

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

评论

0/150

提交评论