1 / 98

ARM 体系结构编程

ARM 体系结构编程. 课程内容复习 (1). 1.Arm 处理器的工作状态 Arm 状态和 Thumb 状态 2.Arm 处理器的工作模式 7 种工作模式 工作模式的区别: 不同工作模式下的程序能访问的系统资源 (CPU 寄存器 ) 不同。 改变工作模式的方法: 软件改变 CPSR 的模式位、异常中断的发生 工作模式的最大用途: 用于处理不同的中断请求. 课程内容复习 (2). 3. Arm 的寄存器组织. 课程内容复习 (2). 课程内容复习 (3). 4. Arm 的异常中断、中断向量表、中断处理、中断引起的工作模式的改变、中断的作用。. 地址.

maine
Download Presentation

ARM 体系结构编程

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. ARM体系结构编程

  2. 课程内容复习(1) 1.Arm处理器的工作状态 Arm状态和Thumb状态 2.Arm处理器的工作模式 7种工作模式 工作模式的区别:不同工作模式下的程序能访问的系统资源(CPU寄存器)不同。 改变工作模式的方法:软件改变CPSR的模式位、异常中断的发生 工作模式的最大用途:用于处理不同的中断请求

  3. 课程内容复习(2) 3. Arm的寄存器组织

  4. 课程内容复习(2)

  5. 课程内容复习(3) • 4. Arm的异常中断、中断向量表、中断处理、中断引起的工作模式的改变、中断的作用。 地址 中断向量 0x0 Ldr PC, =ResetHandler Reset引脚 复位中断(1) Reset按键 设置异常模式 0x4 Ldr PC, =UndeftHandler 未定义指令(6) 中 断 处 理 未定义指令 中 断 模 块 内部指令执行 0x8 Ldr PC, =SWIHandler SWI指令 软件中断(6) P C 0xc Ldr PC, =InstrHandler 指令预取中止 指令预取中止(5) 0x10 Ldr PC, =DataHandler 数据预取中止 数据访问中止(2) IRQ引脚 保留 devices 0x14 IRQ(4) 0x18 Ldr PC, =IRQHandler FIQ引脚 devices FIQ(3) Ldr PC, =FIQHandler 0x1c CPU Flash

  6. ARM的流水线结构 • 流水线结构 一条指令典型执行过程可能包括: • 取指:从存储器中取出指令(fetch); • 译码(dec); • 取操作数,从寄存器组中读操作数(reg); • 执行运算(ALU); • 存储器访问(mem); • 结果写回寄存器(res);

  7. ARM的流水线结构 指令流水线

  8. ARM7的三级流水 • ARM7 采用3级流水线,即分为取指、译码和执行。

  9. ARM9的五级流水 • ARM9 5级流水线,即分为取指、译码、执行、数据缓存和写回。 3级流水线阻塞主要发生在存储器访问和数据通路的占用上,ARM9则采用5级流水线,把存储器存取和数据存取分开,且增加I-Cache和D-Cache,同时增加了数据写回的专用通道

  10. I-Cache和D-Cache • 快存(Cache)结构 新型ARM处理器采用 I-Cache和D-Cache独立的结构

  11. Arm存储器格式 • ARM体系结构将存储器看作是从零地址开始的字节的线性组合 • ARM体系结构可以用两种方法存储字数据,称之为大端格式和小端格式 • 大端格式:字数据的高字节存储在低地址中,字数据的低字节存储在高地址中。 • 小端格式:字数据的高字节存储在高地址中,字数据的低字节存储在低地址中。

  12. Arm存储器格式

  13. 主要内容 • 1.Arm指令概要介绍 • 2.Arm指令的寻址方式 • 3.Arm指令系统

  14. 1.Arm指令概要介绍 • 从四个方面进行描述 • 1.1 Arm指令的分类 • 1.2 典型的Arm指令的语法格式 • 1.3 Arm指令的条件执行 • 1.4 Arm指令的一般编码格式

  15. 1.1Arm 指令的分类 • 1 跳转指令 • 2 数据处理指令 • 3 乘法指令与乘加指令 • 4 程序状态寄存器访问指令 • 5 加载/存储指令 • 6 批量数据加载/存储指令 • 7 数据交换指令 • 8 移位操作指令 • 9 异常产生指令 • 10 协处理器指令

  16. 1.2典型的Arm指令的语法格式 • 一条典型的Arm指令语法格式为 • 例子 • ADDEQS R0,R1,#3

  17. 1.3Arm指令的条件执行 • 大多数Arm指令都可以条件执行,也就是根据CPSR中的条件标志位决定是否执行该指令。当条件满足时该指令执行,条件不满足时被当作一条NOP指令 • 可以条件执行的指令可以在其助记符的扩展域上加上条件码助记符,从而在特定的条件下执行 ADDEQS R0,R1,#3

  18. 条件执行的例子 • if (a>b) a++; • else b++; • CMP R0, R1 • ADDHI R0, R0, #1 • ADDLS R1, R1, #1

  19. ARM 指令 C 代码 非条件执行 条件执行 if (r0 == 0) { r1 = r1 + 1; } else { r2 = r2 + 1; } CMP r0, #0 BNE else ADD r1, r1, #1 B end else ADD r2, r2, #1 end ... CMP r0, #0 ADDEQ r1, r1, #1 ADDNE r2, r2, #1 ... • 3条指令 • 占据3个字 • 3个时钟周期 • 5条指令 • 占据5个字 • 5个或者6个时钟周期 条件执行的例子

  20. 1.4 Arm指令的编码格式 • 编码格式: • 机器指令格式 • 在存储器中的指令格式 ADDEQS R0,R1,#3

  21. 主要内容 • 1.Arm指令概要介绍 • 2.Arm指令的寻址方式 • 3.Arm指令系统

  22. 2. Arm 指令的寻址方式 • 立即寻址 • 寄存器寻址 • 寄存器间接寻址 • 基址变址寻址 • 寄存器偏移寻址 • 相对寻址 • 多寄存器寻址 • 堆栈寻址

  23. 1.寻址方式-立即寻址 • 立即寻址也叫立即数寻址 • 这是一种特殊的寻址方式,操作数本身就在指令中给出(或根据指令可直接计算而得),只要取出指令也就取到了操作数。这个操作数被称为立即数,对应的寻址方式也就叫做立即寻址 。 • 例子 • ADD R0,R0,#1 ;R0←R0+1 • ADD R0,R0,#0x3f ;R0←R0+0x3f

  24. 2.寻址方式-寄存器寻址 • 寄存器寻址就是利用寄存器中的数值作为操作数 • 这种寻址方式是各类处理器经常采用的一种方式,也是一种执行效率较高的寻址方式 • 例子 • ADD R0,R1,R2 ;R0←R1+R2

  25. 3.寻址方式-寄存器间接寻址 • 寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中 • 例子 • ADD R0,R1,[R2] ;R0←R1+[R2] 将R2中的数值作为地址,取出此地址中的数据与R1中的数据相加,结果存在R0里

  26. 4.寻址方式-基址变址寻址 • 基址变址寻址就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。 • 基址变址寻址方式常用于访问某基地址附近的地址单元。 • 例子 • LDR R0,[R1,#4] ;R0←[R1+4] 将R1中的数值加4作为地址,取出此地址的数值保存在R0中 • LDR R0,[R1,#4]! ;R0←[R1+4]、R1←R1+4 • LDR R0,[R1] ,#4 ;R0←[R1]、R1←R1+4 • LDR R0,[R1,R2] ;R0←[R1+R2]

  27. 5.寻址方式-寄存器偏移寻址 • ARM指令集特有的寻址方式,当第二个操作数是寄存器偏移方式时,第二个寄存器操作数在与第一个操作数结合前,选择进行移位操作。 • 例子: • MOV R0, R2, LSL #3; R2的值左移3位,结果放入R0 • 可选择的移位操作如下: • LSL:逻辑左移,寄存器中字的低端空出的位补0 • LSR:逻辑右移,寄存器中字的高端空出的位补0

  28. 6.寻址方式-相对寻址 • 与基址寻址方式相类似,相对寻址以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。以下程序段完成子程序的调用和返回,跳转指令BL采用了相对寻址方式: BL NEXT ;跳转到子程序NEXT处执行 …… NEXT …… MOV PC, LR ;从子程序返回

  29. 7.寻址方式-多寄存器寻址 • 采用多寄存器寻址方式,一条指令可以完成多个寄存器值的传送 • 这种寻址方式可以用一条指令完成传送最多16 个通用寄存器的值 • 例子 • LDMIA R0,{R1,R2,R3,R4} ; ;R1←[R0] ;R2←[R0+4] ;R3←[R0+8] ;R4←[R0+12] 将R0单元中的数据读出到R1,R2,R3,R4寄存器中

  30. 8.寻址方式-堆栈寻址 • 存储器堆栈可分为两种: • 向上生长:向高地址方向生长,称为递增堆栈(Ascending Stack) • 向下生长:向低地址方向生长,称为递减堆栈(Decending Stack), • 堆栈指针指向最后压入的堆栈的有效数据项,称为满堆栈(Full Stack) • 堆栈指针指向下一个要放入的空位置,称为空堆栈( Empty Stack)

  31. 8.寻址方式-堆栈寻址 • 这样就有四种类型的堆栈工作方式,ARM微处理器支持这四种类型的堆栈工作方式,即: • - 满递增堆栈(FA):堆栈指针指向最后压入的数据,且由低地址向高地址生成。 • - 空递增堆栈(EA):堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成。 • - 满递减堆栈(FD):堆栈指针指向最后压入的数据,且由高地址向低地址生成。 • - 空递减堆栈(ED):堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成。

  32. 例子: • STMFD SP!,{R1-R7,LR};将R1-R7,LR入栈,满递减堆栈

  33. 主要内容 • 1.Arm指令概要介绍 • 2.Arm指令的寻址方式 • 3.Arm指令系统

  34. Arm 指令的分类 • 1 跳转指令 • 2 数据处理指令 • 3 乘法指令与乘加指令 • 4 程序状态寄存器访问指令 • 5 加载/存储指令 • 6 批量数据加载/存储指令 • 7 数据交换指令 • 8 移位操作指令 • 9 异常产生指令 • 10 协处理器指令

  35. 1. 跳转指令 • Arm中两种改变程序流程的方式 • 使用专门的跳转指令 • 直接向程序计数器PC 写入跳转地址值 • 通过向程序计数器PC 写入跳转地址值,可以实现在4GB 的地址空间中的任意跳转 • 在跳转之前结合使用MOV LR,PC等类似指令,可以保存将来的返回地址值,从而实现在4GB 连续的线性地址空间的子程序调用

  36. 四类跳转指令 • 四类跳转指令 • B 跳转指令 • BL 带返回的跳转指令 • BLX 带返回和状态切换的跳转指令 • BX 带状态切换的跳转指令 • B/BL指令 • 语法格式 • 编码格式

  37. B 指令 • 语法格式: • B{cond} <target_address> • B指令和目标地址处的指令都为arm指令集 • B 指令是最简单的跳转指令。一旦遇到一个 B 指令,ARM 处理器将立即跳转到给定的目标地址,从那里继续执行 • 例子: • B Label ;程序无条件跳转到标号Label 处执行 • BEQ Label;当CPSR 寄存器中的Z 条件码置位时,程序跳转到标号Label 处执行

  38. BL 指令 • BL 指令的格式为: • BL{cond} <target_address> • BL指令和目标地址处的指令都为arm指令集 • BL 是另一个跳转指令,但跳转之前,会在寄存器R14 中保存PC 的当前内容,因此,可以通过将R14 的内容重新复制到PC 中,来返回到跳转指令之后的那个指令处执行 • 复制方法: BL Label;当程序无条件跳转到标号Label处执行时,同时将当前的PC值保存到R14中 MOV PC, R14;

  39. BLX (1) 指令 • BLX 指令的格式为 • BLX{cond} <target_address> • 从ARM指令集跳转到指令中指定的目标地址,并把程序状态切换为Thumb状态,同时把PC寄存器的内容复制到R14寄存器。 • 主要用于:当子程序为Thumb指令集,而调用者为Arm指令集时,可以通过BLX实现子程序调用。

  40. BLX (2) 指令 • BLX(2)的语法格式 • BLX{cond} <Rm> • 从Arm指令集跳转到指令中指定的目标地址,目标指令可以是Arm指令,也可以是Thumb指令。目标地址放在指令中的<Rm>寄存器中。该指令同时把PC寄存器的内容复制到LR寄存器中 • 当Rm的bit[0]为0时,目标地址处的指令为ARM指令; • 当Rm的bit[0]为1时,目标地址处的指令为THUMB指令

  41. BX 指令 • BX 指令的格式为 • BX{cond} <Rm> • BX 指令跳转到指令中所指定的目标地址,目标地址处的指令既可以是ARM 指令,也可以是Thumb 指令 • 当Rm的bit[0]为0时,目标地址处的指令为ARM指令; • 当Rm的bit[0]为1时,目标地址处的指令为THUMB指令

  42. 2.数据处理指令 • 数据处理指令可分为数据传送指令、算术逻辑运算指令和比较指令等 • 数据传送指令用于向寄存器中传入一个常数 • 算术逻辑运算指令完成常用的算术与逻辑的运算,该类指令将运算结果保存在目的寄存器中,并根据S位是否置位更新CPSR 中的相应条件标志位 • 比较指令不保存运算结果,并无条件更新CPSR 中相应的条件标志位

  43. 指令种类 • — SUB 减法指令 • — SBC 带借位减法指令 • — RSB 逆向减法指令 • — RSC 带借位的逆向减法指令 • — AND 逻辑与指令 • — ORR 逻辑或指令 • — EOR 逻辑异或指令 • — BIC 位清除指令 • — MOV 数据传送指令 • — MVN 数据取反传送指令 • — CMP 比较指令 • — CMN 反值比较指令 • — TST 位测试指令 • — TEQ 相等测试指令 • — ADD 加法指令 • — ADC 带进位加法指令

  44. 数据传送指令 • MOV 数据传送指令 • MVN 数据取反传送指令

  45. 举例 • MOV R1,R0;将寄存器R0的值传送到寄存器R1 • MOV PC,R14;将寄存器R14的值传送到PC,常用于子程序返回 • MOV R1,R0,LSL#3 ;将寄存器R0的值左移3位后传送到R1 • MVN R0,#0x10;将立即数0x10取反传送到寄存器R0中

  46. 比较指令 • CMP 比较指令:使用寄存器Rn的值减去operand2的值,根据操作的结果CPSR中的相应条件标志位 • CMN 反值比较指令:使用寄存器Rn的值加上operand2的值,根据操作的结果CPSR中的相应条件标志位

  47. 比较指令 • TST 位测试指令:将寄存器Rn的值与operand2的值按位作逻辑与操作,根据操作的结果CPSR中的相应条件标志位 • TEQ 相等测试指令:将寄存器Rn的值与operand2的值按位作逻辑异或操作,根据操作的结果CPSR中的相应条件标志位

  48. 举例 • CMP R1,R0;将寄存器R1的值与寄存器R0的值相减,并根据结果设置CPSR的标志位 • CMP R1,#100;将寄存器R1的值与立即数100相减,并根据结果设置CPSR的标志位 • CMN R1,R0;将寄存器R1的值与寄存器R0的值相加,并根据结果设置CPSR的标志位 • TST R1,#0xffe;将寄存器R1的值与立即数0xffe按位与,并根据结果设置CPSR的标志位 • TEQ R1,R2;将寄存器R1的值与寄存器R2的值按位异或,并根据结果设置CPSR的标志位

  49. 算术逻辑运算指令 • ADD加法运算指令:将operand2数据与Rn的值相加,结果保存到Rd寄存器

More Related