计算机组成第四章

指令系统

知识点总览
在这里插入图片描述
指令:
是指示计算机执行某种操作的命令,是计算机运行的最小功能单位。

一台计算机的所有指令的集合构成该机的指令系统,也称为指令集。

注:一台计算机只能执行自己指令系统中的指令,不能执行其他系统的指令。

指令格式

在这里插入图片描述
这是指令的格式,分成两部分,前面是操作码,后面是地址码

操作码表明这个指令的作用(要对数据做什么、进行什么操作 )
地址码表示这个指令的数据在什么地方

实际形式:
在这里插入图片描述
意义: ( A 1 ) O P ( A 2 ) → A 3 , A 4 (A_{1})OP(A_{2})→A_{3},A_{4} (A1)OP(A2)A3A4=下一跳要执行指令的地址
(这是一个四地址指令)

设指令字长为32位,操作码占8位,4个地址码字段各占6位

设存储字长为32位,即4B

因此一个地址码最多表示 2 6 = 64 2^{6}=64 26=64个位置

一条指令的执行(假设每个都是主存地址):
取指令访存1次(假设指令字长=存储字长)
取两个操作数访存2次
存回结果访存1次
共访存4次

在这里插入图片描述
并不需要下一个地址的地址码。(这是四地址指令的优化模式)

指令意义: ( A 1 O P A 2 ) → A 3 (A_{1}OPA_{2})→A_{3} (A1OPA2)A3

3个地址码字段各占8位,指令操作数直接寻址范围为 2 8 2^{8} 28=256

完成一条指令需要访存4次

在这里插入图片描述
指令意义: ( A 1 ) O P ( A 2 ) → A 3 (A_{1})OP(A_{2})→A_{3} (A1)OP(A2)A3

2个地址码字段各占12位,指令操作数直接寻址范围为 2 12 2^{12} 212=4K

完成一条指令需要访存4次

在这里插入图片描述
指令含义:
1. O P ( A 1 ) → A 1 OP(A_{1})→A_{1} OP(A1)A1
2. ( A C C ) O P ( A 1 ) → A C C (ACC)OP(A_{1})→ACC (ACC)OP(A1)ACC,隐含约定的目的地址为ACC

1个地址码字段占24位,指令操作数直接寻址范围为 2 24 = 16 M 2^{24}=16M 224=16M

完成一条指令需要访存3次

在这里插入图片描述
指令含义:
1.不需要操作数,如空操作、停机、关中断等指令
2.堆栈计算机,两个操作数隐含存放在栈顶和次栈顶,计算结果压回栈顶

扩展操作码

指令字长为16位:
前4位为基本操作码字段OP,另有3个4位长的地址字段A1、A2和A3。
在这里插入图片描述
其实就是,前面n位确定是多少地址指令,后面保证操作码数

在设计扩展操作码指令格式时,必须注意以下两点:

1)不允许短码是长码的前缀,即短操作码不能与长操作码的前面部分的代码相同。

2)各指令的操作码一 定不能重复。

通常情况下,对使用频率较高的指令,分配较短的操作码;对使用频率较低的指令,分配较长的操作码,从而尽可能减少指令译码和分析的时间。

在这里插入图片描述
这个就是前面留出多位,就可以下一层多扩展很多

操作码分类
定长操作码:在指令 字的最高位部分分配固定的若干位(定长)表示操作码。

一般n位操作码字段的指令系统最大能够表示2”条指令。

一优:定长操作码对于简化计算机硬件设计,提高指令译码和识别速度很有利;

缺:指令数量增加时会占用更多固定位,留给表示操作数地址的位数受限。

扩展操作码(不定长操作码):全部指令的操作码字段的位数不固定,且分散地放在指令字的不同位置上。

最常见的变长操作码方法是扩展操作码,使操作码的长度随地址码的减少而增加,不同地址数的指令可以具有不同长度的操作码,从而在满足需要的前提下,有效地缩短指令字长。

优:在指令字长有限的前提下仍保持比较丰富的指令种类;

缺:增加了指令译码和分析的难度,使控制器的设计复杂化。

操作类型

1.数据传送(进行主存与CPU之间的数据传送)

LOAD 作用:把存储器中的数据放到寄存器中
STORE 作用: 把寄存器中的数据放到存储器中

2.算术逻辑操作

算术:加、减、乘、除、增1、减1、求补、浮点运算、十进制运算
逻辑:与、或、非、异或、位操作、位测试、位清除、位求反

3.移位操作

算术移位、逻辑移位、循环移位(带进位和不带进位)

4.转移操作

无条件转移 JMP
条件转移 JZ: 结果为0; JO: 结果溢出; JC: 结果有进位
调用和返回 CALL和RETURN
陷阱(Trap)与陷阱指令

5.输入输出操作(进行CPU和I/O设备之间的数据传送)

CPU寄存器与10端口之间的数据传送(端口即I0接口中的寄存器)

知识点回顾

在这里插入图片描述

指令寻址

要知道指令如何寻找地址,首先就要知道数据在存储器里面是怎么存放的

数据存放

在这里插入图片描述
存储单元有两种格式:字存储单元和字节存储单元(简单的来说就是一行n个字节是字存储单元,一个字节是字节存储单元)

因此编址方式也有两种:按字节编址和按字编址(字节编址就是一个字节一个地址,按字编址就是一个字一个地址,其中每个字总最小的字节地址就是字地址)

按照编址方式,寻址方式也有两种:按字节地址寻址和按字地址寻址(就是直接找字节或者找一行的字)

还有就是存放的方式,如果像图中不对齐的方式,每次寻址需要找两次字地址,因此就出现了一种边界对齐(就是每次存储都从字地址开始)

边界对齐:起始地址是字长(按字节算)的整数倍

三种字长:

机器字长: CPU一次能处理的 二进制数据的位数。

指令字长:一个指令字中包含二进制代码的位数。

存储字长: 一个存储单元存储二进制代码的长度。

注:这些长度都是字节的整数倍

单字长指令:指令长度=机器字长
半字长指令、双字长指令(就是指令长度用字节来衡量)

寻址方式

这里的寻址是指令如何找到数据在存储器的位置,上面的数据存储的寻址是存储器怎么找到

寻址方式有两种:指令寻址和数据寻址

指令寻址:下一条欲执行指令的指令地址(这个就简单了,一直是放在程序计数器PC中)

数据寻址:确定本条指令的操作数地址(这个就是上面存储器找数据的方式)

指令寻址有两种形式:顺序寻址和跳跃寻址

顺序寻址:(PC)+1→PC(就是直接读取下一条地址指令)

跳跃寻址:使用跳转指令寻址(具体可以结合汇编语言的跳转指令)

数据寻址

指令形式:操作码+地址码

操作数有四种类型:地址(无符号数,因为跳转其实就是把相应的数字给PC)、数字(定点数、浮点数、十进制数啥的)、字符(ASCII码等编码
)和逻辑数(逻辑运算)

数据寻址的方式有很多很多种(这个其实就是汇编语言中的那些寻址方式)
(1)隐含寻址
(2)立即寻址
(3)直接寻址
(4)间接寻址
(5)寄存器寻址
(6)寄存器间接寻址
(7)相对寻址
(8)基址寻址
(9)变址寻址
(10)堆栈寻址

因此对于寻址方式在指令中其实应该是

操作码OP+寻址特征+形式地址A(有效地址EA:求出操作数的真实地址,也就是用寻址方法找出来后的地址)

这是一地址指令的形式

而二地址指令其实也是差不多,也就是
操作码OP+寻址特征+形式地址 A 1 A_{1} A1+寻址特征+形式地址 A 2 A_{2} A2

(1)隐含寻址

隐含寻址:不是明显地给出操作数的地址,而是在指令中隐含着操作数的地址。(其实就是用ACC中的数据做操作,所以不需要存储器内的数据)

在这里插入图片描述
优点:有利于缩短指邻字长。
缺点:需增加存储操作數或隐含地址的硬件。

(2)立即寻址

假设指令字长=机器字长=存储字长,操作数=3

在这里插入图片描述

形式地址A就是操作数本身,又称为立即数,一般采用补码形式。(#在汇编中表示立即寻址特征,在电脑上中其实就是二进制)

这其中一条指令的执行:
取指令访存1次
执行指令访存0次
暂不考虑存结果
共访存1次

优点:指令执行阶段不访问主存,指令执行时间最短

缺点:A的位数限制了立即数的范围。
如A的位数为n,且立即数采用补码时,可表示的数据范围为 − 2 n − 1   2 n − 1 − 1 -2^{n-1}~2^{n-1}-1 2n1 2n11

(3)直接寻址

假设指令字长=机器字长=存储字长,操作数=3

在这里插入图片描述

直接寻址:
指令字中的形式地址A就是操作数的真实地址EA,即EA=A

一条指令的执行:
取指令访存1次
执行指令访存1次
暂不考虑存结果
共访存2次

优点:简单,指令执行阶段仅访问一次主存,
不需专门计算操作数的地址。

缺点:A的位数决定了该指令操作数的寻址范围。操作数的地址不易修改。

(4)间接寻址

假设指令字长=机器字长=存储字长,操作数=3

在这里插入图片描述
间接寻址:指令的地址字段给出的形式地址不是操作数的真正地址,而是操作数有效地址所在的存储单元的地址,也就是操作数地址的地址,即EA=(A) 。(就是A里面放的也是地址,而这个地址所指向的才是真正的操作数)

在这里插入图片描述
一条指令的执行:
取指令访存1次
执行指令访存2次
暂不考虑存结果
共访存3次

当然,有一次间址就有两次间址

在这里插入图片描述
其实就是在前面放一个标志位,表示第几次间址

优点:
可扩大寻址范围(有效地址EA的位数大于形式
地址A的位数)。
便于编制程序(用间接寻址可以方便地完成子
程序返回)。
缺点:
指令在执行阶段要备次访存(一次间址需两
次访存,多次寻址需根据存储字的最高位
确定儿次访存)。

(5)寄存器寻址

假设指令字长=机器字长=存储字长,操作数=3

在这里插入图片描述
寄存器寻址:在指令字中直接给出操作数所在的寄存器编号,即EA=R, 其操作数在由R所指的寄存器内。

在这里插入图片描述
一条指令的执行:
取指令访存1次
执行指令访存0次
暂不考虑存结果
共访存1次
(比立即寻址慢点)

优点:
指令在执行阶段不访问主存,只访问寄存器指令字短且执行速度快,支持向量/矩阵运算。

缺点:
寄存器价格昂贵,计算机中寄存器个数有限。

(6)寄存器间接寻址

假设指令字长=机器字长=存储字长,操作数=3

在这里插入图片描述
寄存器间接寻址:寄存器R中给出的不是“个 操作数,而是操作数所在主存单元的地址,即EA=®。

在这里插入图片描述
一条指令的执行:
取指令访存1次
执行指令访存1次
暂不考虑存结果
共访存2次

特点:
与一般间接寻址相比速度更快,但指令的执行阶段需要访问主存因为操作数在主存中)。

前面这些都是直接利用地址来进行寻址,而后面这些叫做偏移寻址,是利用加法运算来进行寻址

在这里插入图片描述
(7)相对寻址(适合转移指令)

相对寻址:把程序计数器PC的内容加上指令格式中的形式地址A而形成操作数的有效地址,即EA=(PC)+A,其中A是相对于当前指令地址的位移量,可正可负,补码表示。
在这里插入图片描述
优点:操作数的地址不是固定的,它随着PC值的变化而变化,并且与指令地址之间总是相差一个固定值,因此便于程序浮动。相对寻址广泛应用于转移指令。(其实就是主要用在程序的转移,比如循环指令的转移上,在跳转不太远的地方使用)

(8)基址寻址(适合多道程序)

基址寻址:将CPU中基址寄存器(BR) 的内容加上指令格式中的形式地址A,而形成操作数的有效地址,即EA=(BR)+A。

(也可以用通用寄存器代替基址,但是需要指明是哪个通用寄存器)
在这里插入图片描述
优点:可扩大寻址范围(基址寄存器的位数大于形式地址A的位数) ;用户不必考虑自己的程序存于主存的哪一空间区域,故有利于多道程序设计,以及可用于编制浮动程序。

(利于多道程序设计其实就是我要用数组做累加,但是用直接寻址会很麻烦,所以就用基址寻址,基址是数组首地址,然后往后面寻找就可以了)

注:基址寄存器是面向操作系统的,其内容由操作系统或管理程序确定。在程序执行过程中,基址寄存器的内容不变(作为基地址),形式地址可变(作为偏移量)。

(9)变址寻址(循环程序)

变址寻址:有效地址EA等于指令字中的形式地址A与变址寄存器1X的内容相加之和,即EA= (IX)+A,其中X为变址寄存器(专用),也可用通用寄存器作为变址寄存器。

在这里插入图片描述
这里变址和基址的作用很像,只是功能不同

注:变址寄存器是面向用户的,在程序执行过程中,变址寄存器的内容可由用户改变(作为偏移量),形式地址A不变(作为基地址)

优点:可扩大寻址范围(变址寄存器的位数大于形式地址A的位数) ;在数组处理过程中,可设定A为数组的首地址,不断改变变址寄存器x的内容,便可很容易形成数组中任一数据的地址, 特别适合编制循环程序。

(这里就相当于基址寻址中的基址和D换一下功能,D代表首地址,变址代表位置)

变址寻找与基址寻址配合使用: EA=A+(BR)+(X)
变址寻找与间接寻址配合使用:
如先变址后间址,EA=(A+(0X);
先间址后变址,EA=(A)+(IX)。

(10)堆栈寻址

堆栈寻址:操作数存放在堆栈中,隐含使用堆栈指针(SP)作为操作数地址

堆栈是存储器(或专用寄存器组)中一块特定的按“后进先出”原则管理的存储区,该存储区中被读/写单元的地址是用一个特定的寄存器给出的,寄存器称为堆栈指针

在这里插入图片描述
这个应该很好理解,就是压入栈保存,推出栈输出

硬堆栈:在寄存器中

软堆栈:在主存中

寻址方式有效地址访存次数(指令执行期间)
隐含寻址程序指定0
立即寻址A就是操作数0
直接寻址EA=A1
一次间接寻址EA=(A)2
寄存器寻址EA= R i R_{i} Ri0
寄存器间接一次寻址EA= ( R i ) (R_{i}) (Ri)1
相对寻址EA=(PC)+A1
基址寻址EA=(BR)+A1
变址寻址EA=(IX)+A1

相对寻址的例题
某机器指令字长为16位,主存按字节编址,取指令时,每取-个字节PC自动加1。当前指令地址为2000H,指令内容为相对寻址的无条件转移指令,指令中第一个字节为操作码,第二个字节为形式地址,当前形式地址为40H。

(1)求取指令后及指令执行后PC内容。
(2)若要求转移到1F0OH,求形 式地址的内容。

(1)取指令
这里取指令需要取两个
所以PC内容为2002H
内容为2002+40=2042H

(2)这题就相当于要求
(PC)+A=1F00H
A=1F00H-2002H=1EFFH+1H-2002H=1EFFH-2002H+1H=FEFDH+1H=FEFEH

指令集

CISC:复杂指令集(设计思路:一条指令完成一个复杂的基本功能,代表:x86架构,主要用于笔记本、台式机等)

RISC:精简指令集(设计思路:一条指令完成一个基本动作;多条指令组合完成一个复杂的基本功能;代表:ARM架构,主要用于手机、平板等)

80-20规律:典型程序中80%的语句仅仅使用处理机中20%的指令

对比图
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值