1 / 130

第四章 ARM 指令集

第四章 ARM 指令集. ARM 指令集概述 ARM 寻址方式 ARM 指令详细介绍 一些基本的 ARM 指令功能段. (一) ARM 指令集概述 1.1 ARM 指令分类 ARM 指令集总体分为 6 类指令 数据处理指令 :完成寄存器中数据的算术和逻辑运算操作。 程序状态寄存器处理指令 : mrs 和 msr 。 跳转指令 : b 和 bl 。 Load/Store 指令 :唯一用于寄存器和存储器之间进行数据传送的指令。 异常中断产生指令 : swi 和 bkpt 。 协处理器指令 。. 1.2 ARM 指令的特点: 所有指令都是 32bit 。

shilah
Télécharger la présentation

第四章 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指令集 • ARM指令集概述 • ARM寻址方式 • ARM指令详细介绍 • 一些基本的ARM指令功能段

  2. (一)ARM指令集概述 • 1.1 ARM指令分类 ARM指令集总体分为6类指令 • 数据处理指令:完成寄存器中数据的算术和逻辑运算操作。 • 程序状态寄存器处理指令:mrs和msr。 • 跳转指令:b和bl。 • Load/Store指令:唯一用于寄存器和存储器之间进行数据传送的指令。 • 异常中断产生指令:swi和bkpt。 • 协处理器指令。

  3. 1.2 ARM指令的特点: • 所有指令都是32bit。 • 大多数指令都在单周期内完成。 • 所有指令都可以条件执行。 • load/store体系结构。 • 指令集可以通过协处理器扩展

  4. 31 28 27 25 24 21 20 19 16 15 12 11 8 7 0 Cond 001 Opcode S Rn Rd Operand2 • 1.3 ARM指令的格式 • 一条典型的ARM指令编码格式为: 一条典型的ARM指令语法格式为: <Opcode>{<cond>}{s} <Rd>, <Rn>{, <Operand2>} • Opcode:指令操作码。 • cond:指令的条件码。 • S:决定指令的操作是否影响cpsr的值。 • Rd:目标寄存器编码。 • Rn:包含第一个操作数的寄存器编码。 • Operand2:第2操作数。 例:ADDS R2,R1,#1 SUBNES R2,R1,#0x20 LDR R0,[R1]

  5. 1.4 条件执行 • 每条ARM指令包含4位条件码域< cond >,它占用指令编码的最高四位[31:28]。 • 条件编码共 24=16 种,其中,15种用于指令的条件码。每种条件码用2个英文缩写字符表示。(见P.101 表3-1) • ARM处理器根据指令的执行条件是否满足,决定当前指令是否执行。 • 只有在cpsr中的条件标志位满足指定的条件时,指令才会被执行。不符合条件的代码依然占用一个时钟周期(相当于一个NOP指令)。 • 书写时,条件码的位置在指令助记符的后面(因此也称为条件后缀。),例如: • MOVEQ R0, R1; • 指令条件后缀如下表所示:(见P.101 表3-1)

  6. 从不(未使用) NV

  7. R1减1,并设置标志位 如果 Z标志清零则跳转 • 默认情况下,数据处理指令不影响条件码标志位,但可以选择通过添加“S”来影响标志位。 CMP不需要增加 “S”就可改变相应的标志位。 loop … SUBS r1,r1,#1 BNE loop

  8. (二)ARM寻址方式 • 寻址方式: • 根据指令编码中给出的地址码字段来寻找真实操作数的方式。 立即寻址 寄存器寻址 寄存器间接寻址 基址加偏址寻址 堆栈寻址 块拷贝寻址 相对寻址

  9. 立即寻址 ——操作数本身在指令中直接给出(立即数由指令的后12位给定),这个操作数被称为立即数,对应的寻址方式也就叫做立即寻址。 例如以下指令: ADD R0,R0,#1;R0←R0+1 MOV R0,#0x3f;R0←#0x3f • 书写立即数时,要求以“#”为前缀。 • 十六进制数,#后加 0x或&,如 #0x3f,#&3f. • 二进制数,#后加 0b, 如 #0b1011 • 十进制数,#后加 0d或缺省,如#0d678,#789 • 如何构造32位立即数? • 2.1 立即寻址

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

  11. 例: 31 7 0 ror #0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ror #8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ror #30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 下列命令中,汇编器把立即数转换为移位操作: MOV r0,#4096 ; uses 0x40 ror 26 ADD r1,r2,#0xFF0000 ; uses 0xFF ror 16 带有立即数的MOV 指令的二进制编码为: MOV R0,0xF200 ;E3A00CF2 MOV R1,0x110000 ;E3A01811 MOV R4,0x12800 ;E3A04B4A 0xF200 =0xF2循环右移(2*C) 0x110000 =0x11循环右移(2*8) 0x12800 =0x4A循环右移(2*B)

  12. 只有能够通过此构造方法得到的才是合法的立即数。只有能够通过此构造方法得到的才是合法的立即数。 • 合法立即数: • 0xFF;0x104;0xFF0;0xFF00 • 非法立即数: • 0x101;0x102;0xFF1 • 一个合法的立即数可能有多种编码方法,将使某些指令的执行产生不同的结果。 0x3F0 immed_8=0x3F,rot=0xE immed_8=0xFC,rot=0xF ARM汇编编译器生成立即数的规则为: • 当立即数数值在0到0xFF范围时,令immed_8=<immediate>,rot=0。 • 其它情况下,汇编编译器选择使rot数值最小的编码方式。

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

  14. 寄存器移位寻址 ——当第二操作数为寄存器型时,在执行寄存器寻址操作时,可以选择是否对第二操作数进行移位,即第二操作数形如: MOV Rd, Rn, Rm,{<shift>} 其中: Rm 称为第二操作数寄存器 <shift> 用来指定移位类型和移位位数。移位 位数可以用5位立即数<#shift>或寄存 器(Rs)方式。

  15. 在指令执行时将寄存器移位后的内容作为第二操作数参与运算。例如指令:在指令执行时将寄存器移位后的内容作为第二操作数参与运算。例如指令: • ADD R3,R2,R1,LSR #2;R3←R2+(R1右移2位) • ADD R3,R2,R1,LSR R0;R3←R2+(R1右移R0位)

  16. 第二操作数移位方式 • LSL:逻辑左移,空出的最低有效位用0填充。 • LSR:逻辑右移,空出的最高有效位用0填充。 31 0 0 31 0 0

  17. ASL:算术左移,由于左移空出的有效位用0填充,因此 它与LSL同义。 • ASR:算术右移 (Arithmetic Shift Right) 。算术移位的对象是带符号数,移位过程中必须保持操作数的符号不变。如果源操作数是正数,空出的最高有效位用0 填充,如果是负数用1填充。 30 0

  18. ROR:循环右移(Rotate Right),移出的字的最低有效位依次填入空出的最高有效位。 31 0 • RRX:带扩展的循环右移(Rotate Right Extended) 。将寄存器的内容循环右移1位,空位用原来C标志位填充。 31 0

  19. 第二操作数的移位位数 移位位数可以用立即数方式或者寄存器方式给出, 如下所示: 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中。

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

  21. 基址加偏址寻址 • ——将基址寄存器的内容与指令中给出的地址偏移量相加,得到操作数所在的存储器的有效地址。 • 变址寻址方式常用于访问某基地址附近的地址单元。(4K) • 2.4 基址加偏址寻址(变址寻址) 例如: LDR R0,[R1,#4] ;R0←mem32[R1+4]

  22. 有三种加偏址的方式: • 前变址模式(不修改基址寄存器): • ——先基址+偏址,生成操作数地址,做指令指定的操作。 • Pre-indexed: STR r0,[r1,#12] r0 偏移量 源寄存器for STR 0x5 12 0x5 0x20c r1 基址寄存器 0x200 0x200

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

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

  25. 偏移地址 • ——可以是一个立即数,也可以是另一个寄存器,并且在加到基址寄存器前还可以经过移位操作,如下所示: • LDRr0,[r1,r2] ;r0<—mem32[r1+r2] • LDRr0,[r1,r2,LSL #2] ;r0<—mem32[r1+r2*4] • 常用的是立即数偏移的形式。

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

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

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

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

  30. 2.6块拷贝寻址 • 块拷贝寻址 • ——把存储器中的一个数据块加载到多个寄存器中,也可以把多个寄存器中的内容保存到存储器中。是多寄存器传送指令LDM/STM的寻址方式。 • 寻址操作中的寄存器可以是R0-R15这16个寄存器的子集或是所有寄存器。

  31. 4 中寻址操作: LDMIA / STMIAIncrement After(先传送,后地址加4) LDMIB / STMIBIncrement Before(先地址加4 ,后传送) LDMDA / STMDADecrement After (先传送,后地址减4) LDMDB / STMDBDecrement Before (先地址减4,后传送) IA IB DA DB STMxx r10, {r0,r1,r4} r4 r4 r1 地址 增加 r1 r0 基址寄存器 (Rb) r10 r0 r4 r1 r4 r0 r1 r0

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

  33. (三) ARM指令详细介绍 • 数据处理指令; • Load/Store指令; • 程序状态寄存器处理指令; • 跳转指令; • 异常中断产生指令; • 协处理器指令。

  34. 3.1 数据处理指令 • ARM的数据处理指令主要完成寄存器中数据的算术和逻辑运算操作。 • ARM数据处理指令的特点: • 所有的操作数要么来自寄存器,要么来自立即数,不会来自存储器。 • 如果有结果,则结果一定是为32位宽,并且放在一个寄存器中,不会写入存储器。(有一个例外:长乘法指令产生64位结果) • 每一个操作数寄存器和结果寄存器都在指令中独立指出,即:ARM指令采用3地址模式: <Operation> Rd, Rn, Rm

  35. ARM数据处理指令大致可分为6类: • 算术运算指令: ADD ADC SUB SBC RSB RSC • 逻辑运算指令: AND ORR EOR BIC • 数据传送指令: MOV MVN • 比较指令: CMP CMN • 测试指令: TST TEQ • 乘法指令:MUL MLA UMULL UMLAL SMULL SMLAL • 上述指令只能对寄存器操作,不能针对存储器。

  36. 后缀s • 数据处理指令可以选择s后缀,以影响状态标志。但是比较指令(cmp、cmn、tst和teq)不需要后缀s,它们总会直接影响cpsr中的状态标志。 • 在数据处理指令中,除了比较指令以外,其它的指令如果带有s后缀,同时又以pc为目标寄存器进行操作,则操作的同时从spsr恢复cpsr。比如: • movs pc, #0xff /* cpsr = spsr; pc = 0xff */ • adds pc, r1, #0xffffff00 /* cpsr = spsr; pc = r1 + 0xffffff00 */ • ands pc, r1, r2 /* cpsr = spsr; pc = r1 & r2; */ • 如果在user或者system模式下使用带有s后缀的数据处理指令,同时以pc为目标寄存器,那么会产生不可预料的结果。因为user和system模式下没有spsr。

  37. 当选择后缀S时: • 如果结果为负,则N标志位置1;否则清0。 • 如果结果为0,则Z标志位置1;否则清0。 • 如果是算术运算指令或比较指令时,C标志位设置为ALU的进位输出;否则设置为移位器的进位输出。如果不需要移位,则C保持不变。 • 在非算术操作中,V标志位保持原值。在算术操作中,如果有溢出,则置1;不发生溢出,则清0。

  38. 操作数2 操作数1 BarrelShifter ALU 结果

  39. 数据处理指令的二进制编码如下: add r0, r1, #0xff add r0, r1, r1, LSL #31 add r0, r1, r1, LSL r2

  40. 操作码[24:21] 助记符 意义 效果 0000 AND 逻辑位与 Rd = Rn AND Op2 0001 EOR 逻辑位异或 Rd = Rn EOR Op2 0010 SUB 减 Rd = Rn - Op2 0011 RSB 反向减 Rd = Op2 – Rn 0100 ADD 加 Rd = Rn + Op2 0101 ADC 带进位加 Rd = Rn + Op2 + C 0110 SBC 带进位减 Rd = Rn - Op2 + C -1 0111 RSC 反向带进位减 Rd = Op2 - Rn + C -1 1000 TST 测试 根据Rn AND Op2设置条件码 1001 TEQ 测试相等 根据Rn EOR Op2设置条件 1010 CMP 比较 根据Rn - Op2设置条件码 1011 CMN 负数比较 根据Rn + Op2设置条件码 1100 ORR 逻辑位或 Rd = Rn OR Op2 1101 MOV 传送 Rd = Op2 1110 BIC 位清零 Rd = Rn AND NOT Op2 1111 MVN 求反 Rd = NOT Op2 • 数据处理指令的详细列表如下:

  41. ① ADD——加法运算指令 ADD指令将operand2的数据与Rn的值相加,结果保存到Rd寄存器。    指令格式如下: ADD{cond}{S} Rd,Rn,operand2 指令举例如下: ADDS R1,R1,#1       ;R1=R1+1 ADDS R3,R1,R2,LSL #2  ; R3=R1+R2<<2 • 算术运算指令:

  42. ② ADC——带进位加法指令 ADC指令将operand2的数据与Rn的值相加,再加上CPSR中的C条件标志位,结果保存到Rd寄存器。指令格式如下: ADC{cond}{S} Rd,Rn,operand2 指令举例如下: ADDS R4,R0,R2 ;使用ADC实现64位加法, ADC R5,R1,R3 ;(R5、R4)=(R1、R0)+(R3、R2)

  43. ③SUB——减法运算指令 SUB指令用寄存器Rn减去operand2,结果保存到Rd中。 指令格式如下: SUB{cond}{S} Rd,Rn,operand2 指令举例如下: SUBS R0,R0,#l ;R0=R0-1 SUB R6,R7,#0x10 ;R6=R7-0x10

  44. ④SBC——带进位减法指令 SBC指令用寄存器Rn减去operand2,再减去CPSR中的C条件标志位的反码,结果保存到Rd中。 指令格式如下: SBC{cond}{S} Rd,Rn,operand2 指令举例如下: SUBS R4,R0,R2 ;使用SBC实现64位减法, SBC R5,R1,R3 ;(R5,R4)=(R1,R0)-(R3,R2)

  45. ⑤ RSB——反向减法指令 RSB指令用寄存器operand2减去Rn,结果保存到Rd中。 指令格式如下: RSB{cond}{S} Rd,Rn,operand2 指令举例如下: RSB R3,R1,#0xFF00 ;R3=0xFF00-R1 RSBS R1,R2,R2,LSL #2 ;R1R2<<2-R2 ;(R1 =R2×3)

  46. ⑥ RSC——带进位反向减法指令 • RSC 指令用寄存器operand2减去Rn,再减去CPSR中的C条件标志位的反码,结果保存到Rd中。 • 指令格式如下: • RSC{cond}{S} Rd,Rn,operand2 • 指令举例如下: • RSBS R2,R0,#0 • RSC R3,R1,#0 ;使用RSC指令实现 ;求64位数值的负数

  47. 逻辑运算指令: ①AND——逻辑“与”操作指令 AND指令将operand2的值与寄存器Rn的值按位逻辑“与”操作,结果保存到Rd中。 指令格式如下: AND{cond}{S} Rd,Rn,operand2 指令举例如下: ANDS R0,R0,#0x01 ;R0=R0&0x01 ;取出最低位数据 AND R2,R1,R3 ;R2=R1&R3 AND指令可用于提取寄存器中某些位的值。

  48. ②ORR——逻辑“或”操作指令 ORR指令将operand2的值与寄存器Rn的值按位逻辑“或”操作,结果保存到Rd中。 指令格式如下: ORR{cond}{S} Rd,Rn,operand2 指令举例如下: ORR R0,R0,#0x0F ;将R0的低4位置1 ORR指令用于将寄存器中某些位的值设置成1。

  49. ③EOR——逻辑“异或”操作指令 EOR指令将operand2的值与寄存器Rn的值按位逻辑“异或”操作,结果保存到Rd中。 指令格式如下: EOR{cond}{S} Rd,Rn,operand2 指令举例如下: EOR R1,R1,#0x0F ;将Rl的低4位取反 EORS R0,R5,#0x01 ;将R0R5异或0x01, ;并影响标志位 EOR指令可用于将寄存器中某些位的值取反。将某一位与0异或,该位值不变;与1异或,该位值被求反。

More Related