本篇博客是考研期间学习王道课程 传送门 的笔记,以及一整年里对
计算机组成
知识点的理解的总结。希望对新一届的计算机考研人提供帮助!!!
关于对指令系统
章节知识点总结的十分全面,涵括了《计算机组成原理》课程里的全部要点(本人来来回回过了三遍视频),其中还陆陆续续补充了许多内容,所以读者可以相信本篇博客对于考研计算机组成原理 “指令系统” 章节知识点的正确性与全面性;
但如果还有自主命题的学校,还需额外读者自行再观看对应学校的自主命题材料。
计算机组成原理
笔记导航
- 第一章 计算机系统概述
- 第二章 数据的表示和运算
- 第三章 存储系统
- 第四章 指令系统
⇦当前位置
- 第五章 中央处理器
- 第六章 总线
- 第七章 输入输出系统
计算机组成原理 复试精简笔记 (加班中...)
- 408 全套初复试笔记汇总 传送门
如果本篇文章对大家起到帮助的话,跪求各位帅哥美女们,
求赞 、求收藏 、求关注!
你必考上研究生!
我说的,耶稣来了也拦不住!
食用说明书:
第一遍学习王道课程时,我的笔记只有标题和截图,后来复习发现看只看图片,并不能很快的了解截图中要重点表达的知识点。
在第二遍复习中,我给每一张截图中 标记了重点,以及 每张图片上方总结了该图片 对应的知识点 以及自己的 思考 。
最后第三遍,查漏补缺。
所以 ,我把目录放在博客的前面,就是希望读者可以结合目录结构去更好的学习知识点,之后冲刺复习阶段脑海里可以浮现出该知识结构,做到对每一个知识点熟稔于心!
请读者放心!目录展示的知识点结构是十分合理的,可以放心使用该结构去记忆学习!
注意(⊙o⊙)!,每张图片上面的文字,都是该图对应的知识点总结,方便读者更快理解图片内容。
【考纲内容】
(一) 指令格式的基本概念
(二) 指令格式(一)和(二) 网课耗时:
0.5 h
(三) 寻址方式 网课耗时:
1 h
(四) 数据的对齐和大/小端存放方式 ①
(五) CISC和RISC的基本概念 网课耗时:
0.5 h
(六) 高级语言程序与机器级代码之间的对应 网课耗时:
1.5 h
- 编译器、汇编器与链接器的基本概念;②
- 选择结构语句的机器级表示;
- 循环结构语句的机器级表示;
- 过程(函数)调用对应的机器级表示;
【复习提示】
学习本章内容是为了给学习 第5章 中央控制器 做铺垫。所以在学习控制器的时候,要和本章多练习、多思考;
指令系统是表征一台计算机性能的主要因素;
应掌握 各种寻址方式的特点 及 有效地址的计算、相对寻址的计算、CISC与RISC的特点与区别;
机器级表示 ,22年大纲新增,17、19年真题考过;
指令格式 - 机器指令 - 指令寻址方式 - CPU指令执行过程 ,这些知识点之间是密切谷关联的;
【注】
① 在2.2 节中介绍;
② 在1.2 节中介绍;
【补充知识】
计算机语言的层级关系:机器语言 - 汇编语言 - 高级语言
; 机器语言用二进制来编写,用来反映硬件的语言。但是二进制编写太难了,就诞生了汇编语言,对其编程进行封装、简化;
计算机工作的本质就是连续执行一条条机器语言,每一条机器语言的语句 称为 ==机器指令,==是一组有意义的二进制代码;
将全部机器指令的集合 称为 机器的 指令系统 ;
故,机器的指令系统 集中反映了 机器的功能 ;
1. 指令的定义( 地址码 + 操作码 )
地址码 指明 操作对象的位置,对谁进行操作 ?
指令的 地址码字段 用来指出该指令的源操作数的地址(一个或两个)、结果的地址以及一条指令的地址;
指令按照 地址码数目的不同,分为:零地址指令、一地址指令、二地址指令……
操作码 反映 要进行的操作,用户要干什么 ?
指令按照 操作码字段 的长度是否可变,分为:定长操作码、可变操作码、扩展操作码……
2. 指令 - 按 地址码 数量分类
① 零地址码
② 一地址指令
③ 二、三地址指令
④ 四地址指令
3. 指令 - 按指令长度分类
4. 指令 - 按操作码长度分类
扩展操作码 将在 4.1.2 扩展操作码指令格式 里详细介绍;① 定长操作码
对于 操作码长度固定 编码方式的指令来说,操作码全部集中在操作码字段;
这种格式指令 ==译码时间短,==常用于 字长较长指令 的情况;
② 可变长操作码
对于 操作码长度可变 编码方式的指令来说,操作码分散在指令的不同字段中;
这种格式指令 ==压缩了操作码的平均长度,==常用于 字长较短 的计算机中;
但是 不固定 的特性会增加指令译码和分析的难度,是控制器设计更复杂;
5. 指令 - 按操作类型分类
小结
1. 扩展操作码原理
扩展操作码 就是 从操作码角度 对指令系统做 优化; 核心思想:指令位数固定时,地址码位数减少,则操作码可以利用的位数增加;
所谓的指令优化,就是在不添加指令字长的情况下,通过对地址码字段空闲区域的利用,达到扩展指令表达信息数量的效果;
【补充】
地址码的优化 主要通过 寻址技术 来介绍,先不在这里赘述;
2. 扩展操作码注意事项
3. 扩展操作码举例
小结
【问题】寻址方式是什么 ?
答:指如何确定 本条指令 的 操作数地址 以及 下一条执行指令 的地址;
寻址方式的分类:
- 指令寻址
- 数据寻址(重点)
1. 什么是指令寻址 ?
指令寻址,顾名思义,找的是 ==指令,==就是为了找到 下一条欲执行指令 的 存放位置 ;
很重要一点,程序计数器PC 就是用来存放下一条指令的地址,不过一断电就会清零;
【问题】那PC是如何得到程序计数器下一条指令的地址呢 ?
答:如果采用 ==顺序寻址,==很简单
PC = (PC) + n
(没加括号的PC表示下一条指令地址,加了括号表示当前指令地址) n的值取决于 ==指令字长 和 按字 / 字节编址,==可以看看下图的例子;
2. 顺序寻址
下图假设系统采用 ==变长指令字结构 + 按字节编址,==注意图中各条指令分布;
顺序寻址中,
PC = (PC) + 1
,这个 1 指的是 1个指令字长,指令字长会根据 指令长度、编址方式 而变;
3. 跳跃寻址
指令除了顺序执行,当遇到 转移指令 时,就会发生 跳序执行;
跳跃寻址,下一条欲执行指令的地址 由转移指令指出;
下图,当指令 顺序执行 到
JMP 7
时,PC的值就会变成 7,这就是跳跃寻址的特点; 关于跳跃寻址中 ==转移地址的形成方式,==将在 偏移寻址 中学习;
小结
1. 数据寻址
在正式学习 常见的数据寻址 之前,要先带着一下几个要求学习:
- 要重点关注每种寻址方式的 有效地址;
- 搞清楚每种寻址方式的 操作数 在哪;
- 如何把数据寻址与指令优化联系起来;
【问题】寻址特征 字段是干什么的?
答:数据寻址方式有很多种,所以在指令字中必须设值一个字段,用来指明当前指令使用哪一种数据寻址;
【问题】有效地址EA 和 形式地址A
答:指令中的地址码字段通常都不是操作数的 ==真实地址,==而是称为 ==形式地址,==记为
A
; 操作数的真实地址称为 ==有效地址,==记为
EA
,它是由 寻址方式 和 形式地址 共同来确定的; 举例:c = a + b;
2. 常见的数据寻址
时刻注意一点,一条指令的执行分为 取指令 和 执行指令 两个阶段;
① 直接寻址
直接寻址,有效地址由形式地址直接给出,
EA = A
; 也就是说,形式地址所指的地址 就是操作数存放的真实地址;
特点:
- 指令执行阶段,==仅访存一次,==用来取操作数;
- A的位数 限制了 指令操作数的 寻址范围 ;
② 间接寻址
间接寻址,有效地址由形式地址间接给出,
EA = (A)
(给 A 加括号,表示对A访存) 也就说,操作数的真实地址存放在A所指向的空间;
同理,还可以进行 多次间接寻址 ,不过需要额外占用 一位来充当 标识位 ,记录是否找到 有效地址 ;
【举例】假设指令字长为16位,A为8位,则:
- 直接寻址 寻址范围为: 28
- 一次间址 寻址范围为:216
- 多次间址 寻址范围为:215
对于 一次间址 ,指令指向阶段需要两次访存:
- 第一次访存,找有效地址;
- 第二次访存,找操作数;
特点:
- 扩大寻址范围 (操作码较短时,又想要访存较远范围的操作数)
- 便于编制程序
- 指令执行阶段需要多次访存(时间换空间)
③ 寄存器寻址
寄存器直接寻址,有效地址 即 寄存器编号 ,EA = Ri ;
也就是说,此时的 形式地址存放的是 存储器编号,操作数就在对应的寄存器中;
特点:
- 操作数不在主存,故指令执行阶段 无需访存 ;
- 寄存器 (SRAM) 速度远大于 内存 (DRAM),故 执行速度快 ;
- 寄存器贵,那么个数一定不多,所以 寄存器寻址 适合 指令字短 的情况;
④ 寄存器间接寻址
寄存器间接寻址,有效地址 存放在 形式地址所指的寄存器,EA = (Ri) ;
也就是说,形式地址存放寄存器的编号,真实地址存放在寄存器中;
特点:
- 指令的执行阶段需要访存,但比 间接寻址 少一次访存;
- 便于编制循环程序;
小总结(直接、间接、寄存器直接、寄存器间接):
- 间接比直接,表示范围大、速度慢;
- 寄存器间接,表示范围大,因为寄存器快且少访存一次,但是寄存器贵;
⑤ 隐含寻址
隐含寻址,操作数地址 隐含在 操作码 或 寄存器中;
隐含寻址应该是特定用于两个操作数的时候,指令的地址码存放其中一个操作数的真实地址,这一部分和 直接寻址 一样;
但另一个操作数会直接存放在某个寄存器中,然后直接输入到ALU中;
所谓隐含,就是说,其中一个操作数(或操作数地址)根本就不在指令中,而是 约定地 隐含在 ACC (累加器) ;
特点:
- 因指令字中少了一个地址码字段,所以缩短了指令字长;
- 不过需要额外增加 存储操作数 或 隐含地址 的硬件;
⑥ 立即寻址
立即寻址,操作数 本身就在 指令中;
特点:
- 取指令阶段访存一次,指令执行阶段无需访存;
- A的位数限制了 立即数 的大小;
小结
1. 堆栈寻址
2. 偏移寻址
在 4.2.1 指令寻址 的 跳跃寻址已经提前预示了,如果对 跳跃寻址 不熟悉,先回去复习;
① 基址寻址
基址寻址,设有 基址寄存器 (BR) ,即
EA = (BR) + A
; 也就说,有效地址 等于 BR中记录的 基地址 + 指令中的 形式地址 ;
BR可采用 隐式 和 显式 两种实现方式:
隐式BR:计算机内部 专门 设置一个BR,指令不必明确指出基址寄存器,只需由指令的 寻址特征 为反映出基质寻址即可;
显式BR:在一组通用寄存器里,指令中 明确指出 哪个寄存器用作基址寄存器,存放基地址;
特点:
- A 和 BR 拼接出来的新地址无疑更长了,扩大了操作数的寻址范围;
- 有利于多道程序;
- 在程序执行过程中,BR的内容不变(基地址不变),形式地址可变(偏移量);
- 在显式中,虽然可以选择哪个哪个寄存器作为BR,但其内容由操作系统或管理程序确定;
② 变址寻址
变址寻址,和基址寻址类型,即
EA = (IX) + A
; 变址和基址的思想相同,只不过 变址寄存器 IX 的内容由用户决定;
③ 相对寻址
由程序计数器PC所指的地址作为 基地址,即
EA = (PC) + A
;
小结
2022 年大纲新增考点
1. 考试要求
2. x86汇编语言指令基础
x86架构CPU,常用的寄存器:
- 通用寄存器:EAX、EBX、ECX、EDX;
- 变址寄存器:ESI、EDI;
- 堆栈基地址:EBP;
- 堆栈顶指针:ESP;
通用寄存器使用比较灵活,但对于变址寄存器、堆栈基指针、堆栈顶指针就不能修改;
小结
1. 常用的x86指令
① 常见的算术运算指令
其它操作较为简单明了,这里重点介绍除法操作:
div s
,无符号数除法idiv s
,有符号数除法 除法指令里只有一个操作数s(除数),而被除数已经被提前放进 edx、eax 里面;
edx:eax
的含义: 在进行除法之前,会对被除数进行位扩展,而扩展之后的被除数需要两个寄存器存放;
注意实现:
- 左边目的操作数不能是常量;
- 不允许两个操作数同时来自于主存;
② 常见的逻辑运算指令
2. 汇编指令格式
转移类指令
常见的条件转移指令
举例
扩展
注意!loop 指令 必须配套 ecx,不能使用eax、ebx;
1.简述各常见指令寻址方式的特点和适用情况
立即寻址操作数获取便捷,通常用于给寄存器赋初值;
直接寻址相对于立即寻址,缩短了指令长度;
间接寻址扩大了寻址范围,便于编制程序,易于完成子程序返回。寄存器寻址的指令字较短,指令执行速度较快;
寄存器间接寻址扩大了寻址范围;
基址寻址扩大了操作数寻址范围,适用于多道程序设计,常用于为程序或数据分配存储空间;
变址寻址主要用于处理数组问题,适合编制循环程序。相对寻址用于控制程序的执行顺序、转移等;
基址寻址和变址寻址的区别:两种方式有效地址的形成都是寄存器内容+偏移地址,但是在基址寻址中,程序员操作的是偏移地址,基址寄存器的内容由操作系统控制,在执行过程中是动态调整的;而在变址寻址中,程序员操作的是变址寄存器,偏移地址是固定不变的;
2. 一个操作数在内存可能占多个单元,怎样在指令中给出操作数的地址 ?
现代计算机都采用字节编址方式,即一个内存单元只能存放一字节的信息;
一个操作数 (如:char、int、float、double)可能是8位、16位、32位或64位等,因此可能占用1个、2个、4个或8个内存单元
也就是说,一个操作数可能有多个内存地址对应。有两种不同的地址指定方式:大端方式和小端方式;
- 大端方式:指令中给出的地址是操作数最高有效字节(MSB)所在的地址;
- 小端方式:指令中给出的地址是操作数最低有效字节(LSB)所在的地址。
3. 装入/存储( Load/Store)型指令有什么特点 ?
装入/存储型指令是用在规整型指令系统中的一种通用寄存器型指令风格;
这种指令风格在RISC指令系统中较为常见。为了规整指令格式,使指令具有相同的长度,规定只有Load/Store指令才能访问内存;
而运算指令不能直接访问内存,只能从寄存器取数进行运算,运算的结果也只能送到寄存器;
因为寄存器编号较短,而主存地址位数较长,通过某种方式可使运算指令和访存指令的长度一致;
这种装入/存储型风格的指令系统的最大特点是,指令格式规整,指令长度一致,一般为32位;
由于只有Load/Store 指令才能访问内存,程序中可能会包含许多装入指令和存储指令,与一般通用寄存器型指令风格相比,其程序长度会更长;
1) 什么是指令 ?什么是指令系统? 为什么要引入指令系统 ?
指令就是要计算机执行某种操作的命令;
一台计算机中所有机器指令的集合,称为这台计算机的指令系统;
引入指令系统后,避免了用户与二进制代码直接接触,使得用户编写程序更为方便。另外,指令系统是表征一台计算机性能的重要因素,它的格式与功能不仅直接影响到机器的硬件结构,而且也直接影响到系统软件,影响到机器的适用范围。
2)一般来说,指令分为哪些部分 ? 每部分有什么用处 ?
一条指令通常包括操作码字段和地址码字段两部分;
其中,操作码指出指令中该指令应该执行什么性质的操作和具有何种功能,它是识别指令、了解指令功能与区分操作数地址内容的组成和使用方法等的关键信息。地址码用于给出被操作的信息(指令或数据)的地址,包括参加运算的一个或多个操作数所在的地址、运算结果的保存地址、程序的转移地址、被调用子程序的入口地址等。
3) 对于一个指令系统来说,寻址方式多和少有什么影响 ?
寻址方式的多样化能让用户编程更为方便,但多重寻址方式会造成CPU结构的复杂化(详见下章),也不利于指令流水线的运行。而寻址方式太少虽然能够提高CPU的效率,但对于用户而言,少数几种寻址方式会使编程变得复杂,很难满足用户的需求。