指令
OP(操作码) | A(指令存放地址) |
---|
- 指令由操作码和若干个地址码组成。
- 定长指令字结构(指令总长度不变)的指令系统中所有指令的长度都相等
- 变长指令字结构(指令总长度需要改变)的指令系统中各种指令的长度不等
指令操作码OP
操作码指出指令中该指令应该执行什么性质的操作和具有何种功能。
操作码是识别指令、了解指令功能与区分操作数地址内容的组成和使用方法等的关键信息。
- 定长操作码指令系统中所有指令的操作码长度都相同
- 可变长操作码指令系统中各指令的操作码长度可变
操作码分类:
- 定长操作码:在指令字的最高位部分分配固定的若干位(定长)表示操作码。
- 一般n位操作码字段的指令系统最大能够表示 2^n 条指令。
- 优:定长操对于简化计算机硬件设计,提高指令译码和识别速度很有利;
- 缺:指令数量增加时会占用更多固定位,留给表示操作数地址的位数受限。
- 扩展操作码(不定长操作码):全部指令的操作码字段的位数不固定,且分散地放在指令字的不同位置上。
- 最常见的变长操作码方法是扩展操作码,使操作码的长度随地址码的减少而增加,不同地址数的指令可以具有不同长度的操作码,从而在满足需要的前提下,有效地缩短指令字长。
- 优:在指令字长有限的前提下仍保持比较丰富的指令种类;
- 缺:增加了指令译码和分析的难度,使控制器的设计复杂化。
例:某三地址指令
- 某三地址指令:当指令字长为16位,每个地址码占4位。
- 则前四位为基本操作码字段OP,另外三个4位长的地址字段A1、A2、A3。
- 4位基本操作码若全部用于三地址指令,则有2^4=16条
OP | A1 | A2 | A3 |
---|
拓展操作码
- 定长指令字结构+可变长操作码 = 扩展操作码指令格式
- 三地址指令,我们有16个,但是只用15个,然后留下1111作为其他类型的开头
- 二地址指令,我们有16个,但是只用15个,然后留下1111 1111作为其他类型的开头
- 一地址指令,我们有16个,但是只用15个,然后留下1111 1111 1111作为其他类型的开头
- 零地址指令,我们有 1 X 2^4 = 16个。
设计扩展操作码指令格式时注意点
对比哈夫曼树“前缀编码”
- 不允许短码是长码的前缀,即短操作码不能与长操作码的前面部分的代码相同。
- 各指令的操作码一定不能重复。
注:通常情况下,
- 对使用频率较高的指令,分配较短的操作码;例如三地址指令。
- 对使用频率较低的指令,分配较长的操作码,从而尽可能减少指令译码和分析的时间。
设计例题
设指令字长固定为16位,试设计一套指令系统满足:
- a) 有15条三地址指令
- b) 有12条二地址指令
- c) 有62条一地址指令
- d) 有32条零地址指令
- a) 有15条三地址指令,共2^4种,留出1种,选择0000-1110,共15个,给后辈留下1111
- b) 有12条二地址指令,共1 X 2^4 种,留出 16 - 12 = 4 种
- c) 有62条一地址指令,共4 X 2^4 种,留出 64 - 62 = 2 种。1100 - 1110 有三段,搭配0000-1111,即16*3 = 48
- d) 有32条零地址指令,共2 X 2^4 种,即一个不留,就是32种。
CPU如何判断是几地址指令?
- CPU一次性读入16bit,然后判断前四位,不是全1,就是三地址指令, 然后依次判断二地址、一地址、零地址