Alex_McAvoy

想要成为渔夫的猎手

指令格式

【指令的基本格式】

指令

指令,又称机器指令,是指示计算机执行某种操作的命令,是计算机运行的最小功能单位,一台计算机的所有指令的集合构成该机的指令系统,也称为指令集

一条指令就是机器语言的一个语句,它是一组有意义的二进制代码,一条指令通常要包括操作码字段和地址码字段两部分:

其中,操作码指出指令中该指令应该执行什么性质的操作和具有何种功能,地址码用于给出被操作的信息(指令或数据)的地址

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

地址码包括参加运算的一个或多个操作数所在的地址、运算结果的保存地址、程序的转移地址、被调用的子程序的入口地址等

指令结构

指令的长度是指一条指令中所包含的二进制代码的位数,指令字长取决于操作码的长度、操作数地址码的长度和操作数地址的个数。指令长度与机器字长没有固定的关系,它可以等于机器字长,也可以大于或小于机器字长

通常,把指令长度等于机器字长的指令称为单字长指令,指令长度等于半个机器字长的指令称为半字长指令,指令长度等于两个机器字长的指令称为双字长指令

在一个指令系统中,若所有指令的长度都是相等的,称为定长指令字结构,定字长指令的执行速度快,控制简单,若各种指令的长度随指令功能而异,就称为变长指令字结构

指令格式

根据指令中的操作数地址码的数目的不同,可将指令分成以下几种格式

1.零地址指令

只给出操作码 $OP$,没有显地址,这种指令有两种可能:

  • 不需要操作数的指令,如空操作指令、停机指令、关中断指令等
  • 零地址的运算类指令仅用在堆栈计算机中,通常参与运算的两个操作数隐含地从栈顶和次栈顶弹出,送到运算器进行运算,运算结果再隐含地压入到堆栈中

2.一地址指令

这种指令也有两种常见的形态,根据操作码含义确定它究竟是哪一种:

1)只有目的操作数的单操作数指令

按 $A_1$ 地址读取操作数,进行 $OP$ 操作后,结果存回原地址,指令含义如下:

2)隐含约定目的地址的双操作数指令

按指令地址 $A_1$ 可读取源操作数,指令可隐含约定另一个操作数由累加器 ACC 提供,运算结果也将存放在 ACC 中,指令含义如下:

若指令字长为 $32$ 位,操作码占 $8$ 位,一个地址码字段各占 $24$ 位,则指令操作数的直接寻址最大范围为 $2^{24}=16M$

3.二地址指令

对于常用的算术和逻辑运算指令,往往要求使用两个操作数,需分别给出目的操作数和源操作数的地址,其中目的操作数地址还用于保存本次的运算结果,指令含义如下:

若指令字长为 $32$ 位,操作码占 $8$ 位,两个地址码字段各占 $12$ 位,则指令操作数的直接寻址范围为 $2^{12}=4K$

4.三地址指令

指令含义:

若指令字长为 $32$ 位,操作码占 $8$ 位,三个地址码字段各占 $8$ 位,则指令操作数的直接寻址范围为 $2^8=256$

若地址字段均为主存地址,则完成一条三地址需要 $4$ 次访问存储器,其中取指令 $1$ 次,取两个操作数 $2$ 次,存放结果 $1$ 次

5.四地址指令

指令含义:

若指令字长为 $32$ 位,操作码占 $8$ 位,四个地址码字段各占 $6$ 位,则指令操作数的直接寻址范围为 $2^6=64$

【定长操作码指令格式】

定长操作码指令是在指令字的最高位部分分配固定的若干位表示操作码,一般 $n$ 位操作码字段的指令系统最大能够表示 $2^n$ 条指令

定长操作码对于简化计算机硬件设计,提高指令译码和识别速度很有利,当计算机字长为 $32$ 位或更长时,是常规用法

【扩展操作码指令格式】

为了在指令字长有限的前提下仍保持比较丰富的指令种类,可采取可变长度操作码,即全部指令的操作码字段的位数不固定,且分散地放在指令字的不同位置上

显然,这将增加指令译码和分析的难度,使控制器的设计复杂化

最常见的变长操作码方法是扩展操作码,使操作码的长度随地址码的减少而增加,不同地址数的指令可以具有不同长度的操作码,从而在满足需要的前提下,有效地缩短指令字长

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

  • 不允许短码是长码的前缀,即短操作码不能与长操作码的前面部分的代码相同
  • 各指令的操作码一定不能重复

通常情况下,对使用频率较高的指令,分配较短的操作码,对使用频率较低的指令,分配较长的操作码,从而尽可能减少指令译码和分析的时间


如下图所示的扩展操作码的安排方式,在该方式中,指令字长为 $16$ 位,其中 $4$ 位为基本操作码字段 $OP$,另有 $3$ 个 $4$ 位长的地址字段 $A_1$、$A_2$、$A_3$

若 $4$ 位基本操作码若全部用于三地址指令,则共有 $16$ 条,三地址指令为 $15$ 条,$1111$ 留作扩展操作码之用,二地址指令为 $15$ 条,$1111 1111$ 留作扩展操作码之用,一地址指令为 $15$ 条,$111111111111$ 留作扩展操作码之用,零地址指令为 $16$ 条

感谢您对我的支持,让我继续努力分享有用的技术与知识点!