指令系统


指令的概念和格式

指令:指计算机执行某种操作的命令,是计算机运行的最小功能单位

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

一条指令是机器语言的一个语句,是一组有意义的二进制代码,由操作码字段和地址码字段两部分组成

image-20220316185716163


地址码长度分类:

而根据指令的不同,一条指令可能包含多个地址码,根据地址码数目的不同,可以将指令分为零地址指令,一地址指令……

  • 零地址指令
  1. 不需要操作数,如空操作,停机,关中断等指令,
  2. 堆栈计算机,两个操作数隐含存放在栈顶和次栈顶,计算结果压回栈顶
  • 一地址指令
  1. 只需要单操作数,如加1,取反等操作
  2. 需要两个操作数,但其中一个操作数隐含在某个寄存器中(比如ACC)
  • 二,三地址指令

​ 常用于需要两个操作数的算数运算,逻辑运算等相关指令

  • 四地址指令

    常是运算之后接跳转指令


指令长度分类

指令字长:一条指令的总长度(可改变)

机器字长:CPU进行一次正数运算所能处理的二进制数据的位数(与ALU有关)

存储字长:一个存储单元中的二进制代码位数(通常和MDR位数相同)

指令的长度会影响到取指令所需时间,可以把指令分为定长指令字结构和变长指令字结构


操作码长度分类

可以分为定长操作码和可变长操作码


操作类型分类

  1. 数据传送

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

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

  2. 运算

    算数运算:加减乘除,浮点运算

    逻辑运算:与或非,异或,取反

  3. 移位

    算数移位,逻辑移位,循环移位

  4. 转移

    无条件转移 JMP

    条件转移 JZ

    调用和返回 CALL 和 RETURN

    陷阱(Trap)

  5. 输入输出

    CPU寄存器和IO端口之间的数据传送


拓展操作码指令格式

定长指令字结构+可变长操作码 →拓展操作码的指令格式

即不同地址数使用不同长度的操作码

假设指令字长为16位,每个地址码占4位,前4位为基本操作码字段OP

image-20220316195954835

三地址指令地址码占据$A_1,A_2,A_3$,而OP表示操作码,则可以表示16条,但至少保留1111留作拓展操作码用,三地址指令为15条

二地址指令地址码占据$A_2,A_3$,1111 1111留作拓展操作码使用,共15条

一地址指令地址码占据$A_3$,1111 1111 1111 留作拓展操作码使用

零地址指令共16条

扩展码有两点特点:

  1. 不允许短码是长码的前缀(哈夫曼树)

  2. 各指令的操作码不允许重复

至于根据不同地址指令拓展出适应的地址码,可以参考计算机网络的子网划分问题。


定长操作码的优点是可以简化计算机硬件设计,提高指令译码和识别速度很有利,缺点是指令数量增加会占用更多固定位,留给操作数地址的位数受限

拓展操作码可以在指令字长有限的情况下保留比较丰富的指令种类,但是增加了指令译码和分析的难度,使控制器的设计复杂化


指令寻址

寻找下一条将要执行的指令地址称为指令寻址

有两种方式

  1. 顺序寻址

    通过程序计数器PC+1,自动形成下一条指令的地址

  2. 跳跃寻址

    通过转移类指令实现,跳跃就是指下条指令的地址不由程序计数器PC自动给出,而由本条指令给出下条指令地址的计算方式。跳跃指令之后会修改PC的值


数据寻址

确定本条指令的地址码指明的真实地址

由于数据寻址的方式很多,为了区分各种方式,通常在指令字中设一个字段,来指明属于何种寻址方式

image-20220316211519385

数据寻址一共有10种方式

image-20220316211559572


直接寻址

指令中的形式地址就是操作数的真实地址EA

image-20220317193218843

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

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


间接寻址

指令的地址字段给出的形式地址不是操作数的真正地址,而是操作数有效地址所在的存储单元的地址,也就是操作数地址的地址 EA=(A)

image-20220317193609475

优点:可扩大寻址范围,便于编址程序(跳转)

缺点:指令在执行过程中要多次访存


寄存器寻址

在指令字中直接给出寄存器的编号,$EA=R_i$,操作数存储在寄存器中

image-20220317194055642

优点:指令在执行阶段不访问主存,只访问寄存器,指令字短而且执行速度快

缺点:寄存器价格昂贵,寄存器个数有限


寄存器间接寻址

寄存器中给出的不是一个操作数,而是操作数所在主存单元的地址

image-20220317194346370

优点:相比于间接访存,速度更快


隐含寻址

不是明显地给出操作数地址,而是在指令中隐含操作数的地址

image-20220317194558522

优点:有利于缩短指令字长

缺点:需增加存储操作数或隐含地址的硬件


立即寻址

形式地址A就是操作数本身,又称为立即数,一般采用补码形式,#表示立即寻址方式

优点:执行阶段不访问主存

缺点:A的位数限制了立即数的范围


基址寻址

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

image-20220317201400881

也可以用其他寄存器作为基址寄存器

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

优点:可扩大寻址范围,有利于多道程序设计,编址浮动程序


变址寻址

有效地址EA等于指令字中的形式地址A与变址寄存器IX的内容相加之和

image-20220317202334313

和基址寻址的区别是,变址寄存器中的地址可以被改变,而形式地址不变,即IX作为偏移量,而形式地址作为基址

在编制循环程序的时候,可以让数组的起始地址作为形式地址,IX不断增加,来处理数组


相对寻址

把程序计数器PC的内容加上指令格式中的形式地址A而形成操作数的有效地址,即EA=(PC)+A,其中A是相对于PC所指地址的偏移量,补码表示

image-20220317203643274

取出当前指令后,PC会指向下一条指令,相对寻址是相对于下一条指令的偏移量

优点:操作数的地址不是固定的,随PC值的变化而变化,并且与指令地址之间总是相差一个固定值,因此便于程序浮动,广泛用于转移指令


堆栈寻址

操作数放在堆栈中,隐含使用堆栈指针SP作为操作数地址

硬堆栈使用专用的寄存器作为堆栈,而软堆栈是在主存中开辟一段地址作为堆栈使用

可用于函数调用时保存当前函数的相关信息

image-20220317215800055


CISC和RISC

CISC:Complex Instruction Set Computer 复杂指令集

主要是X86架构,主要用于笔记本,台式机等

一条指令能完成一个复杂的基本功能


RISC:Reduced Instruction Set Computer 精简指令集

主要是ARM架构,主要用于手机,平板

一条指令完成一个基本动作,多条指令组合完成一个复杂的基本功能


image-20220319143707720