指令系统
知识点总览
指令:
是指示计算机执行某种操作的命令,是计算机运行的最小功能单位。
一台计算机的所有指令的集合构成该机的指令系统,也称为指令集。
注:一台计算机只能执行自己指令系统中的指令,不能执行其他系统的指令。
指令格式
这是指令的格式,分成两部分,前面是操作码,后面是地址码
操作码表明这个指令的作用(要对数据做什么、进行什么操作 )
地址码表示这个指令的数据在什么地方
实际形式:
意义:
(
A
1
)
O
P
(
A
2
)
→
A
3
,
A
4
(A_{1})OP(A_{2})→A_{3},A_{4}
(A1)OP(A2)→A3,A4=下一跳要执行指令的地址
(这是一个四地址指令)
设指令字长为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
−2n−1 2n−1−1
(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=A | 1 |
一次间接寻址 | EA=(A) | 2 |
寄存器寻址 | EA= R i R_{i} Ri | 0 |
寄存器间接一次寻址 | EA= ( R i ) (R_{i}) (Ri) | 1 |
相对寻址 | EA=(PC)+A | 1 |
基址寻址 | EA=(BR)+A | 1 |
变址寻址 | EA=(IX)+A | 1 |
相对寻址的例题
某机器指令字长为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%的指令
对比图