pushpop指令的操作数必须是字操作数_指令系统之指令格式

第一章 指令格式

一、什么是指令?

指令其实就是机器语言0和1组成的语句,指令可以操控硬件来实现某种基本功能。多个指令组成的系统就叫指令系统。

指令系统一般和硬件设计耦合比较高,硬件一般跟随指令来设计,所以不同的硬件,同一套指令系统是不能兼容的(同一个厂商制作的硬件可能会支持)。

二、指令格式

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

一条指令通常由操作码和地址码来组成:

d99c0a5b7603bb95074534f3d000aa65.png

图 1 指令格式

上图表示的只是一个抽象的概念,并没有指出其中具体的内容。下面举个实际的例子:

31202e28a0773ecfb75a5e008a3f6b88.png

图 2 指令格式

图2是A1与A2操作后将结果放在A3中,A4是下一条指令的地址,以便当前指令执行完后继续执行下一条指令。简化后就是:A1 (OP) A2 -> A3, A4=.....

三、地址指令

上面说的指令格式其实就叫四地址指令,因为有四个地址。一个地址就是一个二进制串。

OP是整条指令需要完成的功能,后面四个是主存中取的地址。假设这条四地址指令为OP(00000000) A1( 000001) A2( 000010) A3(占位,存放结果位) A4( 000100)

设OP=00000000 代表“+”法操作,A1=000001,A2=000010, A3=000001 + 000010 = 000011,A4=000100,那么执行的过程如下图:

cd551eb93e3a80e4c8b787017e078f1a.png

图 3 指令执行过程

指令对应主存中的内容为了识别方便,采用了16进制表示。

假设指令字长为32位,操作码占8位,4个地址码字段各占6(32-8=24,24/4=6)位。设存储字长为32位,即4Bit。那么A1可直接表示26 = 64个不同位置。一条指令的执行(假设每个地址都是主存地址):

v取指令 访问1次 (假设指令字长=存储字长,为了一次就可以取完)

v取2个操作数 访存2次

v存回结果 访存1次

共计4次

第二章 指令寻址方式

上面介绍了四地址指令,那么可不可以省点地址呢?上面的情况是指令和地址存放在一起,如果我们把指令归为一类,操作地址归为一类,是不是就可以不需要下一个指令地址呢?

a212a983e49ae7c74f083a90ffbd1261.png

图 4 程序计数器

有了程序计数器单元的加入,我们的指令变得精简和容易了。指令的下一条地址可以根据地址位顺位移动即可,方便查找;我们也不需要每次重复的单独给出指令地址空间,来存放下一条指令了。经过这样优化以后,就变成了“三地址指令”格式了。

寻址范围

上面说指令格式时说过,设指令字长及存储字长均为32位,操作码占8位。

ba1d1aeb9a4f9ff6a1457d5d7cfbdb00.png

图 5 四地址指令

4个地址码字段各占6位(32-8=24,24/4=6),指令操作数直接寻址范围为26=64,完成一条指令需要访存4次。

ea28b7c286a7f5b194398b66ae477846.png

图 6 三地址指令

因为有了“程序计数器”,可以省略下一个指令地址存放空间。3个地址各占8位(32-8 = 24,24/3 =8),指令操作数直接寻址范围为28=256,完成一条指令需要访存次数还是4次(取指令,取A1,取A2,结果存回A3)

93ceaa0a82c6549e8886179e9d59331b.png

图 7 二地址指令

二地址指令是A1既可以当操作数也可以当结果,是比较常见的一种格式。由于又少了一位地址,2个地址各占12位(32-8=24,24/2=12),指令操作数的直接寻址范围为212=4096,完成一次指令需要访存4次。

42722ea14445d8406ad2e070b164cb4c.png

图 8 一地址指令

一地址指令有2种情况,

第一种:比如加1、减1、取反、求补等,完成一次指令需要访存3次;

第二种:自身与ACC(寄存器)操作,完成一次指令需要访存2次(寄存器不是主存,所以不算访存次数)。

这个时候除了操作码,所有的地址都能用于寻址了,1个地址占24位,指令操作数的直接寻址范围为224=16777216。

6bc4a584b425b0848a4380d61dd3b405.png

图 9 零地址指令

第三章 指令的设计

以上的5种指令设计就是地址码的设计,在减少地址的情况下并没有改变地址的长度,这种指令集的结构叫定长指令字结构(指令长度固定)。如果随着地址码的减少,我们改变了指令字的长度,就叫做变长指令字结构(指令长度不等)。

定长指令字和变长指令字结构看的是整条指令的长度。操作码也有定长操作码(n位->2n条指令)和扩展操作码(操作码长度可变)。我们需要关注的是操作码而不是整条二进制的数量变化。

扩展操作码(不定长操作码)是变长操作码最常见的一种,扩展操作码是需要设计的。

82ff5b0a7cb6b9427b32099b0574c756.png

图 10 扩展操作码

举例:

指令字节长度为16位:前4位为基本操作码字段OP,另有3个4位长的地址字段A1、A2和A3。4位基本操作码若全部用于三地址指令,则有24=16条指令范围组合。但是至少需要留出一位做为扩展操作码使用,即三地址指令为15条,依次类推,见图10。

操作码的长度在变化,如果把1111在三地址指令中被占用了,在二地址指令中就没法区分是操作码还是操作数地址码了。所以在每个高地址指令中留出一位用于低地址指令中使用,4变8,8变12……即是前面留出的一位用做操作码,读取到这一位就知道是操作码,那么就继续往后寻址,这样就实现了扩展操作码了。那么我们想一想,能不能上层多留几位来作为下层的前缀操作码呢?

在设计扩展操作码指令格式时,必须注意以下两点:

1)不允许短码是长码的前缀,即短操作码不能与长操作码的前面部分的代码相同。

2)各指令的操作码一定不能重复。

通常情况下,对使用率较高的指令,分配较短的操作码,对使用频率较低的指令,分配较长的操作码,从而尽可能减少指令译码和分析的时间。具体可以参考哈夫曼编码,这里就不再详细叙述了。

对于留多位是可以的,只是需要注意以上2点。这里有个公式:设地址长度为n,上一层留出m种状态,下一层可扩展出m*2n种状态。

23074c65e85c3d5dcba814490be4a655.png

图 11 不定长操作码设计

第四章 总结

操作码是指出指令中该指令应该执行什么性质的操作和具有何种功能。

操作码是识别指令、了解指令功能与区分操作数地址内容的组成和使用方法等的关键信息。例如,指出是算术运算,还是减运算;是程序转移,还是返回操作。

操作码分类

定长操作码:在指令字的最高位部分分配固定的若干位(定长)表示操作码。

优点:简化计算机硬件设计,提高指令译码和识别速度;

缺点:指令数量增加时会占用更多固定位,留给表示操作数的地址位数受限。

扩展操作码(不定长操作码):全部指令的操作码字段的位数不固定,且分散放在指令字的不同位置上。

优点:对应定长操作码的缺点,在指令字长有限的前提下仍保持比较丰富的指令条种类;

缺点:增加了指令译码和分析的难度,使控制器的设计复杂化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值