计算机组成和体系结构第五讲

2020-03-23 206浏览

  • 1.计算机组成和体系结构 第五讲 四川大学网络空间安全学院 2020年3月23日 封面来自arm.com 1
  • 2.版权声明 课件中所使用的图片、视频等资源版权归原作者所有。 课件原创内容采用 创作共用署名-非商业使用-相同方 式共享4.0国际版许可证(Creative Commons BY-NC-SA 4.0 International License) 授权使用。 Copyright@四川大学网络空间安全学院计算机组成与体系结构课程组,2020 2
  • 3.上期内容回顾 概论 初识计算机系统、计算机发展历史、计算机层次化结构、冯诺依曼模型及非冯诺依 曼模型 数字电子技术基础 计算机系统中数字的表示、布尔代数运算符、常见组合逻辑电路和时序电路 计算机体系结构 CPU结构(寄存器、算术逻辑单元、总线、时钟)、内存、I/O和中断 一个简化的计算机体系结构MARIE 数据通路的构成、指令集的编码和寻址、寄存器传输表示、MARIE汇编语言、控制 信号和加入信号模式的寄存器传输表示 前四章内容各部分之间的联系 3
  • 4.本期学习目标 学习内容:教材第5章“仔细审视指令集架构” 进一步加深理解指令集在整个计算机系统中的重要作用 初步掌握正确解读现有指令集的方法 初步了解指令集设计的方法 教材5.2节指令格式 学习掌握指令格式设计中需要考虑的因素和现有的解决方案 教材5.3节指令类型 学习掌握常见的指令类型 教材5.4节寻址 学习掌握常见的寻址类型 4
  • 5.中英文缩写对照表 英文缩写 英文全称 中文全称 ISA Instruction Set Architecture 指令集架构 GPR General-purpose Register 通用寄存器 RISC Reduced Instruction Set Computer 精简指令集计算机 RPN Reverse Polish Notation 逆波兰式(后缀表达式) 5
  • 6.指令集架构 6.1
  • 7.引言Q1:指令集架构包含哪些内容Q2:为什么要学习指令集架构 6.2
  • 8.引言Q1:指令集架构包含哪些内容 指令集架构(Instruction Set Architecture, ISA) 包含了一个计算机体系结构所有指令构成的 集合,以及这些指令的编码方法。Q2:为什么要学习指令集架构 x86指令集 图片来源:https://www.computing.dcu.ie/~humphrys/Notes/OS/hardware.html6.2
  • 9.引言Q1:指令集架构包含哪些内容 指令集架构(Instruction Set Architecture, ISA) 包含了一个计算机体系结构所有指令构成的 集合,以及这些指令的编码方法。Q2:为什么要学习指令集架构 指令集 是计算机系统中软硬件的接口 了解指令集架构有助于理解CPU的设计 6.2
  • 10.引言Q1:指令集架构包含哪些内容 指令集架构(Instruction Set Architecture, ISA) 包含了一个计算机体系结构所有指令构成的 集合,以及这些指令的编码方法。Q2:为什么要学习指令集架构 指令集 是计算机系统中软硬件的接口 了解指令集架构有助于理解CPU的设计和如何 设计CPU 6.2
  • 11.指令集设计决策 我们用MARIE的指令作为例子,分析指令集设计需要考虑的因素 16位固定长度的指令 15条指令,对应4位固定长度操作码 最多有一个12位显式操作数 算术逻辑单元输入来自AC寄存器和内 存(MBR寄存器) 支持内存的直接寻址和间接寻址 6.3
  • 12.指令集设计决策 我们用MARIE的指令作为例子,分析指令集设计需要考虑的因素 16位固定长度的指令 15条指令,对应4位固定长度操作码 最多有一个12位显式操作数 算术逻辑单元输入来自AC寄存器和内 存(MBR寄存器) 支持内存的直接寻址和间接寻址 指令的长度(表示一条指令需要的比特数 以及是否是固定值) 6.3
  • 13.指令集设计决策 我们用MARIE的指令作为例子,分析指令集设计需要考虑的因素 16位固定长度的指令 15条指令,对应4位固定长度操作码 最多有一个12位显式操作数 算术逻辑单元输入来自AC寄存器和内 存(MBR寄存器) 支持内存的直接寻址和间接寻址 指令的长度(表示一条指令需要的比特数 以及是否是固定值) 指令类型的数量以及如何对指令类型进行 编码 6.3
  • 14.指令集设计决策 我们用MARIE的指令作为例子,分析指令集设计需要考虑的因素 16位固定长度的指令 15条指令,对应4位固定长度操作码 最多有一个12位显式操作数 算术逻辑单元输入来自AC寄存器和内 存(MBR寄存器) 支持内存的直接寻址和间接寻址 指令的长度(表示一条指令需要的比特数 以及是否是固定值) 指令类型的数量以及如何对指令类型进行 编码 操作数的类型、数量和对应的数据范围 6.3
  • 15.指令集设计决策 我们用MARIE的指令作为例子,分析指令集设计需要考虑的因素 16位固定长度的指令 15条指令,对应4位固定长度操作码 最多有一个12位显式操作数 算术逻辑单元输入来自AC寄存器和内 存(MBR寄存器) 支持内存的直接寻址和间接寻址 指令的长度(表示一条指令需要的比特数 以及是否是固定值) 指令类型的数量以及如何对指令类型进行 编码 操作数的类型、数量和对应的数据范围 指令操作数的存储 6.3
  • 16.指令集设计决策 我们用MARIE的指令作为例子,分析指令集设计需要考虑的因素 16位固定长度的指令 15条指令,对应4位固定长度操作码 最多有一个12位显式操作数 算术逻辑单元输入来自AC寄存器和内 存(MBR寄存器) 支持内存的直接寻址和间接寻址 指令的长度(表示一条指令需要的比特数 以及是否是固定值) 指令类型的数量以及如何对指令类型进行 编码 操作数的类型、数量和对应的数据范围 指令操作数的存储 指令集架构支持的内存寻址方式 6.3
  • 17.指令集的评价指标 6.4
  • 18.指令集的评价指标 指令执行效率 6.4
  • 19.指令集的评价指标 指令执行效率 指令和操作数读取效率 6.4
  • 20.指令集的评价指标 指令执行效率 指令和操作数读取效率 指令通过流水线(Pipeline)执行的效率 6.4
  • 21.指令集的评价指标 指令执行效率 指令和操作数读取效率 指令通过流水线(Pipeline)执行的效率 实现同样的运算需要的指令数量 6.4
  • 22.指令集的评价指标 指令执行效率 指令和操作数读取效率 指令通过流水线(Pipeline)执行的效率 实现同样的运算需要的指令数量 指令译码复杂度(控制单元电路实现复杂度) 6.4
  • 23.指令集的评价指标 指令执行效率 指令和操作数读取效率 指令通过流水线(Pipeline)执行的效率 实现同样的运算需要的指令数量 指令译码复杂度(控制单元电路实现复杂度) 可寻址空间的大小 6.4
  • 24.常见设计决策及特点 采用短指令提高指令的读取和译码性能,限制了指令 类型的数量,对操作数的个数和大小有更严格的要求 定长指令的译码相对容易但是浪费了存储空间 扩展操作码可以充分利用定长指令的存储空间从而表 示更多的指令类型,同时可能降低指令长度 按照字长寻址的内存难以存取单个字节,大多数现有 体系结构采用按字节寻址 6.5
  • 25.多字节存储方式Q:如何用字节寻址的内存存储字?A:大端存储和小端存储 端(Endianness)代表了计算机中存储多字节数据的顺序 小端(Little Endian):低位有效字节存储在低位地址 大端(Big Endian):低位有效字节存储在高位地址 假设字长为32,一个地址为𝑥的字𝑏� 𝑏� 𝑏� 𝑏� 存储单元排列如下: 地址 𝑥 𝑥+1 𝑥+2 𝑥+3 小端存储 𝑏� 𝑏� 𝑏� 𝑏� 大端存储 𝑏� 𝑏� 𝑏� 𝑏� 6.6
  • 26.大端存储和小端存储实例 假设字长为32, 初始地址为0x200, 连续三个无符号整数 0xABCD1234、0x00FF4321和0x10的内存存储情况如下: 6.7
  • 27.大端存储和小端存储总结 大端存储和小端存储代表的字节顺序而不是位顺序 大端存储的优缺点: 更加自然:字节顺序和地址顺序一致 可以快速确定数字的符号(符号位在最低地址) 字符串的存储顺序和整数一致:"ABC" = 0x41 0x42 0x43 => 0x414243 小端存储的优缺点 高位数字转为低位数字更方便:32位数字 0x12345678和低16位0x5678的地址是一样的 6.8
  • 28.CPU内部的数据存储 6.9
  • 29.CPU内部的数据存储 堆栈型架构:操作数隐式放置在一个堆栈中 6.9
  • 30.CPU内部的数据存储 堆栈型架构:操作数隐式放置在一个堆栈中 累加器型架构:当指令对应的运算包含两个操作数 时,其中一个操作数隐式放置在累加器寄存器中 6.9
  • 31.CPU内部的数据存储 堆栈型架构:操作数隐式放置在一个堆栈中 累加器型架构:当指令对应的运算包含两个操作数 时,其中一个操作数隐式放置在累加器寄存器中 通用寄存器型架构:操作数可以保存在寄存器中 6.9
  • 32.CPU内部的数据存储 堆栈型架构:操作数隐式放置在一个堆栈中 累加器型架构:当指令对应的运算包含两个操作数 时,其中一个操作数隐式放置在累加器寄存器中 通用寄存器型架构:操作数可以保存在寄存器中 存储器-存储器型:可以有多个操作数存放在内存, 允许实现任何操作数都不在寄存器的指令 6.9
  • 33.CPU内部的数据存储 堆栈型架构:操作数隐式放置在一个堆栈中 累加器型架构:当指令对应的运算包含两个操作数 时,其中一个操作数隐式放置在累加器寄存器中 通用寄存器型架构:操作数可以保存在寄存器中 存储器-存储器型:可以有多个操作数存放在内存, 允许实现任何操作数都不在寄存器的指令 寄存器-存储器型:至少一个操作数在寄存器中,另 一个操作数在内存中 6.9
  • 34.CPU内部的数据存储 堆栈型架构:操作数隐式放置在一个堆栈中 累加器型架构:当指令对应的运算包含两个操作数 时,其中一个操作数隐式放置在累加器寄存器中 通用寄存器型架构:操作数可以保存在寄存器中 存储器-存储器型:可以有多个操作数存放在内存, 允许实现任何操作数都不在寄存器的指令 寄存器-存储器型:至少一个操作数在寄存器中,另 一个操作数在内存中 取-存型:所有操作数都在寄存器中 6.9
  • 35.不同存储方式指令集架构示例 例子:假设要实现地址为𝑥的存储单元和地址为𝑦的存储 单元中的数据相加之后写入地址为𝑧的存储单元 堆栈型架构: PUSH x PUSH y ADD POP z 累加器型架构: LOAD x ADD y STORE z 通用寄存器型架构(存储器-存储器型): ADD ax, x, y STORE ax, z 通用寄存器型架构(寄存器-存储器型): LOAD ax, x IADD ax, y STORE ax, z 通用寄存器型架构(取-存型): LOAD ax, x LOAD bx, y ADD cx, ax, bx STORE cx, z 6 . 10
  • 36.指令操作数的数量和长度 按照操作数的数量分类: 零地址指令:仅有操作码 单地址指令:操作码+一个操作数(通常是一个 内存地址) 双地址指令:操作码+两个操作数(通常是两个 寄存器,或者是一个寄存器一个地址) 三地址指令:操作码+三个操作数(三个寄存器 地址,或者是寄存器地址和内存地址的组合) 不同存储方式支持的操作数数量: 存储方式 堆栈型 累加器型 通用寄存器型 零地址指令 是 是 是 单地址指令 是 是 是 双地址指令 否 否 是 三地址指令 否 否 是 6 . 11
  • 37.堆栈型架构和逆波兰式 堆栈型架构可以实现 所有的运算都是零地址指令 单地址指令只包括PUSH和POP 考虑一个三地址指令OP dt, sc1, sc2, 其中 OP代表操作码 dt代表目的地址 sc1代表第一个操作数的地址 sc2代表第二个操作数的地址 则该指令可以改写为 PUSH sc1 PUSH sc2 OP POP dt 6 . 12
  • 38.堆栈型架构和逆波兰式 堆栈型架构可以实现 所有的运算都是零地址指令 单地址指令只包括PUSH和POP 堆栈型架构的应用:求解由逆波兰式(后缀 表达式)表达的长算术表达式 后缀表达式:运算符放在表达式的最后 例:4 + 3的后缀表达式是4 3 + 考虑一个三地址指令OP dt, sc1, sc2, 其中 OP代表操作码 dt代表目的地址 sc1代表第一个操作数的地址 sc2代表第二个操作数的地址 则该指令可以改写为 PUSH sc1 PUSH sc2 OP POP dt 6 . 12
  • 39.后缀表达式的转换 表达式树遍历法 给定一个前缀/中缀/后缀描述的表达式,写出 其对应的前缀/中缀/后缀表达式 写出原前缀/中缀/后缀表达式对应的表达式 树,对表达式树进行对应的前缀/中缀/后缀遍 历,适当添加括号保证执行顺序 中缀表达式每一步都加括号可以保证执行顺 序,前缀表达式和后缀表达式不需要括号 按优先级替换法 按照运算符优先级依次将该运算符对应的中 缀表达式变换为后缀表达式 1+2×3⇒1+23× ⇒123× + 6 . 13
  • 40.堆栈执行后缀表达式 如果当前token是操作数, 入栈 如果当前token是运算符, 从栈顶读取操作数(出栈)进 行计算,将结果入栈 例:对于后缀表达式1 2 3 × + 栈 操作 1 (空) PUSH 1 2 1 PUSH 2 3 12 PUSH 3 × 123 POP 3; POP 2; MUL 2, 3; PUSH 6 + 16 POP 6; POP 1; ADD 1, 6; PUSH 7 $ 7 token 6 . 14
  • 41.扩展操作码 MARIE的指令集中采用固定长度的操作码表示不同的 指令类型 定长指令的译码相对容易但是浪费了存储空间 变长指令译码复杂 不同类型的指令需要的操作数数量不同 扩展操作码(Expanding Opcodes):在定长的指令 中,通过变长的操作码,表示更多的指令类型 6 . 15
  • 42.扩展操作码的示例 假设某体系结构中有16个寄存器和4K个可 寻址存储单元,采用16位字长的指令 16个寄存器对应4位寄存器地址 4K个内存可寻址单元对应12位内存地址 采用扩展操作码的指令类型 采用固定操作码长度的指令类型 6 . 16
  • 43.扩展操作码的编码 区别操作码的长度:采用转义操作 码(Escape Opcode) 转义操作码的作用:表示操作码的 编码超过当前长度 示例: 假设某体系结构中地址长度为4,如何 采用16位字长的指令编码下列指令: 15条三地址指令 14条双地址指令 31条单地址指令 16条零地址指令 6 . 17
  • 44.扩展操作码的译码 按照编码模式分类后分别编码 示例:对于右边的编码,对应的译码方式 如下所示 if (IR[15:12] != 1111) { 译码并执行对应的三地址指令 } else (IR[15:9] != 1111 111) { 译码并执行对应的双地址指令 } else (IR[15:4] != 1111 1111 1111) { 译码并执行对应的单地址指令 } else { 译码并执行对应的零地址指令 } 6 . 18
  • 45.利用位模式判断扩展操作码是否可行 判断是否采用𝐾位可以编码一个使用扩展 操作码的指令集:使用位模式 每一个位模式代表了一个特定的操作 编码长度要足够表示所有可能的操作组合 示例:假设地址长度为4,采用16位指令是 否与编码右侧两个指令集 15条三地址指令:位模式数量 15 × 2 � × 2 � × 2 � = 61440 14条双地址指令:位模式数量14 × 2 � × 2 � = 3584 31条单地址指令:位模式数量31 × 2 � = 496 16条零地址指令:位模式数量16 合计65536 ≤ 2��个位模式,可以被16位指令编码 15条三地址指令:位模式数量 15 × 2 � × 2 � × 2 � = 61440 15条双地址指令:位模式数量15 × 2 � × 2 � = 3840 31条单地址指令:位模式数量31 × 2 � = 496 16条零地址指令:位模式数量16 合计65792 > 2��个位模式,不能被16位指令编码 6 . 19
  • 46.指令类型 6 . 20
  • 47.指令类型 数据传输 表示数据的传输,例如: 内存传送到寄存器:LOAD 寄存器之间数据传输:MOVE 寄存器传送到内存:STORE 内存/寄存器到栈:PUSH 栈到内存/寄存器:POP 原子操作:TEST, EXCHANGE等 6 . 20
  • 48.指令类型 数据传输 算术运算 表示算术运算,例如: 算术运算:ADD、SUBSTRACT、MULTIPLY、DIVIDE等 自增运算:INCREMENT等 6 . 20
  • 49.指令类型 数据传输 算术运算 布尔逻辑运算 表示布尔逻辑运算,例如: 布尔代数运算符:AND,OR,XOR,NOT等 比较函数:EQUAL,NEQUAL,LT,GT,LEQ,GEQ等 6 . 20
  • 50.指令类型 数据传输 算术运算 布尔逻辑运算 位操作 将数据看作01数列进行按位操作的运算,例如 按位的逻辑运算:AND,OR,XOR等 算术逻辑移位:LSHIFT和RSHIFT 符号位不移位,但是如果符号位上的移出位和符号位不同 将导致算术溢出 例:(10110000) = − 80左移1位得到 (11100000) = − 32,但是移出位0 ≠ 符号位1,因此发生 算术溢出 例:(11100000) = − 32左移1位得到 (11000000) = − 64,移出位1 = 符号位1,因此没有发生算 术溢出 循环移位指令:LROTATE和RROTATE 移出位填充到对侧 例:(00000001)右移1位得到(00000000),右循环移位1 位得到(10000000) 6 . 20
  • 51.指令类型 数据传输 算术运算 布尔逻辑运算 位操作 输入/输出指令 6 . 20
  • 52.指令类型 数据传输 算术运算 布尔逻辑运算 位操作 输入/输出指令 传送控制指令 改变程序执行顺序的指令,例如: 跳转和条件跳转:JUMP、JE等 函数调用:CALL 中断:INT 6 . 20
  • 53.指令类型 数据传输 算术运算 布尔逻辑运算 位操作 输入/输出指令 传送控制指令 专用指令 一些特殊的指令,例如: 无指令:NOP(用于流水线避免数据冲突) 6 . 20
  • 54.寻址方式 常见的寻址方法: 立即寻址(Immediate Addressing) 直接寻址(Direct Addressing) 间接寻址(Indirect Addressing) 变址寻址(Indexed Addressing) 基址寻址(Based Addressing) 堆栈寻址(Stack Addressing) 6 . 21
  • 55.寻址方法 6 . 22
  • 56.寻址方法 立即寻址 指令中的地址直接指定操作数 例:对于右边的内存,采用立即寻址,执行指令LOAD 0x800之后寄存器AC的值是0x0800 6 . 22
  • 57.寻址方法 直接寻址 指令中的地址直接指向操作数的地址 指令中12位地址可寻址空间大小:2�� 例:对于右边的内存,采用直接寻址,执行指令LOAD 0x800之后寄存器AC的值是0x0900 寄存器(直接)寻址 指令中不用地址数,而是用一个寄存器名字,例:LOAD R1。寻址地址为对应的寄存器中存储的值,寻址方法和直 接寻址一致 6 . 22
  • 58.寻址方法 间接寻址 指令中的地址指向的地址保存了直接指向操作数的地址 指令中12位地址可寻址空间大小:2��(字长) 例:对于右边的内存,采用间接寻址,执行指令LOAD 0x800之后寄存器AC的值是0x1000 寄存器间接寻址 指令中不用地址数,而是用一个寄存器名字,例:LOAD R1。寻址地址为对应的寄存器中存储的值,寻址方法和间 接寻址一致 6 . 22
  • 59.寻址方法 变址寻址 在一个特定的寄存器(称为变址寄存器)中保存了一个地址 偏移值,通过指令中的地址加上变址寄存器中的偏移值得到 实际的地址,进行直接寻址 基址寻址 在一个特定的寄存器(称为基址寄存器)中保存了一个地址 偏移值,将指令中的地址作为偏移值加上基址寄存器中的地 址得到实际的地址,进行直接寻址 指令中12位地址可寻址空间大小:2�� + 2�� 例:对于右边的内存,采用变址寻址和基址寻址,执行指令 LOAD 0x800之后寄存器AC的值是0x0500 6 . 22
  • 60.第五讲结束 7.1
  • 61.本期内容回顾 学习内容:教材第5章“仔细审视指令集架构” 进一步加深理解指令集在整个计算机系统中的重要作用 初步掌握正确解读现有指令集的方法 初步了解指令集设计的方法 教材5.2节指令格式 学习掌握指令格式设计中需要考虑的因素和现有的解决方案 教材5.3节指令类型 学习掌握常见的指令类型 教材5.4节寻址 学习掌握常见的寻址类型 7.2
  • 62.扩展阅读 7.3
  • 63.Q&A 8