计算机组成原理笔记4-指令系统
指令
又称机器指令,是指示计算机执行某种操作的命令,是计算机运行的最小功能单位。
一台计算机的所有指令的集合构成该机的指令系统,也称位指令集。
指令格式
一条指令就是机器语言的一个语句,它是一组由有意义的二进制代码。
一条指令通常要包括操作码和字段和地址码字段两部分:
操作码(OP) | 地址码(A) |
---|
地址码
设指令字长及存储字长均为32位,操作码占8位
零地址指令:
OP |
---|
指令含义:
-
不需要操作数,如空操作、停机、关中断等指令。
-
堆栈计算机,两个操作数隐含存放在栈顶和次栈顶,计算结果压回栈顶。
一地址指令:
OP | A1 |
---|
指令含义:
-
\(OP(A_1)->A_1\),如加1、减1、取反、求补等;完成一条指令需要访存3次。
-
\((ACC)OP(A_1)->ACC\),隐含约定的目的地址为ACC;完成一条指令需要访存2次。
1个地址码字段占24位,指令操作数直接寻址范围位\(2^{24}=16M\)。
二地址指令:
OP | A1(目的操作数) | A2(源操作数) |
---|
指令含义:\((A_1)OP(A_2)->A_1\)
2个地址码字段各占12位,指令操作数直接寻址范围为\(2^{12}=4K\);完成一条指令需要访存4次。
三地址指令:
OP | A1 | A2 | A3(结果) |
---|
指令含义:\((A_1)OP(A_2)->A_3\)
3个地址码字段各占8位,指令操作数直接寻址范围为\(2^8=256\),完成一条指令需要访存4次。
四地址指令:
OP | A1 | A2 | A3(结果) | A4(下址) |
---|
指令含义:\((A_1)OP(A_2)->A_3\),\(A_4\)=下一条将要执行指令的地址
4个地址码字段各占6位,指令操作数直接寻址范围为\(2^6=64\),完成一条指令需要访存4次。
将PC的值直接修改为\(A_4\)所指地址
定长指令字结构:指令长度固定
变长指令字结构:指令长度不等
操作码
操作码指出指令中该指令应该执行什么性质的操作和具有何种功能。
操作码是识别指令、了解指令功能与区分操作数地址内容的组成和使用方法等的关键信息。例如:指出是算术加运算,还是减运算,是程序转移,还是返回操作。
定长操作码:在指令字的最高位部分分配固定的若干位(定长)表示操作码。
- 一般n位操作码字段的指令系统最大能够表示\(2^n\)条指令。
- 优点:定长操作码对于简化计算机硬件设计,提高指令译码和识别速度很有利。
- 缺点:指令数量增加时回占用更多固定为,留给表示操作数地址的位数有限。
扩展操作码指令格式
定长指令字+可变长操作码——>扩展操作码指令格式
在设计扩展操作码指令格式时,必须注意以下两点:
- 不允许短码是长码的前缀,即短操作码不能与长操作码的前面部分的代码相同
- 各指令的操作码一定不能重复
通常情况下,对使用频率较高的指令,分配较短的操作码;对使用频率较低的指令,分配较长的操作码,从而尽可能减少指令译码和分析的时间。
扩展操作码(不定长操作码):全部指令的操作码字段的位数不固定,且分散地放在指令字的不同位置上。
- 最常见的变长操作码方法时扩展操作码,使操作码的长度随地址码的减少而增加,不同地址码的指令可以具有不同长度的操作码,从而在满足需要的前提下,有效地缩短指令字长。
- 优:在指令字长有限的前提下仍保持比较丰富的指令种类。
- 缺:增加了指令译码和分析的难度,使控制器的设计复杂化。
操作类型
数据传送
LOAD 作用:把存储器(源)中的数据放到寄存器(目的)中
STORE 作用:把寄存器(源)中的数据放到存储器(目的)中
算术逻辑操作
算术:加、减、乘、除、增1、减1、求补、浮点运算、十进制运算
逻辑:与、或、非、异或、位操作、位测试、位清除、位求反
移位操作
算术移位、逻辑移位、循环移位(带进位和不带进位)
转移操作
无条件转移 JMP
条件转移 JZ:结果为0;JO:结果溢出;JC:结果有进位
调用和返回 CALL和RETURN
陷阱(Trap)和陷阱指令
输入输出操作
CPU寄存器与IO端口之间的数据传送(端口即I/O接口的寄存器)
扩展操作码指令格式
指令寻址
三个字长:
机器字长:CPU一次能处理的二进制数据的位数
指令字长:一个指令字中包含二进制代码的位数
存储字长:一个存储单元存储二进制代码的长度
单字长指令:指令长度=机器字长
半字长指令:指令长度=机器字长的一半
双字长指令:指令长度=机器字长的两倍
指令寻址
下一条欲执行指令的指令地址 (始终由程序计数器PC给出)
顺序寻址:(PC) + “1”(1个指令字长)->PC
跳跃寻址:由转移指令指出
数据寻址
操作码(OP) | 寻址特征 | 寻址地址(A) |
---|
隐含寻址
不是明显地给出操作数的地址,而是在指令中隐含着操作数的地址。
优点:有利于缩短指令字长。
缺点:需增加存储操作数或隐含地址的硬件。
立即寻址
形式地址A就是操作数本身,又称为立即数,一般采用补码形式
(#表示立即寻址特征)
优点:指令执行阶段不访问主存,指令执行时间最短
缺点:A的位数限制了立即数的范围。
如A的位数为n,且立即数采用补码时,可表示的数据范围为\(-2^{n-1}\)~$ 2^{n-1}-1$
直接寻址
指令字中的形式地址A就是操作数的真实地址EA,即EA=A
优点:简单,指令执行阶段仅访问一次主存,不需专门计算操作数的地址。
缺点:A的位数决定了该指令操作数的寻址范围。操作数的地址不易修改。
间接寻址
指令的地址字段给出的形式地址不是操作数的真正地址,而是操作数有效地址所在的存储单元的地址,也就是操作数地址,即EA=(A)。
优点:可扩大寻址范围(有效地址EA的位数大于形式A的位数)。便于编制程序(用间接寻址可以方便地完成子程序返回)。
缺点:指令在执行阶段要多次访存(一次间址需两次访存,多次寻址需根据存储子的最高位确定几次访存)。
寄存器寻址
在指令字中直接给出操作数所在的寄存器编号,即\(EA=R_i\),其操作数在由\(R_i\)所指的寄存器内。
优点:指令在执行阶段不访问主存,只放问寄存器,指令字且执行速度快,支持向量/矩阵运算。
缺点:寄存器价格昂贵,计算机寄存器个数有限。
寄存器间接寻址
寄存器\(R_i\)中给出的不是一个操作数,而是操作数所在主存单元的地址,即\(EA=(R_i)\) 。
特点:与一般间接寻址相比速度更快,但指令的执行阶段需要访问主存(因为操作数在主存中)。
基址寻址
将CPU中基址寄存器(BR)的内容加上指令格式中的形式地址A,而形成操作数的有效地址,即EA=(BR)+A。
采用专用寄存器BR作为基址寄存器:
采用通用寄存器BR作为基址寄存器:
注:基址寄存器是面向操作系统的,其内容由操作系统或管理程序确定。在程序执行过程中,基址寄存器的内容不变(作为基地址),形式地址可变(作为偏移量)。
当采用通用寄存器作为基址寄存器时,可由用户决定哪个寄存器作为基址寄存器,但其内容仍由操作系统确定。
优点:可扩大寻址范围(基址寄存器的位数大于形式地址A的位数);用户不必考虑自己的程序存于主存的哪一空间区域,故有利于多道程序设计,以及可用于编制浮动程序。
变址寻址
有效地址EA等于指令字中的形式地A与变址寄存器IX的内容相加之和,即EA=(IX)+A,其中IX为变址寄存器(专用),也可用通用寄存器作为变址寄存器。
注:变址寄存器时面向用户的,在程序执行过程中,变址寄存器可由用户改变(作为偏移量),形式地址A不变(作为基地址)。
优点:可扩大寻址范围(变址寄存器的位数大于形式地址A的位数);在数组处理过程中,可设定A为数组的首地址,不断改变变址寄存器IX的内容,便可很容易形成数组中任一数据的地址,特别适合编制循环程序。
基址&变址复合寻址
先基址后变址寻址:EA=(IX)+((BR)+A)
相对寻址
把程序计数器PC的内容加上指令格式的形式地址A而形成操作数的有效地址,即EA=(PC)+A,其中A是相对于PC所指地址的位移量,可正可负,补码表示。
优点:操作数的地址不是固定的,它随着PC值的变化而变化,并且与指令地址之间总是相差一个固定值,因此便于程序浮动。
相对寻址广泛应用于转移指令。
堆栈寻址
操作数存放在堆栈中,隐含使用堆栈指针(SP)作为操作数地址。
堆栈是存储器(或专用寄存器组)中一块特定的按"后进先出(LIFO)"原则管理的存储区,该存储区中读/写单元的地址是用一个特定的寄存器给出的,该寄存器称为堆栈指针(SP)。
用寄存器组实现的堆栈称为硬堆栈;用存储器实现的堆栈称为软堆栈。
堆栈可用于函数调用时保持当前函数的相关信息。
CISC和RISC
CISC
Complex Instruction Set Computer
设计思路:一条指令完成一个复杂的基本功能。
代表:x86架构,主要用于笔记本、台式机等
80-20规律:典型程序中80%的语句仅仅使用处理机中20%的指令。
RISC
Reduced Instruction Set Computer
设计思路:一条指令完成一个基本"动作";多条指令组合完成一个复杂的基本功能。
代表:ARM架构,主要用于手机、平板等。
对比
对比项目类型 | CISC | RISC |
指令系统 | 复杂,庞大 | 简单,精简 |
指令数目 | 一般大于200条 | 一般小于100条 |
指令字长 | 不固定 | 定长 |
可访存指令 | 不加限制 | 只有Load/Store指令 |
各种指令执行时间 | 相差较大 | 绝大多数在一个周期内完成 |
各种指令使用频度 | 相差很大 | 都比较常用 |
通用寄存器数量 | 较少 | 多 |
目标代码 | 难以用优化编译生成高效的目标代码 | 采用优化的编译程序,生成代码较为高效 |
控制方式 | 绝大多数为微程序控制 | 绝大多数为组合逻辑控制 |
指令流水线 | 可以通过一定方式实现 | 必须实现 |