文章目录[隐藏]
当数据存放在内存中的时候,我们可以用多种方式来给定这个内存单元的偏移地址,这种定位内存单元的方法一般被称为寻址方式。
8086CPU有多种寻址方式,我们在前面的课程中都已经用到了,这里进行一下总结,如表8.2所列。
与数据有关的寻址方式
下面以数据传送指令MOV为例来说明。其汇编格式为:MOV 目标, 源
1.立即寻址方式(immediate addressing)
操作数直接包含在指令中,紧跟在操作码之后的寻址方式称为立即寻址方式,把该操作数称为立即数
MOV AL, 6 ;(AL)=6 MOV AX, 3064H ;(AX)=3064
2.寄存器寻址方式(register addressing)
操作数直接包含在寄存器中,由指令指定寄存器号的寻址方式。
MOV BX, AX ;(BX)=(AX) MOV DI, 5678H ;(DI)=5678H
除以上两种寻址方式外,以下各种寻址方式的操作数都在存储器中,其操作数称为存储器操作数。
由于80X86对内存采用分段管理,因此由以下寻址方式得到的只是有效地址(简写为EA-effective address,在IBM PC中就是操作数地址的偏移量部分)。
有效地址可以由以下四种成分组成:
(1)位移量(displacement)是存放在指令中的一个8位、16位或32位的数,它是一个地址。
(2)基址(base)是存放在基址寄存器中的内容。通常用来指向数据段中数组或字符串的首地址。
(2)变址(index)是存放在变址寄存器中的内容。通常用来访问数组中的某个元素或字符串中的某个字符。
比例因子(scale factor)是80386以上CPU新增加的。其值可为1、2、4或8。寻址中,可用变址寄存器的内容乘以比例因子来取得变址值。
EA=基址+(变址x比例因子)+位移量
3.直接寻址方式(direct addressing)
操作数的有效地址直接包含在指令中的寻址方式。
有效地址存放在代码段的指令操作码之后,但操作数本身在存储器中,所以必须先求出操作数的物理地址。这种寻址方式常用于存取简单变量。
MOV AL, [68H]
由于在汇编语言中用符号表示地址,所以指令“MOV AL,VAR”中的源操作数寻址方式是直接寻址,有时也写做
MOV AL,[VAR]
4.寄存器间接寻址方式(register indirect addressing)
操作数的有效地址在基址寄存器BX、BP或变址寄存器SI、DI中,而操作数在存储器中的寻址方式。对于386以上CPU,允许使用任何32位通用寄存器。
MOV AL, [BX]
5.寄存器相对寻址方式(register relative addressing)
也称为直接变址寻址方式。操作数的有效地址是一个基址(BX、BP)或变址(SI、DI)寄存器的内容和指令中给定的一个位移量(disp)之和。有效地址由2部分组成。对于386以上允许使用任何32位通用寄存器。
即:
EA=(基址<或变址>寄存器)+disp
或:
EA=(32位通用寄存器)+disp(386型号以上)
例:
MOV AL, 8[BX] 或 MOV AL, [BX+8]
6.基址变址寻址方式(based indexed addressing)
操作数的有效地址是一个基址寄存器(BX、BP)和一个变址寄存器(SI、DI)的内容之和。386以上允许使用变址部分除ESP以外的任何两个32位通用寄存器组合。缺省使用段寄存器的情况由基址寄存器决定。允许使用段超越前缀。
MOV AL,[BX][SI] 或 MOV AL,[BX+SI]
7.相对基址变址寻址方式(relative based indexed addressing)
操作数的有效地址是一个基址和一个变址寄存器的内容和指令中给定的一个位移量之和。有效地址由三部分组成。80386以上允许使用变址部分除ESP以外的任何两个32位通用寄存器组合。缺省使用段寄存器的情况由基址寄存器决定。允许使用段超越前缀。
MOV AL,MASK[BX][SI] 或 MOV AL,MASK[BX+SI] 或 MOV AL,[MASK+BX+SI]
8.比例变址寻址方式(scaled indexed addressing)
注意:80386以上的微处理器才提供。
EA=(基址寄存器)+(变址寄存器)×比例因子+disp
其优点在于:对于元素大小为2、4、8字节的数组,可以在变址寄存器中给出元素下标,而由寻址方式控制直接用比例因子把下标转换为变址值。
可以看出,它实际上是386以上CPU存储器操作数寻址方式的通用公式。
MOV AX, ARY[BX][4*SI]
与转移地址有关的寻址方式
讨论的寻址方式是用来确定转移及调用(CALL)指令的转向地址。下面以8086/8088的无条件转移指令为例来说明,格式为
JMP 目标
这里的目标有各种寻址方式。这些寻址方式可以被分为段内转移和段间转移两类。段内转移只影响指令指针IP值;段间转移既要影响IP值,也要影响代码段寄存器CS的值。
1.段内直接寻址方式(intrasegment direct addressing)
EA=(IP)+(8位或16位)disp
位移量disp是一个相对于指令指针的带符号数,EA就是要转向的本代码段内指令地址的偏移量。
若位移量是8位的,则称为短转移,格式
JMP SHORT LAB
若位移量是16位的,则称为近转移,格式
JMP LAB 或JMP NEAR PTR LAB
2.段内间接寻址方式(intrasegment indirect addressing)
转向的有效地址在一个寄存器或内存单元中,该寄存器号或内存地址按上节介绍的与操作数有关的寻址方式(立即寻址方式除外)获得。
JMP BX JMP TABLE[BX] JMP WORD PTR [BX] ;其中WORD PTR [BX]表示BX指向一个字型内存单元
3.段间直接寻址方式(intersegment direct addressing)
指令中直接给出转向的4字节的偏移量和段基址。汇编格式为:JMP FAR PTR LAB。执行时偏移量送IP,段基址送CS。
4.段间间接寻址方式(intersegment indirect addressing)
用一个双字内存变量中的低16位取代IP值,高16位取代CS值,从而实现段间转移。例 :
JMP DWORD PTR [BX];式中DWORD PTR [BX]表示BX指向一个双字变量。