通常,一条带有操作数的指令要指明两个问题:一是进行什么操作,二是用什么方式寻找操作数的存放地址。我们将寻找操作数存放的地址的方式成为寻址方式。当一条指令带中有多个操作数时,每个操作数的寻址方式可能不同,因此,寻址方式是针对指令中指定的操作数(源操作数或者是目的操作数)而言的。
8086指令中的操作数可以存放在三种不同的部件中:一是CPU内的寄存器中,二是主存中,三是I/O设备的端口中。寻址方式不仅指明了操作数存放的部件,而且指明了操作数在该部件内的存放地址。
下面来介绍一下8086在CPU和主存中的寻址方式。
一,寄存器寻址
在这种寻址方式中,指令所指明的寄存器就是操作数的存放地址,及操作数在指令指明的寄存器R(R是CPU内的寄存器名)中。
使用格式 R
功能:寄存器R的内容即为操作数(R为任意寄存器,个别指令的限制除外)。
注意:在寄存器寻址方式中,所用寄存器的位数决定了指令操作数 的类型。例如,采用32位寄存器表示操作数是双字节类型;采用16位寄存器表示操作数是字类型。。
由于寄存器是CPU内的存储器,因此,对于那些经常存取的操作数采用寄存器寻址的方式可以提高工作效率。
二,寄存器间接寻址
在寄存器间接寻址方式中,操作数存放在主存储器中,而操作数的偏移地址存EA在指令指明的寄存器中,即寄存器的内容为操作数的偏移地址EA。
使用格式 [R]
功能 :寄存器R的内容为操作数的偏移地址EA。
注意:在8086中,R可以是8个32位的通用寄存器中的任何一个,也可以是4个16位通用寄存器中的一个。但是不能用8位的通用寄存器。
这种寻址方式在未指明操作数所在的段时,如果R选用的是BP,EBP,ESP,则系统默认的操作数在堆栈段中,如果选用其他32位或16位寄存器,则系统均默认操作数在DS指示的段中。
三,变址寻址
变址寻址的方式的操作数存放在主存储器中,其偏移地址EA是指令中指定寄存器的内容乘以比例因子后与给出的位移量之和。
使用格式 [R*F+V] ,[R*F]+V, V[R*F]
功能 :寄存器R的内容乘以指定的比例因子F后加上给定的位移量V作为操作数的偏移地址。
其中,寄存器R作为编制寄存器使用。当R为16位寄存器或ESP是,F只能为1并省略不写。
位移量是不超过16位(当R为16位寄存器时),或不超过32位寄存器(当R为32位寄存器时)的二进制补码表示的有符号数,也可以是合乎语法规则的数值表达式,变量或者是标号名。当V中存在变量或标号名时,以其偏移地址参加运算。当V值超过了16位或者是32位的所能表示的范围时,汇编程序会做阶段处理。
四,基址加变址寻址
这种寻址方式的操作数存放在存储器中,其偏移地址EA是指令中指定的基址寄存器的内容,变址寄存器的内容乘以比例因子,位移量V三项相加之和。
使用格式 [VR+IR*F+V] , V[BR][IR*F] ,V[BR+IR*F]
功能: 将变址寄存器IR的内容乘以比例因子F,与基址寄存器BR的内容和位移量相加,作为操作数的偏移地址EA。
五,立即寻址
立即寻址方式所提供的操作数是紧跟在指令操作码后面的一个采用8位,16位,32位的二进制补码表示的有符号数,构成了指令的一部分,位于代码段中。也就是说,操作数的存放地址就是指令操作码的下一单元,计算PA时使用的段寄存器CS,而EA的值来自指令指示器Ip/EIP中的内容。
使用格式 n
功能 :指定指令最后一部分单元中的内容为操作数。
其中,n也称为立即操作数,占用的字节数由指令指定的操作数类型确定。在指令语句中,立即数n只能是常数或结果为确定值的表达式,且只能做源操作数。
立即寻址主要用来给寄存器或存储器赋初值,也可以与寄存器操作数或存储器操作数进行算术逻辑运算。
六,直接寻址
在直接寻址中,操作数存放在主存储器中。操作数的偏移地址EA紧跟在指令操作码后面,构成了指令的一部分,通过指令指示器IP/EIP获得。
使用格式: 段寄存器名:[n] 或 变量 或 变量+常量
功能: 指定操作数的下一个字或双字单元中的内容为操作数的偏移地址EA。