文章目录
- 一.指令的基本格式
- 1.结构
- 2.长度
- 3.根据操作数地址码数目分类
- (1)零地址指令
- (2)一地址指令
- (3)二地址指令
- (4)三地址指令
- (5)四地址指令
- 二.扩展操作码指令格式
- 三.指令的操作类型
- 1.数据传送
- 2.算术逻辑单元
- 3.移位操作
- 4.转移操作
- 5.输入输出操作
一.指令的基本格式
一条指令就是机器语言的一个语句,它是一组有意义的二进制代码。
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
③一地址指令:在以下范围内任取62条
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设备之间的数据传送(输入输出操作)