8086寻址方式
PA
EA
(地址)
[地址]
DEST
SOUR
-
?
?
⊕
----
____
Flags
在EU执行指令的过程中,BIU负责从内存指定区域取出传送给EU部分去执行。在执行指令时,所需的操作数也是由BIU从内存指定区域取出传送给EU部分执行。
1 立即寻址方式(Immediate addressing)
立即寻址方式常用于给寄存器赋初值,并且只能用于源操作数字段,不能用于目的操作数字段。
指令执行后,(AL)= 09H
指令执行后,(AX)= 3064H
注意:不能直接给段寄存器和标志寄存器赋予立即数。
显然,下面的指令是错误的:
MOV DS, 1250H
2 寄存器寻址方式(Register addressing)
对于16位操作数,寄存器可以是AX、BX、CX、DX、SI、DI、SP、BP、CS、DS、ES和SS;对于8位操作数,寄存器可以是AL、AH、BL、BH、CL、CH、DL、DH。由于操作数就在寄存器中,指令执行时不需要访问存储器,因此这是一种快速的寻址方式。
如指令执行前(AX)= 1234H,(BX)= 5678H;
则指令执行后(AX)= 5678H,(BX)保持不变。
注意:源寄存器和目的寄存器的位数必须一致。
例如:MOV CL, BX是一条错误指令。
除上述两种寻址方式外,下面五种寻址方式的操作数都在除代码段以外的存储区中。
这里先引入有效地址EA(Effective Address)的概念:在8086里,把操作数的偏移地址称为有效地址,下面五种计算EA的方法体现了五种寻址方式。
3 直接寻址方式(Direct addressing)
在这种寻址方式中,操作数存放在存储单元中,而这个存储单元的有效地址就在指令的操作码之后,操作数的物理地址可通过((DS)×16)再加上这个有效地址形成。
在汇编语言指令中,可以用符号地址(变量名或标号)代替数值地址。
例如: MOV AX, DATA
或 MOV AX, [DATA]
这里DATA是存放操作数单元的符号地址。
直接寻址方式默认操作数在数据段中,如果操作数定义在其它段中,则应在指令中指定段跨越前缀。
例如: MOV AX, ES:NUMBER
或 MOV AX, ES:[NUMBER]
这里NUMBER是附加段中的字变量。
直接寻址方式适合于处理单个变量。
如果(DS)= 3000H,则执行情况如图3.2所示。
最后的执行结果为(AX)= 3050H。
4 寄存器相对寻址方式(Register indirect addressing)
这种寻址方式通过基址寄存器BX、BP或变址寄存器SI、DI与一个位移量相加形成有效地址,计算物理地址的缺省段仍然是SI、DI和BX为DS,BP为SS。
寄存器相对寻址方式也可以使用段跨越前缀。
例如:MOV AX, ES:[DI+10]
这种寻址方式同样可用于表格处理。
表格的首地址可设置为位移量,修改基址或变址寄存器的内容取得表格中的值。
其中COUNT为16位位移量的符号地址。
如果 (DS)= 3000H,(SI)= 2000H,COUNT = 3000H
则物理地址 = 30000H + 2000H + 3000H = 35000H
指令执行情况如图3.4所示,最后的执行结果是(AX)= 1234H。
5 基址变址寻址方式(Based indexed addressing)
这是一种基址加变址来定位操作数地址的方式,也就是说,操作数的有效地址是一个基址寄存器(BP或BX)和一个变址寄存器(SI或DI)的内容之和。如基址寄存器为BX时,与DS形成的物理地址指向数据段;如基址寄存器为BP时,与SS形成的物理地址指向堆栈段。如左图所示。
此种寻址方式也可使用段跨越前缀。
例如:MOV AX, ES:[BX][SI]
注意:一条指令中同时使用基址寄存器或变址寄存器是错误的。
例如:MOV CL, [BX+BP] 或 MOV AX, [SI+DI] 均为非法指令。
这种寻址方式同样适用于数组或表格处理。
首地址可存放在基址寄存器中,而用变址寄存器来访问数组中的各个元素。由于两个寄存器的值都可以修改,所以它比寄存器相对寻址方式更加灵活。
如 (DS ) = 2100H,(BX)= 0158H,(DI)= 10A5H
则 EA = 0158H +10A5H = 11FDH
物理地址 = 21000H +11FDH = 221FDH
指令执行情况如图3.5所示,最后的执行结果是(AX)= 1234H。
6 相对基址变址寻址方式(Relative based indexed addressing)
这种寻址方式与基址变址寻址方式类似,不同的是基址加变址再加上一个位移量形成操作数的有效地址。缺省段的使用仍然是DS与BX组合,SS与BP组合。
这种寻址方式通常用于对二维数组的寻址。
例如,存储器中存放着由多个记录组成的文件,则位移量可指向文件之首,基址寄存器指向某个记录,变址寄存器则指向该记录中的一个元素。
评论