arm体系架构与原理教学-04arm指令系统及汇编程序设计(1).ppt_第1页
arm体系架构与原理教学-04arm指令系统及汇编程序设计(1).ppt_第2页
arm体系架构与原理教学-04arm指令系统及汇编程序设计(1).ppt_第3页
arm体系架构与原理教学-04arm指令系统及汇编程序设计(1).ppt_第4页
arm体系架构与原理教学-04arm指令系统及汇编程序设计(1).ppt_第5页
已阅读5页,还剩107页未读 继续免费阅读

下载本文档

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

文档简介

嵌入式系统教案 * 2 提纲 1 1 3 3 2 2 4 4 ARM 指令系统 ARM和THUMB混合调用 ATPCS 介绍 THUMB 指令系统 第四章 ARM指令系统及汇编程序设计 3 跳转指令 q 跳转指令用于实现程序流程的跳转,在ARM程序中有两种 方法可以实现程序流程的跳转: v 使用专门的跳转指令。 v 直接向程序计数器PC写入跳转地址值。 q ARM指令集中的跳转指令可以完成从当前指令向前或向后 的32MB的地址空间的跳转,包括以下4条指令: v B跳转指令 v BL带返回的跳转指令 v BLX带返回和状态切换的跳转指令 v BX带状态切换的跳转指令 ARM 指令系统 4 B指令 q B指令的格式为: B条件目标地址 q B指令是最简单的跳转指令。一旦遇到一个 B 指令,ARM 处理器将立即跳转到给定的目标地址,从那里继续执行。 注意存储在跳转指令中的实际值是相对当前PC值的一个 偏移量,而不是一个绝对地址,它的值由汇编器来计算。 它是24位有符号数,左移两位后有符号扩展为 32 位,表 示的有效偏移为 26 位(前后32MB的地址空间)。如: BLabel /*程序无条件跳转到标号Label处执行*/ ARM 指令系统 5 BL指令 q BL指令的格式为: BL条件 目标地址 q BL 是另一个跳转指令,但跳转之前,会在寄存器R14中保 存PC的当前内容,因此,可以通过将R14 的内容重新加载 到PC中,来返回到跳转指令之后的那个指令处执行。该指 令是实现子程序调用的一个基本但常用的手段。以下指令 : BLLabel /*当程序无条件跳转到标号Label处执行时,同时将当前 的PC值保存到R14中 */ ARM 指令系统 6 BLX指令 q BLX指令的格式为: BLX 目标地址 q BLX指令从ARM指令集跳转到指令中所指定的目标地址,并 将处理器的工作状态由ARM状态切换到Thumb状态,该指令 同时将PC的当前内容保存到寄存器R14中。因此,当子程 序使用Thumb指令集,而调用者使用ARM指令集时,可以通 过BLX指令实现子程序的调用和处理器工作状态的切换。 同时,子程序的返回可以通过将寄存器R14值复制到PC中 来完成。 ARM 指令系统 7 BX指令 q BX指令的格式为: BX条件 目标地址 q BX指令跳转到指令中所指定的目标地址,目标地址处的指 令既可以是ARM指令,也可以是Thumb指令。 ARM 指令系统 8 数据处理指令 q 数据处理指令可分为数据传送指令、算术逻辑运算指令和 比较指令等。 q 数据传送指令用于在寄存器和存储器之间进行数据的双向 传输。 q 算术逻辑运算指令完成常用的算术与逻辑的运算,该类指 令不但将运算结果保存在目的寄存器中,同时更新CPSR中 的相应条件标志位。 q 比较指令不保存运算结果,只更新CPSR中相应的条件标志 位。 ARM 指令系统 9 数据处理指令灵活的第二操作数 如:ADDcondS Rd, Rn, Operand2 Operand2可能的形式: #immed_8r Rm,shift ADD r0, r1, #100 ADD r0, r1, r2 ADD r0, r1, r2, ASR #1 ARM 指令系统 R0 = r1 + 100 R0 = r1 + r2 R0 = r1 + (r2算术右移一位) 若指定S,则根据操作结果更新 条件码标志 10 数据处理指令Shift 移位模式 ASRn 算术右移n位(1_, #immed_8r MSR cond _, rm fields:c控制域(PSR7:0) x扩展域(PSR15:8) s状态域(PSR23:16) f标志域(PSR31:24) ARM 指令系统 40 MRS指令 q MRS指令的格式为: MRS条件 通用寄存器,程序状态寄存器(CPSR或SPSR) q MRS指令用于将程序状态寄存器的内容传送到通用寄存器 中。该指令一般用在以下几种情况: 1. 当需要改变程序状态寄存器的内容时,可用MRS将程序 状态寄存器的内容读入通用寄存器,修改后再写回程序状 态寄存器。 2. 当在异常处理或进程切换时,需要保存程序状态寄存器 的值,可先用该指令读出程序状态寄存器的值,然后保存 。 MRSR0,CPSR MRSR0,SPSR ARM 指令系统 41 MSR指令 q MSR指令的格式为: MSR条件程序状态寄存器(CPSR或SPSR)_,操作数 q MSR指令用于将操作数的内容传送到程序状态寄存器的特定域中。其 中,操作数可以为通用寄存器或立即数。用于设置程序状态寄存 器中需要操作的位,32位的程序状态寄存器可分为4个域: 位31:24为条件标志位域,用f表示; 位23:16为状态位域,用s表示; 位15:8为扩展位域,用x表示; 位7:0为控制位域,用c表示; q 该指令通常用于恢复或改变程序状态寄存器的内容,在使用时,一般 要在MSR指令中指明将要操作的域。 MSR CPSR,R0 MSR CPSR_c,R0 ARM 指令系统 42 加载/存储指令及批量数据加载/存储指令 q ARM微处理器支持加载/存储指令用于在寄存器和存储器之 间传送数据,加载指令用于将存储器中的数据传送到寄存 器,存储指令则完成相反的操作。常用的加载存储指令如 下: LDR字数据加载指令 LDRB字节数据加载指令 LDRH半字数据加载指令 STR字数据存储指令 STRB字节数据存储指令 STRH半字数据存储指令 LDM批量数据加载指令 STM批量数据存储指令 ARM 指令系统 43 加载/存储指令(LDR/STR/LDM/STM) LDR/STR:采用寄存器间接寻址和基变址寻址的方式 1. 零偏移; LDR r0, r1 STR r0, r1 2. 程序相对偏移; LDR r0, =0x12345678 3. 后索引偏移; LDR r0, r13, #0x04 LDR r1, r13, #0x04 ARM 指令系统 44 加载/存储指令(LDR/STR/LDM/STM) 4. 前索引偏移; OPcond Rd, Rn, offset ! Offset 就是数据处理指令中的第二操作数; !为一个可选的后缀,即是否修改Rn Rn为R15时不能选择该后缀; LDR r0, r1, #0x04 LDR r0, r1, #0x04! LDR r0, r1, r2, ASR #0x04! ARM 指令系统 45 LDM/STM可以传送R0-R15的任意组合 q OP cond mode Rn!, reglist mode: IA每次传送后地址加1FD 满递减堆栈 IB每次传送前地址加1ED 空递减堆栈 DA每次传送后地址减1FA 满递增堆栈 DB每次传送前地址减1EA 空递增堆栈 ARM 指令系统 46 LDM/STM后缀描述 ! 回写使能标志 是否拷贝SPSR到CPSR LDMIA r0, r1, r2, r3, r4 LDMIA r0!, r1, r2, r3, r4 STMFD r13!, r0, r4-r7, LR;子程序入口 LDMFD r13!, r0, r4-r7, PC;子程序返回 ARM 指令系统 47 LDR指令 q LDR指令的格式为: LDR条件 目的寄存器, q LDR指令用于从存储器中将一个32位的字数据传送到目的寄存器中。 该指令通常用于从存储器中读取32位的字数据到通用寄存器,然后对 数据进行处理。当程序计数器PC作为目的寄存器时,指令从存储器中 读取的字数据被当作目的地址,从而可以实现程序流程的跳转。该指 令在程序设计中比较常用,且寻址方式灵活多样,请读者认真掌握。 q LDR R0,R1 q LDR R0,R1,R2 q LDR R0,R1,8 q LDR R0,R1,R2 ! ARM 指令系统 48 LDRB指令 q LDRB指令的格式为: LDR条件B 目的寄存器, q LDRB指令用于从存储器中将一个8位的字节数据传送到目 的寄存器中,同时将寄存器的高24位清零。该指令通常用 于从存储器中读取8位的字节数据到通用寄存器,然后对 数据进行处理。当程序计数器PC作为目的寄存器时,指令 从存储器中读取的字数据被当作目的地址,从而可以实现 程序流程的跳转。 LDRB R0,R1 LDRB R0,R1,8 ARM 指令系统 49 LDRH指令 q LDRH指令的格式为: LDR条件H 目的寄存器, q LDRH指令用于从存储器中将一个16位的半字数据传送到目 的寄存器中,同时将寄存器的高16位清零。该指令通常用 于从存储器中读取16位的半字数据到通用寄存器,然后对 数据进行处理。当程序计数器PC作为目的寄存器时,指令 从存储器中读取的字数据被当作目的地址,从而可以实现 程序流程的跳转。 LDRH R0,R1 LDRH R0,R1,8 LDRH R0,R1,R2 ARM 指令系统 50 STR指令 q STR指令的格式为: STR条件 源寄存器, q STR指令用于从源寄存器中将一个32位的字数据传送到存 储器中。该指令在程序设计中比较常用,且寻址方式灵活 多样,使用方式可参考指令LDR。 STRR0,R1,8 STRR0,R1,8 ARM 指令系统 51 STRB指令 q STRB指令的格式为: STR条件B 源寄存器, q STRB指令用于从源寄存器中将一个8位的字节数据传送到 存储器中。该字节数据为源寄存器中的低8位。 STRB R0,R1 STRB R0,R1,8 ARM 指令系统 52 STRH指令 q STRH指令的格式为: STR条件H 源寄存器, q STRH指令用于从源寄存器中将一个16位的半字数据传送到 存储器中。该半字数据为源寄存器中的低16位。 STRH R0,R1 STRH R0,R1,8 ARM 指令系统 53 批量数据加载/存储指令 q ARM微处理器所支持批量数据加载/存储指令可以一次在 一片连续的存储器单元和多个寄存器之间传送数据,批 量加载指令用于将一片连续的存储器中的数据传送到多 个寄存器,批量数据存储指令则完成相反的操作。常用 的加载存储指令如下: 1. LDM批量数据加载指令 2. STM批量数据存储指令 ARM 指令系统 54 LDM(或STM)指令 q LDM(或STM)指令的格式为: LDM(或STM)条件类型 基址寄存器!,寄存器列 表 q LDM(或STM)指令用于从由基址寄存器所指示的一片连续 存储器到寄存器列表所指示的多个寄存器之间传送数据, 该指令的常见用途是将多个寄存器的内容入栈或出栈 LDM R0!, r0-r4 ARM 指令系统 55 类型为以下几种情况 IA每次传送后地址加1; IB每次传送前地址加1; DA每次传送后地址减1; DB每次传送前地址减1; FD满递减堆栈; ED空递减堆栈; FA满递增堆栈; EA空递增堆栈; ARM 指令系统 56 后缀 q !为可选后缀,若选用该后缀,则当数据传送完毕之后 ,将最后的地址写入基址寄存器,否则基址寄存器的内容 不改变。 q 基址寄存器不允许为R15,寄存器列表可以为R0R15的任 意组合。 q 为可选后缀,当指令为LDM且寄存器列表中包含R15, 选用该后缀时表示:除了正常的数据传送之外,还将SPSR 复制到CPSR。同时,该后缀还表示传入或传出的是用户模 式下的寄存器,而不是当前模式下的寄存器。 q STMFD R13!,R0,R4-R12,LR q LDMFD R13!,R0,R4-R12,PC ARM 指令系统 57 数据交换指令 q ARM微处理器所支持数据交换指令能在存储器和寄存器之 间交换数据。数据交换指令有如下两条: 1. SWP字数据交换指令 2. SWPB字节数据交换指令 ARM 指令系统 58 SWP指令 q SWP指令的格式为: SWP条件 目的寄存器,源寄存器1,源寄存器2 q SWP指令用于将源寄存器2所指向的存储器中的字数据传送 到目的寄存器中,同时将源寄存器1中的字数据传送到源 寄存器2所指向的存储器中。显然,当源寄存器1和目的寄 存器为同一个寄存器时,指令交换该寄存器和存储器的内 容。 SWP R0,R1,R2 SWP R0,R0,R1 ARM 指令系统 59 SWPB指令 q SWPB指令的格式为: SWP条件B 目的寄存器,源寄存器1,源寄存器2 q SWPB指令用于将源寄存器2所指向的存储器中的字节数据 传送到目的寄存器中,目的寄存器的高24清零,同时将源 寄存器1中的字节数据传送到源寄存器2所指向的存储器中 。显然,当源寄存器1和目的寄存器为同一个寄存器时, 指令交换该寄存器和存储器的内容。 SWPB R0,R1,R2 SWPB R0,R0,R1 ARM 指令系统 60 移位指令(操作) q ARM微处理器内嵌的桶型移位器(Barrel Shifter),支 持数据的各种移位操作,移位操作在ARM指令集中不作为 单独的指令使用,它只能作为指令格式中是一个字段,在 汇编语言中表示为指令中的选项。例如,数据处理指令的 第二个操作数为寄存器时,就可以加入移位操作选项对它 进行各种移位操作。移位操作包括如下6种类型,ASL和 LSL是等价的,可以自由互换: 1. LSL 逻辑左移 2. ASL 算术左移 3. LSR 逻辑右移 4. ASR 算术右移 5. ROR 循环右移 6. RRX 带扩展的循环右移 ARM 指令系统 61 LSL(或ASL)操作 q LSL(或ASL)操作的格式为: 通用寄存器,LSL(或ASL) 操作数 q LSL(或ASL)可完成对通用寄存器中的内容进行逻辑(或 算术)的左移操作,按操作数所指定的数量向左移位,低 位用零来填充。其中,操作数可以是通用寄存器,也可以 是立即数(031)。 MOV R0, R1, LSL#2 ARM 指令系统 62 LSR操作 q LSR操作的格式为: 通用寄存器,LSR 操作数 q LSR可完成对通用寄存器中的内容进行右移的操作,按操 作数所指定的数量向右移位,左端用零来填充。其中,操 作数可以是通用寄存器,也可以是立即数(031)。 MOV R0, R1, LSR#2 ARM 指令系统 63 ASR操作 q ASR操作的格式为: 通用寄存器,ASR 操作数 q ASR可完成对通用寄存器中的内容进行右移的操作,按操 作数所指定的数量向右移位,左端用第31位的值来填充。 其中,操作数可以是通用寄存器,也可以是立即数(0 31)。 MOV R0, R1, ASR#2 ARM 指令系统 64 ROR操作 q ROR操作的格式为: 通用寄存器,ROR 操作数 q ROR可完成对通用寄存器中的内容进行循环右移的操作, 按操作数所指定的数量向右循环移位,左端用右端移出的 位来填充。其中,操作数可以是通用寄存器,也可以是立 即数(031)。显然,当进行32位的循环右移操作时, 通用寄存器中的值不改变。 MOV R0, R1, ROR#2 ARM 指令系统 65 RRX操作 q RRX操作的格式为: 通用寄存器,RRX 操作数 q RRX可完成对通用寄存器中的内容进行带扩展的循环右移 的操作,按操作数所指定的数量向右循环移位,左端用进 位标志位C来填充。其中,操作数可以是通用寄存器,也 可以是立即数(031)。 MOV R0, R1, RRX#2 ARM 指令系统 66 协处理器指令 q ARM微处理器可支持多达16个协处理器,用于各种协处理 操作,在程序执行的过程中,每个协处理器只执行针对自 身的协处理指令,忽略ARM处理器和其他协处理器的指令 。 q ARM的协处理器指令主要用于ARM处理器初始化ARM协处理 器的数据处理操作,以及在ARM处理器的寄存器和协处理 器的寄存器之间传送数据,和在ARM协处理器的寄存器和 存储器之间传送数据。ARM协处理器指令包括以下5条: q CDP协处理器数操作指令 q LDC协处理器数据加载指令 q STC协处理器数据存储指令 q MCR寄存器到协处理器寄存器的数据传送指令 q MRC协处理器寄存器到寄存器的数据传送指令 ARM 指令系统 67 CDP指令 q CDP指令的格式为: CDP条件 协处理器编码,协处理器操作码1,目的寄存 器,源寄存器1,源寄存器2,协处理器操作码2。 q CDP指令用于ARM处理器通知ARM协处理器执行特定的操作, 若协处理器不能成功完成特定的操作,则产生未定义指令 异常。其中协处理器操作码1和协处理器操作码2为协处理 器将要执行的操作,目的寄存器和源寄存器均为协处理器 的寄存器,指令不涉及ARM处理器的寄存器和存储器。 CDP P3,2,C12,C10,C3,4 ARM 指令系统 68 LDC指令 q LDC指令的格式为: LDC条件L 协处理器编码,目的寄存器,源寄存器 q LDC指令用于将源寄存器所指向的存储器中的字数据传送 到目的寄存器中,若协处理器不能成功完成传送操作,则 产生未定义指令异常。其中,L选项表示指令为长读取 操作,如用于双精度数据的传输。 LDC P3,C4,R0 ARM 指令系统 69 STC指令 q STC指令的格式为: STC条件L 协处理器编码,源寄存器,目的寄存器 q STC指令用于将源寄存器中的字数据传送到目的寄存器所 指向的存储器中,若协处理器不能成功完成传送操作,则 产生未定义指令异常。其中,L选项表示指令为长读取 操作,如用于双精度数据的传输。 STC P3,C4,R0 ARM 指令系统 70 MCR指令 q MCR指令的格式为: MCR条件 协处理器编码,协处理器操作码1,源寄存器 ,目的寄存器1,目的寄存器2,协处理器操作码2。 q MCR指令用于将ARM处理器寄存器中的数据传送到协处理器 寄存器中,若协处理器不能成功完成操作,则产生未定义 指令异常。其中协处理器操作码1和协处理器操作码2为协 处理器将要执行的操作,源寄存器为ARM处理器的寄存器 ,目的寄存器1和目的寄存器2均为协处理器的寄存器。 MCR P3,3,R0,C4,C5,6 ARM 指令系统 71 MRC指令 q MRC指令的格式为: MRC条件 协处理器编码,协处理器操作码1,目的寄存 器,源寄存器1,源寄存器2,协处理器操作码2。 q MRC指令用于将协处理器寄存器中的数据传送到ARM处理器 寄存器中,若协处理器不能成功完成操作,则产生未定义 指令异常。其中协处理器操作码1和协处理器操作码2为协 处理器将要执行的操作,目的寄存器为ARM处理器的寄存 器,源寄存器1和源寄存器2均为协处理器的寄存器。 q MRC P3,3,R0,C4,C5,6 ARM 指令系统 72 异常产生指令 q ARM微处理器所支持的异常指令有如下两条: 1. SWI软件中断指令 q BKPT断点中断指令 ARM 指令系统 73 SWI指令 q SWI指令的格式为: SWI条件 24位的立即数 q SWI指令用于产生软件中断,以便用户程序能调用操作系 统的系统例程。操作系统在SWI的异常处理程序中提供相 应的系统服务,指令中24位的立即数指定用户程序调用系 统例程的类型,相关参数通过通用寄存器传递,当指令中 24位的立即数被忽略时,用户程序调用系统例程的类型由 通用寄存器R0的内容决定,同时,参数通过其他通用寄存 器传递。 q SWI 0x02 ARM 指令系统 74 BKPT指令 q BKPT指令的格式为: BKPT 16位的立即数 q BKPT指令产生软件断点中断,可用于程序的调试。 ARM 指令系统 75 Thumb指令集 q Thumb指令集是针对代码密度的问题而提出的。可以看作 是ARM指令集的子集。 q 所有Thumb指令均有对应的ARM指令,而Thumb编程模 型也对应于Thumb模型。 q Thumb是一个不完整的体系结构,不能指望处理器只执行 Thumb代码而不支持ARM指令集。一般Thumb代码只需 支持通用功能,必要时可以借助ARM指令集(例:所有异 常自动进入ARM模式) q 应用程序可以灵活的将ARM指令和Thumb程序混合,以 便提高性能和代码密度。同时达到降低功耗、节约成本和 提高性能的目的。 THUMB 指令系统 76 Thumb指令集的执行 q 在任何时刻,对指令流的解释取决于CPSR的第5位,即 位T,若T置位,则认为指令流为16位的Thumb指令;否 则为标准的ARM指令。 q 并不是所有的ARM处理器都支持Thumb指令。只有在命 名中有字母T的才支持,例如以上提到的ARM7TDMI。 THUMB 指令系统 77 Thumb模式的进入和退出 q 复位后,ARM启动并执行ARM指令。转向执行Thumb指 令的通常方法是执行一条交换转移指令BX。若BX指令指 定的寄存器的最低位为1,则将T置位,并将程序计数器切 换为寄存器其他位给出的地址。 q 异常返回也可以将微处理器从ARM状态转换为Thumb状 态。通常这种指令用于返回到进入异常前所执行的指令流 ,而不是特地用于转换到Thumb模式。 q 执行Thumb BX指令可以显式地返回到ARM指令流。 THUMB 指令系统 78 Thumb转移指令 q ARM指令有一个大的(24位)偏移域(offsetfield),这不可 能在16位Thumb指令格式中表示。为此,Thumb指令集 有多种方法实现其于功能。 q 格式 1. B cond 2. B 3. BL 4. BLX 5. BLXRm q 转移指令的典型用法如下: 1)短距离条件转移指令可用于控制循环的退出。 2)中等距离的无条件转移指令用于实现goto功能。 3)长距离子程序调用 THUMB 指令系统 79 Thumb转移指令 B 指令 qB cond /*8位偏移,目标为Thumb代码 */ qB /*11位偏移,目标为Thumb代码 */ 这两种格式是条件域和偏移长度的折衷。指令首先将偏移值 左移1位,实现16位对齐,然后扩展到32位,因此他们的偏 移量分别为256字节和2K字节。 THUMB 指令系统 80 Thumb转移指令 BL 指令 qBL/*11位偏移,目标为Thumb代码 */ q转移链接子程序通常需要一个大的范围,很难用16位指令 格式实现为此,Thumb采用两条这样格式的指令组合成22 位半字偏移(符号扩展为32位),使指令转移范围为4MB。 q为了使这两条转移指令相互独立,以致使他们之间也能响 应中断等,将链接寄存器LR作为暂存器使用,LR在这两条 指令执行完成后会被覆盖,因此,LR中不能装有有效内容。 这个指令对的操作如下: (第一条) LR:PC+(偏移量左移12后符号扩展至32位) (第二条) PC:LR+(偏移量左移1位) LRoldPC+3 THUMB 指令系统 81 Thumb转移指令 BLX 指令 q BLX /*目标为ARM代码 */ q 该指令只在v5T结构中有效。它使用与上面BL指令同样的 第一步,即 (第一条) LR:PC+(偏移量左移12后符号扩展至32位) (第二条) PC:LR+(偏移量左移1位) &0xffff_fffc LRoldPC+3 Thumb位清0。 应注意转移的目标是ARM指令,偏移地址只需要10位, 而且PC值的位1可能为1,因此,必须进行清0操作。 THUMB 指令系统 82 Thumb转移指令 BLX Rm指令 q BLXRm q 目标为ARM代码或Thumb代码 q 与上一条代码不同的就是r14的值为后续地址加1,以表示 被Thumb代码调用。 THUMB 指令系统 83 Thumb软中断指令 q Thumb软中断指令的行为与ARM等价指令完全相同。进 入异常的指令使微处理器进入ARM执行状态。 q 该代码使用8位立即数,这将会把Thumb代码的SWI指令 限制到前256种,而ARM的SWI指令可以达到l 600万种。 THUMB 指令系统 84 Thumb数据处理指令 q Thumb数据处理指令包括一组高度优化且相当复杂的指 令,范围涵盖编译器通常需要的大多数操作。 q 在Thumb指令集中有等价指令的ARM数据处理指令如下 所列: 1. 使用低8个通用寄存器(r0-r7)的指令: ARM指令 Thumb指令 MOVS Rd# MOV Rd,# MVNS Rd,Rm MVN Rd,Rm CMP Rn# CMP Rn,# THUMB 指令系统 85 Thumb数据处理指令与等价的 ARM指令 ARM指令 Thumb指令 CMP Rn,Rm CMP Rn,Rm CMN Rn,Rm CMN Rn,Rm TST Rn,Km TST Rn,Rm ADDS Rd,Rn,# ADD Rd,Rn,# ADDS Rd,Rd,# ADD Rd,# ADDS Rd,Rn,Rm ADD Rd,Rn,Rm ADCS Rd,Rd,Rm ADC Rd,Rm SUBS Rd, Rn,# SUB Rd,Rn,# SUBS Rd,Rd,# SUB Rd,# THUMB 指令系统 86 Thumb数据处理指令与等价的 ARM指令 ARM指令 Thumb指令 SUBS Rd,Rn,Rm SUB Rd,Rn,Rm SBCS Rd,RdRm SBC Rd,Rm RSBS Rd,Rn,#0 NEG RdRn MOVS Rd,Rm,LSL # LSL Rd,Rm# MOVS Rd,Rd,LSL Rs LSL Rd,R9 MOVS Rd,Rm,LSR# LSR Rd,Rm,# MOVS Rd,Rd,LSR Rs LSR Rd,Rs MOVS Rd,Rm, ASR# ASR Rd,Rm,# MOVS Rd,Rd,ROR Rs ASR Rd, Rs THUMB 指令系统 87 Thumb数据处理指令与等价的 ARM指令 ARM指令 Thumb 指令 MOVS Rd,Rd,ROR Rs ROR Rd, Rs ANDS Rd,Rd,Rm AND Rd, Rm EORS Rd,Rd,Rm EOR Rd,Rm ORRS Rd,RdRm ORR Rd,Rm BICS Rd,Rd,Rm BIC Rd,Rm MULS Rd,Rm,Rd MUL Rd,Rm THUMB 指令系统 88 Thumb数据处理指令与等价的 ARM指令 使用高8个寄存器(r8r15)的指令,在有些情况下结合低8个 寄存器使用: ARM指令 Thumb 指令 ADD Rd,Rd,Rm ADD Rd,Rm(1/2 Hi regs) CMP Rn,Rm CMP Rn,Rm(1/2 Hi regs) MOV Rd,Rm ADD Rd,Rm(1/2 Hi regs) ADD Rd, pc,# ADD Rd,pc,#(#imm8 ADD Rd,sp,# ADD Rd,sp,# ADD sp,sp,# ADD sp,sp,# SUB sp,sp,# SUB sp,sp,# THUMB 指令系统 89 Thumb数据处理指令与等价的 ARM指令 注意事项: 1. 所有对低8个寄存器操作的数据处理指令都更新条件码 位(等价的ARM指令位s置位)。 2. 对高8个寄存器操作的指令不改变条件码位。CMP指令 除外,它只改变条件码。 3. 上面的指令中“1/2 Hi regs“表示至少有1个寄存器操作数 是高8位寄存器。 4. #imm3、#imm7、#imm8分别表示3位、7位和8位立即 数域。#sh表示5位的移位数域。 THUMB 指令系统 90 Thumb单寄存器数据传送指令 1. LDR|STRB Rd,Rn, #off5 2. LDRH | STRH Rd,Rn,#off5 3. LDR|STRSH|BRd,Rn,Rm 4. LDR Rd, pc, #off8 5. LDR |STR Rd,sp,#off8 说 明 1. 这些指令是从ARM单寄存器传送指令中精心导出的子 集,并且与等价的ARM指令有严格相同的语义。 2. 在所有的指令中,对偏移量需要根据数据类型按比例调 整。例如,5位偏移量的范围在字节Load和Store指令中 是32字节,在半字Load和Store指令中是64字节,在字 Load和Store指令中是128字节 THUMB 指令系统 91 Thumb多寄存器数据传送指令 q 同ARM指令一样,Thumb多寄存器数据传送指令可以用 于过程调用与返回以及存储器块拷贝。但为了编码的紧凑 性,这两种用法由分开的指令实现,其寻址方式的数量也 有所限制,在其他方面,这些指令的性质与等价的ARM指 令相同。 q LDMIA Rn!, q STMIA Rn!, q POP ,pc q PUSH ,1r THUMB 指令系统 92 Thumb多寄存器数据传送指令 q 指令的块拷贝形式使用LDMIA和STMlA寻址模式。寄存器 (低8个寄存器r0r7)中的任何一个可以作为基址寄存器。 q 寄存器列表可以是这些寄存器的任意子集,但不应包括基 址寄存器,因为总是选择回写。 q 堆栈形式使用SP(r13)作为基址寄存器,并且也总是使用 回写。堆栈的模式也固定为满栈递减。寄存器列表除了可 以是8个Lo寄存器外,链接寄存器LR可以出现在PUSH指 令中,PC可以出现在POP指令中,以优化过程调用及返 回程序。 THUMB 指令系统 93 Thumb的应用 q 高端的32位ARM系统可以用Thumb代码实现特定的非关 键程序,以节省功耗或降低对存储器的需求。 q 低端的16位系统可以有小规模的32位片上RAM供运行 ARM代码的关键程序使用,所有非关键程序使用片外 Thumb代码。 q 上面第二种情况或许更接近于Thumb所适宜的应用。在移 动电话和寻呼机的应用中,需要ARM最大处理能力的实时 信号处理(DSP)功能但这些程序可以紧凑编码井放在小 规模的片上存储器中。那些控制用户界面、电池管理系统 等等复杂的比较长的代码是非实时的,可由Thumb代码放 在片外ROM中,由8位或16位总线就可以得到好的性能, 同时降低成本和延长电池寿命。 THUMB 指令系统 94 ATPCS q 为了使单独编译的c语言程序和汇编程序之间能够相互调 用,必须为于程序间的调用规定一定的规则。ATPCS就 是ARM程序和Thumb程序中子程序调用的基本规则。 q ATPCS规定了一些子程序间调用的基本规则。这些基本 规则包括子程序调用过程中寄存器的使用规则,数据栈的 使用规则,参数的传递规则。 q 为适应一些特定的需要,对这些基本的调用规则进行一些 修改得到几种不同的子程序调用规则。这些特定的调用规 则包括: ATPCS介绍 95 q 支持数据栈限制检查的ATPCS。 q 支持只读段位置无关(ROPl)的ATPCS。 q 支持可读写段位置无关(RWPl)的ATPCS。 q 支持ARM程序和Thumb程序混合使用的ATPCS。 q 处理浮点运算的ATPCS。 q 有调用关系的所有子程序必须遵守同一种ATPCS。编译 器或者汇编器在ELF格式的目标文件中设置相应的属性, 标识用户选定的ATPCS类型。 q 对应于不同类型的ATPCS规则,有相应的c语言库,连接 器根据用户指定的ATPCS类型连接相应的c语言库。 ATPCS介绍 96 q 使用C语言编泽器编译的C语言子程序满足用户指定的 ATPCS类型而对于汇编语言程序来说,完全要依赖用 户来保证各子程序满足选定的ATPCS类型。具体来说, 汇编语言子程序必须满足下面3个条件: 1. 在于程序编写时必须遵守相应的ATPCS规则。 2. 数据栈的使用要遵守相应的ATPCS规则 3. 在汇编编译器中使甩atpcs选项。 ATPCS介绍 97 基本ATPCS q 基本ATPCS规定了在子程序调用时的一些基本规则,包 括下面3方面的内容: 1. 各寄存器的使用规则及其相应的名称。 2. 数据栈的使用规则。 3. 参数传递的规则。 ATPCS介绍 98 q 相对于其他类型的ATPCS,满足基本ATPCS的程序的执 行速度更快,所占用的内存更少。但是它不能提供以下 的支持: 1. ARM程序和Thumb程序相互调用。 2. 数据以及代码的位置无关的支持。 3. 子程序的可重入性。 4. 数据栈检查的支持。 q 而派生的其他几种特定的ATPCS就是在基本ATPCS的基 础上再添加其他的规则而形成的。其目的就是提供上述 的功能。 ATPCS介绍 99 寄存器的使用规则 q 寄存器的使用必须满足下面的规则: 1. 子程序间通过寄存器 R0一R3来传递参数,这时,寄 存器R0R3可以记作A1-A4。被调用的子程序在返回前 无需恢复寄存器R0R3的内容。 2. 在子程序中,使用寄存器R4R11来保存局部变量这 时,寄存器 R4 R11可以记作V1 V8。如果在子程 序中使用到了寄存器V1V8中的某些寄存器,子程序进 入时必须保存这些寄存器的值,在返回前必须恢复这些 寄存器的值;对于子程序中没有用到的寄存器则不必进 行这些操作。在Thumb程序中,通常只能使用寄存器R4 R7来保存局部变量。 ATPCS介绍 100 3. 寄存器R12用作子程序间scratch寄存器(用于保存SP ,在函数返回时使用该寄存器出栈),记作ip。在子程序 间的连接代码段中常有这种使用规则。 4. 寄存器R13用作数据栈指针,记作sp。在子程序中寄存 器R13不能用作其他用途。寄存器sp在进入子程序时的值 和退出子程序时的值必须相等。 5. 寄存器R14称为连接寄存器,记作lr。它用于保存子程序 的返回地址。如果在子程序中保存了返回地址,寄存器 R14则可以用作其他用途。 6. 寄存器R15是程序计数器,记作pc。它不能用作其他用 途。 ATPCS介绍 101 ATPCS中各寄存器的使用规则及其名称 q 下表总结了在ATPCS中各寄存器的使用规则及其名称。 这些名称在编译器和汇编器中都是预定义的。 寄存 器 别 名 特殊 名称 使用规则 R15 Pc程序计数器 R14 Lr连接寄存器 R13 Sp数据栈指针 R12 ip于程序内部调用的scratch寄存器 R11v8 ARM状态局部变量寄存器8 R10 V 7 si ARM状态局部变量寄存器7,在支持数 据栈检查的ATPCS中为数据栈限制指针 ATPCS介绍 102 寄存 器 别 名 特殊名 称 使用规则 R9 v6 sb ARM状态局部变量寄存器6,在支持RWPI 的ATPCS中为静态基址寄存器 R8v5 ARM状态局部变量寄存器5 R7 V 4 wr 局部变量寄存器4,Thumb状态工作寄存器 R6V 3 局部变量寄存器3 R5v2 局部变量寄存器2 R4v1 局部变量寄存器2 ATPCS介绍 103 寄存 器 别 名 特殊名 称 使用规则 R3A4 参数/结果scratch寄存器4 R2A3 参数/结果scratch寄存器3 R1A2 参数/结果scratch寄存器2 R0A1 参数/结果scratch寄存器1 ATPCS介绍 104 数据栈使用规则 q 栈指针通常可以指向不同的位置。当栈指针指向栈顶元 素(即最后一个入栈的数据元素)时,称为FULL栈;当栈 指针指向与栈顶元素(即最后一个入栈的数据元素)相邻 的一个可用数据单元时,称为EMPTY栈。 q 数据栈的增长方向也可以不同。当数据栈向内存地址减 小的方向增长时,称为DESCENDING栈,当数据栈向内 存地址增加的方向增长时,称为ASCENDING栈。 q 综合这两种特点可以有以下4种数据栈。 1. FD Full Descending 2. ED Empty Descending 3. FA Full Ascending 4. EA Empty Ascending ATPCS介绍 105 q ATPCS规定数据栈为FD类型,并且对数据栈的操作是8字 节对齐的。 q 异常中断的处理程序可以使用被中断程序的

温馨提示

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

评论

0/150

提交评论