计算机组成原理 第四章 指令格式

第四章 指令格式

4.1指令格式

一条指令由操作码、地址码组成,其中地址码可能有0~4个

1.基本格式

操作码字段:指出指令中该指令应该执行什么性质的操作和具有何种功能
地址码字段:给出被操作的信息的地址或操作数本身、可以有多个地址码
image-20220707062632498

2.按地址码数目分类

零地址指令

image-20220707062950508

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

一~四地址指令

image-20220707063029742

定长操作码指令格式
在指令字的最高位部分分配固定的若干位(定长)表示操作码
一般n位操作码字段的指令系统最大能表示2^n条指令
扩展操作码指令格式
全部指令的操作码字段的位数不固定

3.按指令长度分类

image-20220707063653783

定长指令字结构:所有指令长度相同
在指令字的最高位部分分配固定的若干位(定长)表示操作码
一般n位操作码字段的指令系统最大能表示2^n条指令

变长指令字结构:各指令长度不同

4.按操作类型分类

数据传送类:CPU、主存之间的数据传送

​ 传送指令通常有寄存器之间的传送(MOV)、从内存单元读取数据到CPU 寄存器
​ (LOAD)、从CPU寄存器写数据到内存单元(STORE) 等。

运算类:算术逻辑操作、移位操作

​ 移位指令主要有算法移位、逻辑移位、循环移位等。

程序控制类:改变程序执行流

输入输出类:CPU、IO设备之间的数据传送

5.扩展操作码

为了在指令字长有限的前提下仍保持比较丰富的指令种类,可采取可变长度操作码,即
部指令的操作码字段的位数不固定,且分散地放在指令字的不同位置上。显然,这将增加指令
译码和分析的难度,使控制器的设计复杂化。

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

image-20220707064220608

在设计扩展操作码指令格式时,必须注意以下两点:
1)不允许短码是长码的前缀,即短操作码不能与长操作码的前面部分的代码相同。
2)各指令的操作码一定不能重复。
通常情况下,对使用频率较高的指令分配较的操作码,对使用频率较低的指令分配较
的操作码,从而尽可能减少指令译码和分析的时间。

4.2 指令的寻址方式

寻址方式是指寻找指令或操作数有效地址的方式,即确定本条指令的数据地址及下一条待
执行指令的地址的方法。寻址方式分为指令寻址和数据寻址两大类。

指令寻址:寻找下一条将要执行的指令地址称为指令寻址;

数据寻址:寻找本条指令的数据地址称为数据寻址。

1.指令寻址

指令寻址方式有两种:一种是顺序寻址方式,另一种是跳跃寻址方式
(1)顺序寻址
通过程序计数器PC加1 (1个指令字长),自动形成下一条指令的地址。

此处的“1”要理解为一个指令字长,每次取指令结束后,一定会PC+“1”

(2)跳跃寻址
通过转移类指令实现。

所谓跳跃,是指下条指令的地址不由程序计数器PC自动给出,而由本条指令给出下条指令地址的计算方式。而是否跳跃可能受到状态寄存器和操作数的控制,跳跃的地址分为绝对地址(由标记符直接得到)和相对地址(相对于当前指令地址的偏移量),跳跃的结果是当前指令修改PC值,所以下一条指令仍然通过PC给出。

2.数据寻址

数据寻址是指如何在指令中表示一个操作数的地址,如何用这种表示得到操作数或怎样计
算出操作数的地址。
数据寻址的方式较多,为区别各种方式,通常在指令字中设一个字段,用来指明属于哪种
寻址方式,由此可得指令的格式如下所示:

image-20220707070125675

常见的数据寻址方式
(1)隐含寻址:不是明显地给出操作数地址,而是在指令中隐含着操作数的地址

例如,单地址的指令格式就不明显地在地址字段中指出第二操作数的地址,而规定累加器(ACC)作为第二操作数地址,指令格式明显指出的仅是第一操作 数的地址。因此,累加器(ACC)对单地址
指令格式来说是隐含寻址,如图4.2所示。

image-20220707070446631

优缺点:

隐含寻址的优点是有利于缩短指令字长:

缺点是需增加存储操作数或隐含地址的硬件。

(2) 立即(数)寻址
这种类型的指令的地址字段指出的不是操作数的地址,而是操作数本身,又称立即数,采用补码表示

image-20220707071022764

优缺点:

优点:指令在执行阶段不访问主存,指令执行时间最短;

缺点:形式地址A的位数限制了立即数的范围。

访存次数:

一条指令的执行:

取指令 访存 1次
执行指令 访存0次

(3)直接寻址

在指令格式的地址的字段中直接指出操作数在内存的地址。指令字中的形式地址A是操作数的真实地址EA,即EA=A,如图4.4所示。

image-20220707071357757

优缺点:

优点:简单,指令在执行阶段仅访问一次主存,不需要专门计算操作数的地址;

缺点:A的位数决定了该指令操作数的寻址范围,操作数的地址不易修改。

(四)间接寻址

指令的地址字段给出的形式地址不是操作数的真正地址,而是操作数有效地址所在的存储单元的地址,也就是操作数地址的地址,即EA=(A)

image-20220707071817448

在图4.5中,主存字第一位为1时,表示取出的仍不是操作数的地址,即多次间址;主存字
第一位为0时,表示取得的是操作数的地址。
优点:可扩大寻址范围(有效地址EA的位数大于形式地址A的位数),便于编制程序(用间接寻址可方便地完成子程序返回);

缺点:指令在执行阶段要多次访存(一次间接寻址需两次访存,多次间接寻址需根据存储字的最高位确定访存次数)。

(五)寄存器寻址

寄存器寻址是指在指令字中直接给出操作数所在的寄存器编号,即EA=R;,其操作数在由R所指的寄存器内,如图4.6所示。

image-20220707072116598

优点:指令在执行阶段不访问主存,只访问寄存器,因寄存器数量较少,对应地址码长度较小,使得指令字短且因不用访存,所以执行速度快,支持向量/矩阵运算;

缺点:寄存器价格昂贵,计算机中的寄存器个数有限。

(六)寄存器间接寻址
寄存器间接寻址是指在寄存器R;中给出的不是一个操作数,而是操作数所在主存单元的地
址,即EA= (R),如图4.7所示。

image-20220707072350203

寄存器间接寻址的特点是,与一般间接寻址相比速度更快,但指令的执行阶段需要访问主
存(因为操作数在主存中)。

(七)相对寻址

PC的内容加上形式地址A而形成操作数的有效地址 即EA=(PC)+A

image-20220707072435005

例子:问题:随着代码越写越多,你想挪动for循环的位置
相对寻址:EA=(PC)+A,其中A是相对于PC所指地址的位移量,可正可负,补码表示
优点:这段代码在程序内浮动时不用更改跳转指令的地址码

image-20220707074713949

优点:操作数的地址不固定,它随着PC值的变化而变化,并且与指令地址之间相差一个固定值,便于程序浮动(一段代码在程序内部的浮动),广泛应用于转移指令

(八)基址寻址

将CPU中基址寄存器(BR)的内容+形式地址A而形成有效地址 即EA=(BR)+A,访存次数一次。

image-20220707072513441

例子:拓展:程序运行前,CPU将BR的值修改为该程序的起始地址(存在操作系统PCB中)

采用基址寻址无需修改指令中的地址码

image-20220707075032523

优点:可扩大寻址范围,用户不用考虑自己的程序存于主存的哪个空间区域,有利于多道程序的设计,可用于编制浮动程序
缺点:形式地址A (偏移量)较短

(九)变址寻址

EA=(IX)+A IX为变址寄存器(专用),也可以用通用寄存器作为变址寄存器

变址寄存器面向用户(作为偏移量),形式地址A不变(作为基地址)
主要用于处理数组问题

image-20220707072536153

例子:在数组处理过程中,可设定A为数组的首地址,不断改变变址寄存器IX的内容,便可很容易形成数组中任一数据的地址,特别适合编制循环程序。

image-20220707075755804

优点:可扩大寻址范围,适合编制循环程序,偏移量的位数足以表示整个存储空间

(十)堆栈寻址
堆栈是存储器(或专用寄存器组)中一块特定的、按后进先出原则管理的存储区,该存储区中被读/写单元的地址是一个特点的寄存器给出的,该寄存器称为堆栈指针(SP)

image-20220707073830163

软堆栈:

image-20220707073938111

总结:

image-20220707073435494

posted @ 2022-07-07 08:01  huilinmumu  阅读(1827)  评论(0)    收藏  举报