指令一般有操作码(OP)和地址码(A)两部分组成:
而如何获取操作数由寻址方式决定,简单说寻址方式决定了操作数的存放位置和访问方式。值得注意的是,寻址方式可以显示地包含在地址码字段中,也可以隐式地包含在操作码字段中。

指令字长是指构成指令的二进制位数,根据指令系统中是否将指令字长固定,可以分为定长指令系统、变长指令系统。
这个地方大家需要注意,因为存储器的基本编址单位为字节,而指令时存储在存储器当中的。所以不管是定长指令,还是变长指令,它的字长都应该是字节的整数倍。
指令越长,占用的主存空间就越大,所耗费的访存时间也就越长。
根据指令字长与机器字长的关系,指令可以分为一下三类:

综上所述,为了提高速度,一般会将指令设计为较短的指令格式。
根据指令类型和寻址方式,地址码可能包含:
根据地址码中包含的操作数地址数量,可以分为:
下面我给出一个操作表达式:

其中,OP是操作码,地址码A1是源操作数1的地址,地址码A2是源操作数2的地址,地址码A3是目的操作数的地址。我们不难看出这里的OP是一个双目运算符。
举一个例子:

总结:
操作表达式如下:

其中,与三地址指令不同的是,地址码A1是源操作数1的地址、地址码A2是源操作数2的地址、同时A1还作为目的操作数操作数的地址。
根据二地址指令中两个地址码指向数据存储位置的不同,二地址指令可以分为:
操作数地址 | 源操作数地址 | 访问速度 | |
|---|---|---|---|
存储位置 | 寄存器 | 寄存器 | 第一 |
存储位置 | 存储器 | 寄存器 | 第二 |
存储位置 | 存储器 | 存储器 | 第三 |

可以分为两种情况,一个是地址码既作为既作为源操作数地址,也作为目的操作数地址;还有一种是仅作为源操作数地址。

仅包含一个地址码,既作为源操作数地址,也作为目的操作数地址,很明显是一个单目运算。

这里举例的AL寄存器中实际上隐含了一个操作数,所以实际上这个一地址指令,实现的是一个双目运算。这种情况下,隐含操作数双目运算,进一步缩短了双目指令类的指令字长。
零地址指令只包含操作码字段,而没有地址码字段,可以分为两类:


变长操作码的常见实现方式是扩展操作码技术:
核心思想是,操作码的长度随着地址码字段中地址码的数量的减少而增加
举例:

如果是定长操作码,那么将可以有16条三地址指令,而如果我们通过减少地址码数量来实现扩展操作码:

也就是我减少一个地址码,这样就成为了二地址指令,那么这里要注意的是,短操作码不能是长操作码的前缀,所以如果我们将高四位取位1111,那么就要从16个三地址指令中操作码位1111的删除,从而增加了16个二地址指令,那么此时就总共会有15+16=31条指令。
这里也会给我们一种启发,我们会倾向于给常用的指令分配更短的操作码。
这里给出几道经典的例题大家可以做一下:
题一:

解析:

题二:

解析:

题三:

解析:

要注意的是我们强调过,指令字长一定是字节的整数倍。
寻址是指寻找指令或指令中操作数的有效地址的方式,这里的有效地址可以是主存地址,也可以是虚拟地址。

不难看出相较于指令寻址方式,操作数寻址方式更加灵活复杂,这是因为操作数是程序执行时的数据,所以为了满足不同程序的需要,操作数的存取方式会更加灵活。

这里要注意的是,因为指令寻址方式较为简单,所以在提到寻址方式的时候,如果没有特殊说明,一般是指操作数寻址方式。
通常情况下,构成程序的所有机器指令(指令序列)在主存中按照顺序存放
大多数情况下,这照指令序列顺序执行:
所以如果我们知道指令序列中第一条指令的有效地址,然后在这个指令的有效地址的基础上增加一条指令所占主存单元的数量,就能够得到下一条指令的有效地址。我们将这种方法称作指令的顺序寻址。
如果构成程序的指令中包含分支指令或者跳转指令,那么当程序执行到这条指令的时候,将会改变指令的执行顺序。
此时就需要用到跳跃寻址:

总的来说,跳跃寻址时,下一条指令的地址并不是PC+1决定的,而是由本条指令本身或者需要的测试条件决定的。
我们知道不同指令可能采取不同的寻址方式来获取操作数,所以我们这里将指令格式中的地址码拆分成两部分:
如下:

而这里我们可以形象地说,操作数寻址就是,将寻址方式与M与形式地址D的不同组合转换成有效地址的过程。

在立即寻址下,操作数和指令一起存放在主存中(放在一起):
立即寻址特点如下:

在直接寻址方式下,操作数和指令是分开放在主存中的:

直接寻址的特点如下:

在寄存器寻址的方式下,操作数和指令是分开存放的,操作数存放在CPU中的某个通用寄存器中,指令存放在主存:

寄存器寻址的特点如下:

间接寻址方式下,操作数与指令分开存放在主存中:

这里要注意上图展示的是单级间接寻址示例,还有多级间接寻址。
看到这里想必大家会有疑问,就是为什么要设计这么复杂的间接寻址方式呢?
间接寻址的特点如下:

假设形式地址16位,指向一个主存单元(32位),那么这个时候操作数的寻址范围就变大了,如果这里使用的是直接寻址,则只有16位。

寄存器间接寻址方式下,操场数和寄存器分开放在主存中:

寄存器间接寻址的特点:

在相对寻址方式下,操作数和指令分开存放在主存中:

例题:

解析:

相对寻址的特点如下:

在变址寻址方式下,操作数与指令分开存放在主存中:

变址寻址的特点及用途如下:

基址寻址除了,上面两点不同,其他与变址寻址方式相同。
对于存储在堆栈上的操作数进行寻址的方法叫做堆栈寻址。
堆栈分为下面两种:


(本篇完)