1 / 135

第三章 ARM指令系统

第三章 ARM指令系统. ◆ 要求了解指令系统的格式 ◆ 掌握 ARM 微处理器指令的寻址方式 ◆ 掌握一些常用的 ARM 指令的使用方法. 3.1 ARM 指令系统版本. 指令系统概念 指令: 是规定计算机进行某种操作的命令。 指令系统: 计算机能够执行的各种指令的集合。. ARM 公司从最初的开发到现在, ARM 指令集结构有了巨大的改进,并在不断完善和发展。为了清楚地表达每个 ARM 内核所使用的指令集, ARM 公司定义了一系列的指令集体系结构版本,以 vx 表示某种版本。. 1. 版本 1 ( v1 )

grazia
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. ◆要求了解指令系统的格式 ◆掌握ARM 微处理器指令的寻址方式 ◆掌握一些常用的ARM 指令的使用方法

  3. 3.1 ARM指令系统版本 指令系统概念 指令:是规定计算机进行某种操作的命令。 指令系统:计算机能够执行的各种指令的集合。 ARM公司从最初的开发到现在,ARM指令集结构有了巨大的改进,并在不断完善和发展。为了清楚地表达每个ARM内核所使用的指令集,ARM公司定义了一系列的指令集体系结构版本,以vx表示某种版本。

  4. 1.版本1(v1) v1在ARM1中使用,但从未商业化。26位寻址空间,其指令主要有: 1) 基本的数据处理指令(无乘法指令) 2) 字、字节和半字存储器访问指令 3) 分支指令(包括带链接的分支指令) 4) 软件中断指令

  5. 2.版本2(v2) v2仍是26位寻址空间,在v1的基础上增加的内容有: 1) 乘法和乘法加指令 2) 支持协处理器 3) 快速中断模式中的分组寄存器 4) 交换式加载/存储指令。

  6. 3.版本3(v3) V3将寻址范围扩展到32位,但兼容26位寻址。在v2的基础上增加的内容有: 1) 设置了专用的当前程序状态寄存器CPSR、增加了程序状态保存寄存器 2) 增加了中止异常和未定义指令异常两种处理器模式 3) 增加了访问CPSR、SPSR的指令MRS和MSR 4) 修改了异常返回指令的功能

  7. 4.版本4(v4) V4是32位寻址方式,但不再兼容26位寻址,在v3的基础上增加的内容有: 1) 半字加载/存储指令 2) 在T变量中转换到Thumb状态的指令 3) 增加了在使用用户模式寄存器的特权处理器模式

  8. 5.版本5(v5) V5对v4指令做了必要的修改和扩展,并且增加了指令,具体变化为: 1) 改进在T变量中ARM/Thumb状态之间的切换效率 2) 对于T和非T变量使用相同的代码生成技术 3) 增加了计数前导零指令

  9. 4) 增加了软件断点指令 5) 对乘法指令设置标志做了严格定义。 6) 将流水线的级数从3级(如ARM7TDMI使用的)增加到5级; 7) 并改变存储器接口来使用分开的指令与数据存储器。

  10. 6.版本6 (v6) V6对v5指令做了必要的修改和扩展,并且增加了指令, 2001年发布,首先在ARM11处理器中使用(2002年春季发布),具体变化为: 1) ARM体系版本6的新架构在降低耗电量的同时,还强化了图形处理性能。 2) 增加了多媒体处理功能:通过追加有效进行多媒体处理的SIMD功能,将语音及图像的处理功能提高到了原机型的4倍。 3) V6版本还支持多微处理器内核。

  11. 3.2 ARM 微处理器指令格式 1. ARM指令特点 1)所有指令都是32位的。 (1) 大多数指令都在单周期内完成。 (2) 所有指令都可以条件执行。 (3) ARM指令为load/store类型。 (4) 基本指令仅36条,分成五类。 (5) 有9种寻址方式。 (6) 指令集可以通过协处理器扩展。

  12. 2)ARM指令是加载/存储(Load/Store)型: 指令集仅能处理寄存器中的数据,处理结果都要放回寄存器中 对系统存储器的访问则需要通过专门的加载/存储指令来完成。

  13. 3)ARM指令可以分为五大类: 数据处理指令、存储器访问指令、分支指令、协处理器指令、杂项指令。 4)ARM指令有9种寻址方式: 寄存器寻址、立即寻址、寄存器偏移寻址、寄存器间接寻址、基址寻址、堆栈寻址 、多寄存器寻址、块拷贝寻址、相对寻址。

  14. 2.ARM指令格式 1) ARM处理器是基于RISC原理设计的. 2)具有32位ARM指令集和16位Thumb指令集 3)ARM指令集效率高,但是代码密度低 4)Thumb指令集具有更好的代码密度,却仍然保持ARM的大多数性能上的优势,它是ARM指令集的子集。

  15. 5)所有ARM指令都是可以有条件执行的,而Thumb指令仅有一条指令具备条件执行功能。 6)ARM程序和Thumb程序可相互调用,相互之间的状态切换开销几乎为零。

  16. ARM指令字长为固定的32位。一条典型的ARM指令编码格式如下: ARM指令的语法格式如下: <opcode>{<cond>}{S} <Rd>,<Rn>{,<opcode2>} 其中,符号“<>”内的项是必须的,符号“{}”内的项是可选的。

  17. <opcode>是指令操作码,是必须的,如ADDS,SUBNES等。<opcode>是指令操作码,是必须的,如ADDS,SUBNES等。 {<cond>}为指令执行条件码,是可选的,如EQ,NE等,如果不写则使用默认条件AL(无条件执行)。 S为是否影响CPSR寄存器的值,书写时影响CPSR,否则不影响。 Rd 为目标寄存器编码。 Rn 为第一个操作数的寄存器编码。 operand2 为第二个操作数。

  18. 3. ARM指令条件码 当处理器工作在ARM状态时,几乎所有的指令都就、根据CPSR中条件码的状态和指令的条件域有条件地执行。当指令的执行条件满足时,指令被执行,否则被忽略。

  19. 每一条ARM指令包含4位的条件码,位于指令的最高4位[31:28]。条件码共有16种,每种条件码可用两个字符表示,这两个字符可以加在指令助记符后面和指令同时使用。如:跳转指令B可以加上后缀EQ变为BEQ表示“相等则跳转”,即当CPSR中的Z标志置位时发生跳转。每一条ARM指令包含4位的条件码,位于指令的最高4位[31:28]。条件码共有16种,每种条件码可用两个字符表示,这两个字符可以加在指令助记符后面和指令同时使用。如:跳转指令B可以加上后缀EQ变为BEQ表示“相等则跳转”,即当CPSR中的Z标志置位时发生跳转。

  20. 对于 Thumb 指令集,只有 B 指令具有条件码执行功能,此指令条件码同表 3.3.1,但如果为无条件执行时,条件码助记符“AL”不能在指令中书写。

  21. 3.3 ARM指令的主要寻址方式 寻址方式:处理器根据指令中给出的(地址)信息,寻找操作数(物理地址)的方式。 将ARM指令系统的寻址方式分为9种,有的分为7种的等,下面介绍7种寻址方式:

  22. 1. 立即寻址 立即寻址也叫立即数寻址。 立即寻址概念:操作数本身就在指令中给出,只要取出指令也就取到了操作数。这个操作数被称为立即数,对应的寻址方式也就叫做立即寻址。 ADD R0,R0,#1; R0←R0+1 MOV R0 ,#0x3f ; R0←#0x3f 书写立即数时,要求以“#”为前缀。 十六进制数,#后加 0x或&,如 #0x3f,#&3f. 二进制数, #后加 0b, 如 #0b1011 十进制数, #后加 0d或缺省,如#0d678,#789

  23. 12 11 8 7 0 …… rot Immed_8 Shifter ROR immediate 在指令格式中,第二个操作数有12位: 因此有效立即数immediate可以表示成: <immediate>=immed_8 循环右移(2×rot) 4 bit 移位值 (0-15)乘于2,得到一个范围在0-30,步长为 2的移位值。 因此,将ARM中的立即数称为8位位图。 记住一条准则: “最后8位移动偶数位”得到立即数。

  24. 2. 寄存器寻址 寄存器寻址: ——利用寄存器中的数值作为操作数。 这种寻址方式是各类微处理器经常采用的一种方式,也是一种执行效率较高的寻址方式。 两种具体形式:寄存器寻址、寄存器移位寻址。 一、寄存器寻址 如指令: ADD R0,R1,R2 ;R0←R1+R2

  25. 二、寄存器移位寻址 1) 寄存器移位寻址 当第二操作数为寄存器型时,在执行寄存器寻址操作时,也可以对第二操作数寄存器进行移位,此时第二操作数形式为: MOV Rd, Rn, Rm,{<shift>} 其中: Rm 称为第二操作数寄存器

  26. <shift>用来指定移位类型和移位位数,有两种形式: • 5位立即数 (其值小于32) • 寄存器(用Rs表示) (其值小于32) 在指令执行时将寄存器移位后的内容作为第二操作数参与运算。例如指令: ADD R3,R2,R1,LSR #2;R3←R2+(R1右移2位) ADD R3,R2,R1,LSR R0;R3←R2+(R1右移R0位)

  27. 31 0 0 2)第二操作数移位方式 共有6种移位方式: • — LSL 逻辑左移 — LSR 逻辑右移 • — ASL 算术左移 — ASR 算术右移 • — ROR 循环右移 — RRX 带扩展的循环右移 (1)LSL:逻辑左移,空出的最低有效位用0填充。 (2) LSR:逻辑右移,空出的最高有效位用0填充。 31 0 0 SUB R3,R2,R1,LSL #2;R3←R2-(R1左移2位) SUB R3,R2,R1,LSR R0;R3←R2-(R1右移R0位)

  28. (3)ASL:算术左移,由于左移空出的有效位用0填充,因此它与LSL同义。(3)ASL:算术左移,由于左移空出的有效位用0填充,因此它与LSL同义。 (4)ASR:算术右移(Arithmetic Shift Right) 。算术移位的对象是带符号数,移位过程中必须保持操作数的符号不变。如果源操作数是正数,空出的最高有效位用0填充,如果是负数用1填充。 30 0 ADD R3,R2,R1,ASL #2 ;R3←R2+(R1左移2位) SUB R3,R2,R1,ASR R3 ;R3←R2-(R1算术右移R3位)

  29. (5)ROR:循环右移(Rotate Right),移出的字的最低有效位依次填入空出的最高有效位。 • 31 0 • (6)RRX:带进位位的循环右移(Rotate Right Extended) 。将寄存器的内容循环右移1位,空位用原来C标志位填充。 • 31 0 SUB R3,R2,R1,ROR #2 ;R3←R2+(R1循环右移2位) SUB R3,R2,R1,RRX R0 ;R3←R2-(R1带进位位循环右移R0位)

  30. 3)第二操作数的移位位数 移位位数可以用立即数方式或者寄存器方式给出,其值均小于32,应为0---31。 如下所示: ADD R3,R2,R1,LSR #2;R3R2+(R1右移2位) ADD R3,R2,R1,LSR R4;R3R2+(R1右移R4位) 寄存器R1的内容分别逻辑右移2位、R4位,再与寄存器R2的内容相加,结果放入R3中。

  31. 寄存器间接寻址 ——就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储单元中。例如以下指令: LDR R0,[R1] ;R0←[R1] STR R0,[R1] ;[R1]←R0 第一条指令将以R1的值为地址的存储单元中的内容加载到寄存器R0中。 第二条指令将R0的内容存储到以R1的值为地址的存储单元中。 R1—— 基址寄存器 R1的内容——基地址 3 . 寄存器间接寻址

  32. 20 19 16 15 12 11 31 28 27 0 Rn Rd Cond Opcode Offset 1) 变址寻址也叫基址加偏(变)址寻址 ——将基址寄存器的内容与指令中给出的地址偏移量相加,得到操作数所在的存储器的有效地址。 变址寻址方式常用于访问某基地址附近的地址单元。(4K) 4. 变址寻址 例如: LDR R0,[R1,#4] ;R0←mem32[R1+4]

  33. Pre-indexed: STR r0,[r1,#12] R0 偏移量 源 寄存器 0x05 12 0x05 0x20C R1 基址寄存器 0x200 0x200 2)偏移地址方式有三种加偏址的方式 (1)前变址模式(不修改基址寄存器): ——先基址+偏址,生成操作数地址,做指令指定的操作。 也叫前索引偏移。

  34. (2)自动变址模式(修改基址寄存器): • ——①先基址+偏移,生成操作数地址,做指令指定的操作。②然后自动修改基址寄存器。 • 例如: • LDR R0,[R1,#4]! ;R0←mem32 [R1+4] • ;R1←R1+4 • ! ——表示更新基址寄存器。

  35. 例Post-indexed: STR r0,[r1],#12 r1 r0 偏移量 更新基址寄存器 源 寄存器 0x5 0x20c 12 0x20c 0x5 原基址寄存器 r1 0x200 0x200 (3)后变址模式(修改基址寄存器): ——①基址寄存器不加偏移作为操作数地址。 ②完成指令操作后,用(基址+偏移)的值修改基址寄存器。 即先用基地址传数,然后修改基地址(基址+偏移),也叫后索引偏移。

  36. 3)偏移地址形式 可以是一个立即数,也可以是另一个寄存器,并且还可以是寄存器移位操作。如下所示: LDR r0,[r1,r2] ;r0<—mem32[r1+r2] LDR r0,[r1,r2,LSL #2];r0<—mem32[r1+r2*4] 常用的是立即数偏移的形式。

  37. 5 . 堆栈寻址 ——堆栈寻址是隐含的,它使用一个专门的寄存器(堆栈指针SP)指向一块存储区域(堆栈)。 堆栈可分为两种增长方式: 向上生长:向高地址方向生长,称为递增堆栈。 向下生长:向低地址方向生长,称为递减堆栈。

  38. 根据堆栈指针指向的数据位置的不同,可分为:根据堆栈指针指向的数据位置的不同,可分为: • 满堆栈 ——堆栈指针指向最后压入堆栈的有效数据项,称为满堆栈; • 空堆栈 ——堆栈指针指向下一个待压入数据的空位置,称为空堆栈。 这样就有4种类型的堆栈表示递增和递减的满和空堆栈的各种组合。

  39. 四种类型的堆栈工作方式 • 满递增堆栈FA( Full Ascending): ——堆栈指针指向最后压入的数据,且由低地址向高地址生长。 • 满递减堆栈FD: ——堆栈指针指向最后压入的数据,且由高地址向低地址生长。 • 空递增堆栈EA: ——堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生长。 • 空递减堆栈ED( Empty Descending): ——堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生长。

  40. STMFD sp!,{r4-r7,lr} 满递减 Old SP 100 FF A0BE 1234 r6 r5 r4 r7 100 A0BE FF 1234 LDMED sp!,{r4-r7,pc} 空递减 8034 A0BE 1234 高地址 FF 9753 9753 SP 100 8420 8420 1234 1234 pc pc 8034 9020 lr 8034 1010 1010 Old SP 8034 FFFF 8034 8034 r7 A0BE 16 A0BE AOBE r7 12 r6 1234 102E 1234 1234 r6 0 r5 FF FF 8765 FF r5 14544 r4 100 ABCD 100 100 r4 1 SP …… 8034

  41. 6. 块拷贝寻址 1)块拷贝寻址 ——把存储器中的一个数据块加载到多个寄存器中,或者是把多个寄存器中的内容保存到存储器中。 应用指令:块拷贝寻址是多寄存器传送指令LDM/STM的寻址方式,因此也叫多寄存器寻址。 块拷贝寻址操作中的寄存器,可以是R0-R15这16个寄存器的子集(一部分),或是所有寄存器。

  42. IA IB DA DB STMxx r10!, {r0,r1,r4} r4 r4 r1 地址 增加 r1 r0 基址寄存器 (Rn) r10 r0 r4 r1 r4 r0 r1 r0 2) 4种寻址操作 LDMIA / STMIA Increment After(先传送,后地址加4) LDMIB / STMIB Increment Before(先地址加4 ,后传送) LDMDA / STMDA Decrement After(先传送,后地址减4) LDMDB / STMDB Decrement Before (先地址减4,后传送) 地址递增,指针最后位置 地址递减,指针最后位置

  43. 多寄存器load和store指令的堆栈和块拷贝对照 STMFA(Full、After):栈满递增。F---栈满;A---递增 LDMIB*(Inc、Befor):块先增地址、再传数。

  44. 7. 相对寻址 —— 与基址变址寻址方式相类似,相对寻址以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。 相对寻址指令举例如下: BL SUBRl ;调用到SUBRl子程序 . . . ; SUBRl应为24位有符号数 SUBR1 … … MOV PC, LR ;返回

  45. 1.存储器访问指令 3.4 ARM指令系统 ARM微处理器用加载/存储指令访问存储器,实现在寄存器和存储器之间传送数据。加载指令用于将存储器中的数据传送到寄存器,存储指令则完成相反的操作。 由于ARM处理器对外设寄存器、I/O映射空间与存储器统一编址,因此,对外围设备的I/O操作也用此类指令。

  46. 基本的加载/存储指令仅有5条,分为3种: — LDR和STR,单寄存器加载/存储指令 — LDM和STM,多寄存器加载/存储指令 — SWP,寄存器和存储器数据交换指令

  47. 一、单寄存器的存取指令 单寄存器加载/存储指令是ARM在寄存器和存储器间传送单个字节和字的最灵活方式。 根据传送数据的类型不同,单个寄存器存取指令又可以分为以下两类: • 单字和无符号字节的加载/存储指令 • 半字和有符号字节的加载/存储指令

  48. 1)单字和无符号字节的加载/存储指令 • LDR: 指令从内存中取32位字或8位无符号字节数据放入寄存器; • STR: 指令将寄存器中的32位字或8位无符号字节数据保存到存储器中。 • 注意: • 无符号字节加载时,用0将8位的操作数扩展到32位。

  49. (1)指令格式 LDR{cond}{T} Rd,<地址> ;加载指定地址上的字数据,放入Rd中。 STR{cond}{T} Rd,<地址> ;存储Rd中字数据,到指定地址的存储单元。 LDR{cond}B{T} Rd,<地址> ;加载字节数据到Rd中, Rd最低字节有效, 高24位为0。 STR{cond}B{T} Rd,<地址> ;存储Rd中字节数据, Rd中最低字节为传送数据。

More Related