4.指令系统
指令系统
指令的概念和格式
指令:指计算机执行某种操作的命令,是计算机运行的最小功能单位
计算机的所有指令的集合构成该机的指令系统,也称为指令集
一条指令是机器语言的一个语句,是一组有意义的二进制代码,由操作码字段和地址码字段两部分组成
按地址码长度分类:
而根据指令的不同,一条指令可能包含多个地址码,根据地址码数目的不同,可以将指令分为零地址指令,一地址指令……
- 零地址指令
- 不需要操作数,如空操作,停机,关中断等指令,
- 堆栈计算机,两个操作数隐含存放在栈顶和次栈顶,计算结果压回栈顶
- 一地址指令
- 只需要单操作数,如加1,取反等操作
- 需要两个操作数,但其中一个操作数隐含在某个寄存器中(比如ACC)
- 二,三地址指令
常用于需要两个操作数的算数运算,逻辑运算等相关指令
四地址指令
常是运算之后接跳转指令
按指令长度分类
指令字长:一条指令的总长度(可改变)
机器字长:CPU进行一次正数运算所能处理的二进制数据的位数(与ALU有关)
存储字长:一个存储单元中的二进制代码位数(通常和MDR位数相同)
指令的长度会影响到取指令所需时间,可以把指令分为定长指令字结构和变长指令字结构
按操作码长度分类
可以分为定长操作码和可变长操作码
按操作类型分类
数据传送
LOAD :把存储器的数据放到寄存器中
STORE : 把寄存器的数据放到存储器中
运算
算数运算:加减乘除,浮点运算
逻辑运算:与或非,异或,取反
移位
算数移位,逻辑移位,循环移位
转移
无条件转移 JMP
条件转移 JZ
调用和返回 CALL 和 RETURN
陷阱(Trap)
输入输出
CPU寄存器和IO端口之间的数据传送
拓展操作码指令格式
有定长指令字结构+可变长操作码 →拓展操作码的指令格式
即不同地址数使用不同长度的操作码
假设指令字长为16位,每个地址码占4位,前4位为基本操作码字段OP
三地址指令地址码占据$A_1,A_2,A_3$,而OP表示操作码,则可以表示16条,但至少保留1111留作拓展操作码用,三地址指令为15条
二地址指令地址码占据$A_2,A_3$,1111 1111留作拓展操作码使用,共15条
一地址指令地址码占据$A_3$,1111 1111 1111 留作拓展操作码使用
零地址指令共16条
扩展码有两点特点:
不允许短码是长码的前缀(哈夫曼树)
各指令的操作码不允许重复
至于根据不同地址指令拓展出适应的地址码,可以参考计算机网络的子网划分问题。
定长操作码的优点是可以简化计算机硬件设计,提高指令译码和识别速度很有利,缺点是指令数量增加会占用更多固定位,留给操作数地址的位数受限
拓展操作码可以在指令字长有限的情况下保留比较丰富的指令种类,但是增加了指令译码和分析的难度,使控制器的设计复杂化
指令寻址
寻找下一条将要执行的指令地址称为指令寻址
有两种方式
顺序寻址
通过程序计数器PC+1,自动形成下一条指令的地址
跳跃寻址
通过转移类指令实现,跳跃就是指下条指令的地址不由程序计数器PC自动给出,而由本条指令给出下条指令地址的计算方式。跳跃指令之后会修改PC的值
数据寻址
确定本条指令的地址码指明的真实地址
由于数据寻址的方式很多,为了区分各种方式,通常在指令字中设一个字段,来指明属于何种寻址方式
数据寻址一共有10种方式
直接寻址
指令中的形式地址就是操作数的真实地址EA
优点:简单,指令执行阶段仅访问一次主存,不需专门计算操作数的地址
缺点:A的位数决定了该指令操作数的寻址范围,操作数的地址不易修改
间接寻址
指令的地址字段给出的形式地址不是操作数的真正地址,而是操作数有效地址所在的存储单元的地址,也就是操作数地址的地址 EA=(A)
优点:可扩大寻址范围,便于编址程序(跳转)
缺点:指令在执行过程中要多次访存
寄存器寻址
在指令字中直接给出寄存器的编号,$EA=R_i$,操作数存储在寄存器中
优点:指令在执行阶段不访问主存,只访问寄存器,指令字短而且执行速度快
缺点:寄存器价格昂贵,寄存器个数有限
寄存器间接寻址
寄存器中给出的不是一个操作数,而是操作数所在主存单元的地址
优点:相比于间接访存,速度更快
隐含寻址
不是明显地给出操作数地址,而是在指令中隐含操作数的地址
优点:有利于缩短指令字长
缺点:需增加存储操作数或隐含地址的硬件
立即寻址
形式地址A就是操作数本身,又称为立即数,一般采用补码形式,#表示立即寻址方式
优点:执行阶段不访问主存
缺点:A的位数限制了立即数的范围
基址寻址
将CPU中基址寄存器(BR)的内容加上指令格式中的形式地址A,而形成操作数的有效地址,即EA=(BR)+A
也可以用其他寄存器作为基址寄存器
基址寄存器是面向操作系统的,其内容由操作系统或管理程序确定。在程序执行过程中,基址寄存器的内容不变,形式地址可变
优点:可扩大寻址范围,有利于多道程序设计,编址浮动程序
变址寻址
有效地址EA等于指令字中的形式地址A与变址寄存器IX的内容相加之和
和基址寻址的区别是,变址寄存器中的地址可以被改变,而形式地址不变,即IX作为偏移量,而形式地址作为基址
在编制循环程序的时候,可以让数组的起始地址作为形式地址,IX不断增加,来处理数组
相对寻址
把程序计数器PC的内容加上指令格式中的形式地址A而形成操作数的有效地址,即EA=(PC)+A,其中A是相对于PC所指地址的偏移量,补码表示
取出当前指令后,PC会指向下一条指令,相对寻址是相对于下一条指令的偏移量
优点:操作数的地址不是固定的,随PC值的变化而变化,并且与指令地址之间总是相差一个固定值,因此便于程序浮动,广泛用于转移指令
堆栈寻址
操作数放在堆栈中,隐含使用堆栈指针SP作为操作数地址
硬堆栈使用专用的寄存器作为堆栈,而软堆栈是在主存中开辟一段地址作为堆栈使用
可用于函数调用时保存当前函数的相关信息
CISC和RISC
CISC:Complex Instruction Set Computer 复杂指令集
主要是X86架构,主要用于笔记本,台式机等
一条指令能完成一个复杂的基本功能
RISC:Reduced Instruction Set Computer 精简指令集
主要是ARM架构,主要用于手机,平板
一条指令完成一个基本动作,多条指令组合完成一个复杂的基本功能