4.1.2扩展操作码指令格式

一、前言

在这里插入图片描述
在这个小节中,我们要学习拓展操作码这种指令格式, 那什么是拓展操作码呢? 通过上小节的学习, 我们知道指令是由一个操作码还有若干个地址码组成,如果整个指令系统中所有指令的长度固定不变, 那我们就称这种指令系统为定长指令字结构,与之相对应的叫变长指令字结构。另一方面 如果从操作码的长度是否固定不变, 我们又可以把指令分为定长操作码格式 ,还有可变长操作码格式。
在这里插入图片描述
在这里插入图片描述
那这个小节当中我们要学习的扩展操作码指令格式就是在指令的总长度固定不变前提下(就是采用定长指令字结构),让操作码的长度可变,采用这种策略就意味着,对于不同的地址数量(地址码的数量不一样)的指令 ,我们可以给它设定长度不同的操作码。下面看一下如何设置这种指令格式的指令集。

二、 扩展方式1

在这里插入图片描述

我们假设指令字长是16位,每个地址码会占四位 ,那么如果我们要设计一些三地址指令, 就意味着三个地址码总共会占12位 ,那指令总长是16 位, 因此我们只会剩余四位用来表示三地址指令的这个操作码。
在这里插入图片描述

那么四位操作码最多可以表示二的四次方也就是16种状态,也就是说三地址指令我们最多可以设置16条 ,但是如果我们还想设计二地址、一地址、零地址指令 ,那么我们必须保留四个操作码全为一这种状态,留作扩展操作码来使用 。也就是说我们最多只能有15条三地址指令。操作码的范围应该是四个全0直到1110,那这么做是因为我们还需要添加一些二地址指令。
在这里插入图片描述
那所有的二地址指令开头的四位一定是全一,所以这样大家就可以理解为什么三地址指令当中我们要保留四个全一的状态,事实上 cpu在取得一条指令的时候 ,一定是直接读入 16 位,那么根据开头的这几位是否为全一,cpu就可以判断这是一条三地址指令,还是一条二地址指令 ,如果说开头的四位都是全一,然后后面的这四位不是全一那这一定就是一个二地址指令, 那大家也会发现,我们只设置了15 条二地址指令,。
在这里插入图片描述
同样的原理, 后面的这四位全一的这种状态, 我们会把它留下来作为扩展,对于所有的一地址指令来说, 前边的八位都会是全一,同样的,这种设计是为了能够让cpu判断,这是一条几地址的指令 ,同样的道理 ,一地址指令也只能取 15 条 ,最后这四位全一的状态,会用作拓展为零地址指令。

在这里插入图片描述

那当前边的12 位都是一的时候 ,说明这是一条零地址指令,对于零地值指令来说, 我们就可以取后边的四位为全零一直到全一总共有16种状态,因为我们不需要再往后拓展了 。

当然这个地方 我们只是给出了其中一种扩展操作码的设计方法,还可以有其他的设计方法, 这个我们一会再来补充, 那这需要强调的是对于扩展操作码 指令格式来说,我们在设计的时候需要注意这样的两个点 :
(1)第一点也是最重要的一点 ,不允许短码是长码的前缀
这点大家如果之前学过数据结构的话, 那我们在数据结构里面讲过哈夫曼术实现的哈夫曼编码,哈弗曼编码是一种前缀编码 ,同样有这样的一个规定 : 短的编码不能是长编码的前缀,比如对于二地指指令来说, 二地指指令的操作码是前边的八位,这是一个比较长的操作码, 那相比之下 ,三地址指令的操作码就只有四位,三地址指令的操作码是更短的操作码, 那现在来看下这句话 ,不允许短码是长码的前缀,也就是说不允许短操作码和长操作码的前边部分代码相同 ,对于二地址指令来说, 前边的四个比特都是全一,那么 也就意味着三地值指令的这四个操作码不能是全一的状态,否则 就不满足这的第一个条件
(2)第二点 ,各指令的操作码一定不能重复 ,这个是必须的,如果操作码重复了, 那cpu还怎么判断需要进行的是什么操作呢 ?

以上就是设计扩展操作码指令格式的时候需要注意的两个点,特别需要注意第一个点 ,通常我们可以把使用频率更高的指令分配更短的操作码,因为操作码越短, 那么就意味着这个操作码的指令译码和分析的时间可以减短,电路设计起来会更简单 ,那使用频率高的指令, 我们给它分配更短的操作码, 是不是就意味着,我们可以有更大的概率可以使得我们操作码的这个译码变得更快。 这个思想也类似于哈弗曼编码,大家可以和数据结构的这个部分对比的学习。
在这里插入图片描述

三、扩展方式2

现在我们在基于刚才那个条件来设计另外一种扩展操作码 ,同样的指令字长固定为 16 位,每个地址码我们规定需要四位,现在我们要求设计出具有 15条三地质指令,12条二地质指令,62条一地质指令和32条零地值指令的一个扩展操作码。
在这里插入图片描述

对于三地址指令 ,我们需要保留后边的12位用来表示三个地址,那么总共 16 位的指令就只会剩下开头的四位用来表示操作码, 那我们需要表示15条三d指令,那这个操作码的范围就应该是0000 直到1110 ,总共有15种状态,然后会留下四个全一作为扩展操作码。
在这里插入图片描述
接下来二地指指令只需要有12条, 对于二地址指令来说 他开头的四个比特一定是全一,由于我们只需要保留两个地址,每个地址是四位, 因此我们只能用中间的这四位来表示12条二地址指令,那我们可以取四个全0直到 1011, 翻译成十进制的话就是0-11,这样的12种状态来分别对应12条二地址指令的操作码,那大于1011的数还剩下1100、1101、1110、1111 ,那会发现我们留下的剩余的这几种状态,最高的这两位一定都是全一的,所以接下来如果开头的六位都是全一那么就超出了二地指指令的一个范围。

在这里插入图片描述

现在我们要设计的是一地址指令, 一地址指令只需要保留最后的四位来表示地址,我们可以用这剩下的六个比特来表示不同的一地指指令,总共需要有62 条一地址指令,因此我们只需要用这六个比特来分别表示0-61,用这样的62种状态来表示一地址指令就可以了,那对应为二进制就应该是000000直到111101 ,这就是0-61的一个表示范围, 那在这个表当中我们又给出了,a一和a二这两个部分可以取得的一个合法的范围 ,其实和我们下边给的这个范围是同一个意思,只不过下面我们这种描述,是描述了这整整的六位所能表示的一个范围,而在这个表当中 ,我们是以四位为一组来分别描述可以取得的一个范围,可以看到 ,我们需要62条一地址指令,。
在这里插入图片描述

根据刚才分析可以知道, 如果说前边的这11 位全都是一的话,那么就超出了一地址指令的一个范围 ,因为刚才我们说了对一地址指令来说,这六个比特的范围应该是000000一直到直到111101 ,这样的一个范围,那如果说再往上加一的话 是不是就变成了111110这样的一个状态,所以这五个1再拼接上刚开始 留下的总共六个1,那就是有11个比特为一,当有11个bit全为1时,就已经超出了一地址指令操作码的一个范围,最后我们需要有32条零地址指令, 那么我们剩下的这五个比特刚好可以表示0-31这个数字的范围,所以零地值指令的范围就是后边这五个比特分别是全零一直到全一这32种状态,

这就是另一种扩展操作码的设计方式, 大家需要根据每一种地址指令需要有多少条,根据这样的条件来设计出合理的扩展操作码,对于这种设计方式来说, cpu是如何解析一条指令的?
在这里插入图片描述
首先 cpu读入一条指令一定是读入的16个比特, 然后接下来cpu会首先判断,这16比特当中的前四位 ,如果前四个比特不是全一的状态,那么就说明这是一条三地址指令,接下来cpu会根据这四位的指示,按照三地址指令的一个规则去执行这条指令。
在这里插入图片描述

另一种情况 ,如果cpu检测到开始的这四位是四个全一的话,那么接下来 cpu会检查后面的这两位是不是全一,如果不是全一的话, 就意味着这是一条二地址指令, 那么cpu就可以根据前八位来判断出这是一条什么样的二地址指令。
在这里插入图片描述
继续, 如果说cpu检测到前边的六位都是一,那么他还会继续检测,后边跟着的这五位是不是也是全一,如果这五位不是全一,就意味着这是一条一地址指令,那cpu就可以根据前边的12个比特来判断这是一条什么样的一地址指令。然后根据这个指令进行相应的操作。
在这里插入图片描述
最后一种情况 如果说cpu发现前边的,这11位都是全一那就可以确定这一定是一条零地址指令,那么根据这一整串的操作码的信息来判断这条零地址指令需要做什么, 然后cpu执行相应的操作就可以。

所以这种方式保证了操作码更短的那些指令不可能是操作码更长的那些指令的前缀,这样的话 cpu在解析指令的时候就不会出现歧义。

四、计算

那接下来看一下计算的问题,对于扩展操作码来说 ,如果地址的长度是n位 ,像上一题目是地址的长度为四位,那么如果上一层留出了m种状态 ,那下一层就可以扩展出m乘以二的n次方这么多种状态。来看下什么意思。
在这里插入图片描述

首先 对于三地址指令来说, 我们一定是需要用开头的四个比特来表示操作码,那么四个比特可以表示16种状态, 但是我们会流出一种状态 也就是四个全一的状态,作为下一层的扩展,所以对于下一层的二地址指令来说, 我们可以用四个全一,然后再加上四个比特的信息来表示这是哪一种指令, 那四个比特总共可以表示16种状态,而上一层留下的扩展状态只有一种, 所以这一层我们总共可以表示的二地之指令就是1X2^4,总共只有16种可能性, 然而我们只取其中的12种可能性来表示二地址指令,也就是说我们留下了四种状态作为下一层的扩展。
在这里插入图片描述

因此对于下一层的一地值指令来说,就可以有4X2^4这么多种状态可以用来表示一地址指令,那我们只会取其中的62种状态来表示 一地址指令,会留下两种状态作为下一层的扩展,所以对下一层的零地地址指令来说 ,我们就可以有
2X2^4 这么多种状态可以表示零地址指令。这就是大家可能会遇到的一种计算题 。

五、总结

在这里插入图片描述

这个小节当中 ,我们学习了扩展操作码这种指令格式,如果采用扩展操作码的这种指令格式, 那么就意味着操作码的位数不固定,这种设计方式的优点就是我们在指令字长有限的情况下, 可以保持比较丰富的指令种类,就像刚才那样 有三地址二地址一地址零地址指令 , 而缺点呢就是由于操作码的位数可能会改变, 因此指令译码的分析难度就增加了, 从而使cpu控制器的设计变得更复杂。

那与不定长操作码相反的就是定长操作码 。定长操作码的优点和缺点刚好和不定长操作码是相反的,如果我们的固定操作码只有n位, 那么对于定长操作码来说 ,我们只能够表示最多二的n次方这么多条指令。

这一小节重点还是要体会扩展操作码的一个设计方式, 需要注意对于扩展操作码来说, 短的操作码不能是长的操作码的前缀, 否则在译码阶段有可能出现歧义。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我自横刀向天笑~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值