4-1指令系统-指令格式

一.指令的基本格式

一条指令就是机器语言的一个语句,它是一组有意义的二进制代码。

1.结构

一条指令通常包括操作码字段和地址码字段两部分。
(1)操作码OP:指出指令中应该执行什么性质的操作和具有何种功能。即进行什么操作,如取数、乘法、加法、停机
(2)地址码Ai:给出被操作的信息(指令或者数据)的地址。即对谁进行操作

2.长度

(1)指令字长:一条指令的总长度(可能会变)
(2)机器字长:CPU进行一次整数运算所能处理的二进制数据的位数(通常和ALU直接相关)(固定不变)
(3)存储字长:一个存储单元中的二进制代码位数(通常和MDR位数相同)(固定不变)

  • 什么是指令字长、机器字长和存储字长?
    指令字长是指一个指令字中包含二进制代码的位数。机器字长指计算机能直接处理的二进制数据的位数。存储字长指一个存储单元存储一串二进制代码(存储字)的位数。

指令字长会影响取指令所需时间。如:机器字长=存储字长=16bit,则取一条双字长指令(32bit)需要两次访存

①按指令长度分类

  • 单字长指令:长度等于机器字长
  • 双字长指令:长度等于两倍机器字长
  • 半字长指令:长度等于半个机器字长
  • 定长指令字结构:所有指令长度相同
  • 变长指令字结构:各种指令长度不同

②按操作码长度分类

  • 定长操作码:指令系统中所有指令的操作码长度都相同。n位的操作码可以支持2n条指令。控制器的译码电路设计简单,但灵活性较低
  • 可变长操作码:指令系统中各指令的操作码长度可变。控制器的译码电路设计复杂,但灵活性较高

3.根据操作数地址码数目分类

(1)零地址指令

只给出操作码,没有给出地址。
①不需要操作数的指令。如停机指令、空操作指令、关中断指令。
②零地址的运算类指令仅使用在堆栈计算机中
通常参与运算的两个操作数隐含的从栈顶和次栈顶弹出,送到运算器进行运算,运算结果再隐含地压入堆栈。
类似于用栈实现中缀转后缀,详见3-2栈和队列-应用-2.表达式求值-(6)用栈实现中缀转后缀(运算符栈)

(2)一地址指令

给出操作码和一个地址码。若指令字长32位,操作码8位,地址码24位,则指令操作数直接寻址范围为224,其他同理

在这里插入图片描述

①只有目的操作数的单操作指令
按A1读取操作数,进行OP操作后,结果存回源地址。对地址码指定位置的操作数进行操作码操作,存回地址码指定位置OP(A1)→A1
如:加1、减1、取反

  • A1指某个主存地址,(A1)表示A1所指向的地址中的内容
  • 需要三次访存:取指令、取操作数、存放结果

②隐含约定目的地址的双操作数指令
按指令地址A1读取源操作数,指令可隐含约定。另一个操作数由ACC提供,运算结果也存入ACC中。对地址码指定位置的操作数与ACC存放的操作数进行操作码运算,结果存入ACC,即(ACC)OP(A1)→ACC
如:加法、减法、乘法、除法

  • 需要两次访存:取指令、取操作数

(3)二地址指令

给出操作码和两个地址码。常用于需要两个操作数的算术运算、逻辑运算相关指令。
对目的地址码A1指明的目的操作数和源地址码A2指明的源操作数进行操作码执行的运算,结果存回目的操作数的地址A1(目的地址码),即(A1)OP(A2)→A1

  • 需要四次访存:取指令、取两个操作数、存放结果

(4)三地址指令

(A1)OP(A2)→A3
需要四次访存:取指令、取两个操作数、存放结果

在这里插入图片描述

(5)四地址指令

(A1)OP(A2)→A3,A4指明下一条要执行指令的地址

  • 需要四次访存:取指令、取两个操作数、存放结果
  • 正常情况下,取指令后(PC)+1→PC,PC自动指向下一条指令。但在四地址指令中,应该将PC的值修改为A4所指向的地址

在这里插入图片描述

二.扩展操作码指令格式

扩展操作码是定长指令字结构(所有指令长度相同)和可变长操作码(操作码的长度可变)的结合。操作码的长度随地址码的减少而增加,不同地址数的指令可具有不同长度的操作码,从而在满足需要的前提下,有效地缩短指令字长。但增加了指令译码和分析的难度,使控制器的设计复杂化。

1.三地址指令:OP4位,0000~1110,15条
对于三地址指令,前4位为基本操作码OP,后面三个地址字段A1、A2、A3分别占4位,指令字长共16位。4位基本操作码若全部用于三地址指令,即从0000到1111共16条。为保证零地址、一地址、二地址指令的使用,需留出1111开头的OP作为扩展操作码。因此三地址指令共15条。
在这里插入图片描述
2.二地址指令:OP8位,11110000~11111110,15条
对于二地址指令,前8位为基本操作码OP,后面两个地址字段A1、A2分别占4位,指令字长共16位(不变)。8位基本操作码若全部用于二地址指令,二地址指令的OP以111开头,范围1111 0000~1111 1111,共16条。同样二地址指令需要将1111 1111开头的OP留作扩展操作码,供一地址和零地址使用。因此二地址指令共15条。

3.一地址指令:OP12位,111111110000~111111111110,15条
对于一地址指令,前12位为基本操作码OP,后面一个地址字段A1占4位,指令字长共16位(不变)。12位基本操作码全部用于一地址指令,一地址指令以1111 1111开头,范围1111 1111 0000~1111 1111 1111,共16位。同样一地址指令需要将1111 1111 1111开头的OP留作扩展操作码,供零地址使用。因此一地址指令共15条。

4.零地址指令:OP16位,1111111111110000~1111111111111111,16条
对于零地址指令,16位全部为基本操作码OP,指令字长16位(不变)。16位基本操作码全部用于零地址指令,范围1111 1111 1111 0000~1111 1111 1111 1111,共16条。

可以看出,操作码的长度随地址码的减少而增加,使得所有指令长度相同。

以上设计满足:
①不允许短码是长码的前缀
②各指令的操作码一定不能重复
(类似于哈夫曼编码)

通常来说,对于使用频率较高的指令分配较短的操作码,从而尽可能减少指令译码和分析的时间。

[例] 设指令字长固定为16位试设计一套指令系统满足:有15条三地址指令,12条二地址指令,62条一地址指令,32条零地址指令

解:
①三地址指令:0000~1110
②二地址指令:1111 0000~1111 1011
③一地址指令:
1111 1100 0000~1111 1100 1111
1111 1101 0000~1111 1101 1111
1111 1110 0000~1111 1110 1111
1111 1111 0000~1111 1111 1101(零地址32条,至少留2组,即10和11)
④零地址指令:
1111 1111 1110 0000~1111 1111 1110 1111
1111 1111 1111 0000~1111 1111 1111 1111

注:设地址长度为n,上一层留出m种状态,下一层可扩展出m×2n种状态

在本例中地址长度为4,三地址指令留出一位给二地址,二地址可扩展出1×24=16种状态,而二地址只需要12条,给一地址留出4条。一地址可扩展出4×24=64种,而一地址只需要62种,留个零地址指令2种。零地址指令可扩展出2×24=32种

三.指令的操作类型

1.数据传送

传送指令通常有寄存器之间的传输(MOV)、从内存单元读取数据到CPU寄存器(LOAD)(如取a置ACC)、从CPU寄存器写数据到内存单元(STORE)(如将存放在ACC中的计算结果写回主存)

2.算术逻辑单元

加(ADD)、减(SUB)、比较(CMP)、乘(MUL)、除(DIV)、加1(INC)、减1(DEC)、与(AND)、或(OR)、取反(NOT)、异或(XOR)

在这里插入图片描述

3.移位操作

算法移位、逻辑移位、循环移位等

4.转移操作

无条件转移(JMP)、条件转移(BRANCH)、调用(CALL)、返回(RET)、陷阱(TRAP)等。无条件转移指令在任何情况下都执行转移操作,而条件转移指令仅在特定条件满足时才执行转移操作,转移条件一般是某个标志位的值,或几个标志位的组合。(转移主要依靠PC的指向)

  • 调用指令和转移指令的区别
    执行调用指令时必须保存下一条指令的地址(返回地址),当子程序执行结束时,根据返回地址返回到主程序继续执行;而转移指令则不返回执行。

5.输入输出操作

这类指令用于完成CPU与外部设备交换数据或传送控制命令及状态信息。

按指令的操作类型分类:
(1)数据传送类:进行主存和CPU之间的数据传送(数据传送)
(2)运算类:算术逻辑操作、移位操作
(3)程序控制类:改变程序执行的的顺序(转移操作)
(4)输出/输出类:进行CPU和I/O设备之间的数据传送(输入输出操作)

猜你喜欢

转载自blog.csdn.net/weixin_45825865/article/details/128733862