一条指令就是机器语言的一个语句,它是一组有意义的二进制代码。
一条指令通常包括操作码字段和地址码字段两部分。
(1)操作码OP:指出指令中应该执行什么性质的操作和具有何种功能。即进行什么操作,如取数、乘法、加法、停机
(2)地址码Ai:给出被操作的信息(指令或者数据)的地址。即对谁进行操作
(1)指令字长:一条指令的总长度(可能会变)
(2)机器字长:CPU进行一次整数运算所能处理的二进制数据的位数(通常和ALU直接相关)(固定不变)
(3)存储字长:一个存储单元中的二进制代码位数(通常和MDR位数相同)(固定不变)
指令字长会影响取指令所需时间。如:机器字长=存储字长=16bit,则取一条双字长指令(32bit)需要两次访存
①按指令长度分类
②按操作码长度分类
只给出操作码,没有给出地址。
①不需要操作数的指令。如停机指令、空操作指令、关中断指令。
②零地址的运算类指令仅使用在堆栈计算机中
通常参与运算的两个操作数隐含的从栈顶和次栈顶弹出,送到运算器进行运算,运算结果再隐含地压入堆栈。
类似于用栈实现中缀转后缀,详见3-2栈和队列-应用-2.表达式求值-(6)用栈实现中缀转后缀(运算符栈)
给出操作码和一个地址码。若指令字长32位,操作码8位,地址码24位,则指令操作数直接寻址范围为224,其他同理
①只有目的操作数的单操作指令
按A1读取操作数,进行OP操作后,结果存回源地址。对地址码指定位置的操作数进行操作码操作,存回地址码指定位置OP(A1)→A1
如:加1、减1、取反
②隐含约定目的地址的双操作数指令
按指令地址A1读取源操作数,指令可隐含约定。另一个操作数由ACC提供,运算结果也存入ACC中。对地址码指定位置的操作数与ACC存放的操作数进行操作码运算,结果存入ACC,即(ACC)OP(A1)→ACC
如:加法、减法、乘法、除法
给出操作码和两个地址码。常用于需要两个操作数的算术运算、逻辑运算相关指令。
对目的地址码A1指明的目的操作数和源地址码A2指明的源操作数进行操作码执行的运算,结果存回目的操作数的地址A1(目的地址码),即(A1)OP(A2)→A1
(A1)OP(A2)→A3
需要四次访存:取指令、取两个操作数、存放结果
(A1)OP(A2)→A3,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种
传送指令通常有寄存器之间的传输(MOV)、从内存单元读取数据到CPU寄存器(LOAD)(如取a置ACC)、从CPU寄存器写数据到内存单元(STORE)(如将存放在ACC中的计算结果写回主存)
加(ADD)、减(SUB)、比较(CMP)、乘(MUL)、除(DIV)、加1(INC)、减1(DEC)、与(AND)、或(OR)、取反(NOT)、异或(XOR)
算法移位、逻辑移位、循环移位等
无条件转移(JMP)、条件转移(BRANCH)、调用(CALL)、返回(RET)、陷阱(TRAP)等。无条件转移指令在任何情况下都执行转移操作,而条件转移指令仅在特定条件满足时才执行转移操作,转移条件一般是某个标志位的值,或几个标志位的组合。(转移主要依靠PC的指向)
这类指令用于完成CPU与外部设备交换数据或传送控制命令及状态信息。
按指令的操作类型分类:
(1)数据传送类:进行主存和CPU之间的数据传送(数据传送)
(2)运算类:算术逻辑操作、移位操作
(3)程序控制类:改变程序执行的的顺序(转移操作)
(4)输出/输出类:进行CPU和I/O设备之间的数据传送(输入输出操作)