690 likes | 887 Views
回 顾. 第六章 ARM 基本指令集与寻址介绍. 6.1 指令集的特征与功能 6.2 ARM 寻址方式 6.3 ARM 指令集编码格式 6.4 Thumb 指令集. 6.1 指令集的特征与功能. 1 指令概念. 机器指令( machine instruction ) 指令集 ( Instruction Set ). 取指令. 取操作数. 存操作数. 多操作数. 多结果. 指令地址 计算. 指令译码. 操作数 地址 计算. 数据操作. 操作数 地址 计算. 指令完成取下一条. 2. 机器指令要素.
E N D
第六章 ARM基本指令集与寻址介绍 • 6.1 指令集的特征与功能 • 6.2 ARM寻址方式 • 6.3 ARM指令集编码格式 • 6.4 Thumb指令集
1 指令概念 • 机器指令(machine instruction) • 指令集 (Instruction Set)
取指令 取操作数 存操作数 多操作数 多结果 指令地址 计算 指令译码 操作数 地址 计算 数据操作 操作数 地址 计算 指令完成取下一条 2. 机器指令要素 • 每一个机器指令必须包含CPU执行所需的全部信息 CPU访问存储器或I/O CPU内部操作
2. 机器指令要素 做何操作? • 操作码 (opcode) • 源操作数引用 • 结果操作数引用 • 下一指令引用 对谁做此操作? 如何寻找被操作数据的寄存器或存储器位置? 完成后到哪里去取下一个操作?
指令格式有多种表示形式:定长,变长,混合长度指令格式有多种表示形式:定长,变长,混合长度 对于32位RISC处理器,一般采用定长格式的32位二进制码。 3. 机器指令的表示方法—指令格式
4. 机器指令的表示方法 • 采用符号表示法来描述机器指令 e.g. ADD, SUB,Load,Store。 • 由编译器完成符号→二进制的转换
指令集必须充分,应允许用户表达任何处理任务,可以表示任何高级语言的指令形式。指令集必须充分,应允许用户表达任何处理任务,可以表示任何高级语言的指令形式。 E.g.一行简单程序: X = X + Y 设: X的内存位置513; Y的内存位置514; 5. 指令类型 1.将内存513位置的值放入寄存器reg_x; Load 2.将内存514的值放到另一寄存器reg_y; Load 3.将reg_y加到reg_x,将结果放入reg_x;ADD 4.将结果值存入内存513位置; Store
7. 指令集设计的关键环节 • 指令集设计是计算机设计最有影响的方面 • 基本设计出发点 • 操作指令表 • 数据类型 • 指令格式 • 寄存器 • 寻址方式 应提供多少和怎样的操作? 对几种数据类型完成操作? 8位字节?32位字?64位双字? 指令位长度,地址数目,各字段大小 CPU寄存器数目以及其用途 指定操作数产生的方式
8. 操作数类型 • 地址 • 无符号整数32位 • 数值 • 整数或定点数 • 浮点数 • 十进制数 BCD(Binary Coded Decimal) • 字符 • ASCII码 • 逻辑数据
10. 汇编语言 -举例 • 用机器语言编程语句 N = I + J + K
1. 寻址方式的考虑 • 为什么要采用多种寻址方式? • 基本寻址方式: • 立即寻址 • 直接寻址 • 间接寻址 • 寄存器寻址 • 寄存器间接寻址 • 偏移寻址 • 堆栈寻址
2. RISC体系采用的指令集结构ISA • 有两种ISA: • Register-memory • Register-Register • RISC采用Register-Regiter(Load-Store)
操作数直接通过指令给出,数据包含在32位指令编码中。操作数直接通过指令给出,数据包含在32位指令编码中。 32位有效立即数通过循环右移偶数位而间接得到 举例 ADD R0,R0,#1 AND R8,R7,#0xFF MOV R1,#0x00012800 1. 立即寻址
利用寄存器中的数值作为操作数,指令中的地址码给出的是寄存器名利用寄存器中的数值作为操作数,指令中的地址码给出的是寄存器名 第二操作数位寄存器型时,可以选择对第二操作数进行移位 举例 ADD R0,R1,R2 ADD R3,R2,R1,LSR #2 ADD R3,R2,R1,LSR R4 2. 寄存器寻址 LSL,LSR,ASL,ASR,ROR,RRX
ARM的数据传送指令都是基于寄存器间接寻址,通过Load/Store完成对数据的操作。ARM的数据传送指令都是基于寄存器间接寻址,通过Load/Store完成对数据的操作。 举例 LDR R0,[R1] STR R0,[R1] 3. 寄存器间接寻址 R0 ← mem32[R1] R0 → mem32[R1]
将基址寄存器的内容与指令中给出的偏移量相加,形成存储器的有效地址,用于访问基址附近的存储器单元。将基址寄存器的内容与指令中给出的偏移量相加,形成存储器的有效地址,用于访问基址附近的存储器单元。 偏移量不超过4KB(指令编码中Offset 为12位) 前变址,后变址,自动变址三种模式 寄存器间接寻址实际是偏移量为0的基址加偏址寻址 举例 LDR R0,[R1,#4] LDR R0,[R1,#4]! LDR R0,[R1 ] ,#4 LDR R0,[R1,R2] LDR R0,[R1,R2,LSL,#2] LDRB R0,[R1] LDRH R1,[R0,#20] 4. 基址加偏址寻址(变址寻址) 前变址: R0 ←Mem32[R1+4]; 自动变址: R0 ←Mem32[R1+4 ] ; R1←R1+4 后变址: R0 ←Mem32[R1]; R1 ←R1+4; 半字传送: R1 ←Mem16[R0+20] 字节传送: R0 ←Mem8[R1]
Stack是用于保存数据的一块连续内存,按照FIFO或FILO顺序存取Stack是用于保存数据的一块连续内存,按照FIFO或FILO顺序存取 指向堆栈的地址寄存器成为堆栈指针(SP) 对堆栈的访问通过堆栈指针R13指向堆栈区域来实现 举例 STMFD SP!{R1-R7,LR} LDMFD SP!{R1-R7,LR} 5. 堆栈寻址
是多寄存器传送指令LDM/STM的寻址方式,可以把内存中的数据块加载到多个寄存器中去。是多寄存器传送指令LDM/STM的寻址方式,可以把内存中的数据块加载到多个寄存器中去。 LDM/STM根据其后缀名,其寻址方式有所不同 LDM/STM的后缀选择 举例 STMIA R9!,(R0,R1,R5) STMIB R9!,(R0,R1,R5) STMDA R9!,(R0,R1,R5) STMDB R9!,(R0,R1,R5) 6. 块拷贝寻址
可以认为是基址为PC的变址寻址,偏移量给出了目的地址于现行指令之间的相对位置。可以认为是基址为PC的变址寻址,偏移量给出了目的地址于现行指令之间的相对位置。 举例 BL SUBR 。。。。。。 SUBR MOV PC,R14 7. 相对寻址 转移到SUBR 子程序入口地址 返回
2. ARM指令编码 • ARM指令编码格式 • ARM条件编码格式
3. 基本指令格式 {<cond>} <opcode> {S} <Rd>,<Rn> {,<operand2>} 指令助记符 可选后缀,可根据指令结果更新CPSR条件码 第2操作数 可选条件码; 指令执行条件 Rd:目标寄存器; Rn:第一操作数寄存器
3. 基本指令格式举例 条件执行减法: R2 ←R1-0x20; 执行条件NE,影响CPSR的标志位 读取R1地址上的内容,执行条件AL(总是) • LDR R0,[R1] • BEQ DATAEVEN • ADDS R2,R1,#1 • SUBNES R2,R1,#0x20 加法指令:R2←R1+1; 影响CPSR的标志位 条件执行分支指令,执行条件EQ, 即相等则跳转
4.1 乘法指令 • 完成2个寄存器的数据相乘。按照结果位宽可分成两类: • 64位结果; • 仅保留最低有效32位。 • 2种类型都有“乘-累加”变形,即将成绩连续相加成总和,且适用于无符号和有符号数 • 乘法指令举例
4.2 Load/Store 指令 • ARM处理器是Load/Store型的。 • 将数据从存储器中调入寄存器中进行处理; • 处理完成后经过寄存器将结果存回到存储器中 • I/O功能是通过存储器映射的可循之外围寄存器和终端输入的组合来实现。 • 在存储器映射系统中,外设中的寄存器被映射为存储器的地址,对这些寄存器的操作方法与对存储器的操作相同 • 处理器对外设的操作也是适用Load/Store指令通过类似存储器操作来完成。
4.2.1 单寄存器存取指令 • LDR/STR • 传送的数据可以是8位字节、16位半字或32位字 • 可以适用7种寻址方式; • 可以适用自动变址寻址方式(硬件支持) • 指令格式 • 前变址: LDR|STR {<cond>} {B} Rd,[Rn,<offset>] {!} • 后变址 LDR|STR {<cond>} {B} {T} Rd,[Rn],<offset> • 相对PC变址 LDR|STR {<cond>} {B} Rd, LABEL B表示传送无符号字节还是字。缺省B=0为传送字 T标志位只能在非用户模式即特权模式下使用。作用是选择用户角度的存储器变换系统 LDR/STR 举例
4.2.2 多寄存器存取指令 • LDM/STM • 可用一条指令将16个可见寄存器的任意子集存储到内存或者相反。 • 寻址模式受到限制 • LDM/STM的两种用途 • 可允许OS加载或存储用户模式寄存器来保护和恢复用户处理状态(保存作业现场); • 可作为异常处理返回的一部分,完成从SPSR中恢复CPSR。 • 多寄存器存取指令形式 • 指令举例
4.3 状态寄存器与GPRs之间的 传送 • MSR/MRS • PSW到GPRs的传送指令MRS; • GPRs 到PSW的传送指令MSR; • 修改PSW一般是通过“读-修改-写”3个步骤来完成。 • 不能通过该指令直接修改CPSR中的T位直接将程序状态切换到Thumb状态,而是必须通过BX指令完成状态切换。
4.4 异常中断产生指令 • SWI指令用于产生SWI异常中断,可以实现在用户模式下对OS中特权模式的程序调用。 • SWI代表“软件中断”,用户可通过其调用系统例程,又被称为监控调用。 • 它将处理器至于SVC监控模式,从0x08开始执行指令。 • 指令格式与举例 • BKPT用于产生软件断点,供调试程序使用。 • 用于软件调试,使处理器停止执行正常指令而进入相应的调试程序。
2. Thumb指令集特点 • 16位指令编码 • 压缩指令,在ARM的Pipeline中先动态解压,再作为标准32位ARM指令执行 • CPSR[5]位T决定指令流类型:T=1则Thumb; • Thumb指令集没有协处理器、信号量、乘加、64位乘、状态寄存器等指令; • 指令均为无条件执行,只有B指令除外; • 采用2地址格式的数据处理指令;
Thumb指令使用: • Thumb指令功能受限,除非有严格的指令空间的要求,一般很少使用。
10. 汇编语言 -举例 • 用机器语言编程语句 N = I + J + K 假设: • I,J,K变量初始化为2,3,4; • N, I,J,K 4个变量的存储位置从0x201处开始; • 程序从位置0x101处开始,由4条指令组成: • 将位置201的内容装入AC; • 将位置202的内容加到AC; • 将位置203的内容加到AC; • 将AC的内容存入位置204;
8. 汇编语言 -举例 二进制→16进制 符号程序 汇编程序
1. 寻址方式的考虑 • 指令格式中的地址字段通常是非常有限的,希望能够大范围的访问主存或虚拟存储器。为了实现此目标,采用了各类寻址技术。 • 各类寻址技术都涉及到如下两方面的权衡: • 地址范围和寻址灵活性; • 存储器引用数与地址计算的复杂性;
2. 几种基本的寻址方式 • 立即寻址 指 令 Opcode 操作数
2. 几种基本的寻址方式 • 直接寻址 指 令 Opcode A 存储器 操作数
2. 几种基本的寻址方式 • 间接寻址 指 令 Opcode A 存储器 操作数