| |
|
8086的寻址方式
(以MOV为例)
寻址方式就是指令中用于说明操作数或操作数地址的方法。
8086/8088 指令中涉及的操作数主要有三种:立即数操作数、寄存器操作数、存储器操作数。
一、立即寻址:立即数是直接从指令中获得。该方式主要用来给寄存器或存储器单元赋初值。
例 MOV AL,1234H
二、寄存器寻址:操作数在 CPU内部的寄存器(AX、BX、CX、DX、BP、SP、SI、DI)中。通用寄存器无地址偏移,其中内容直接取出就是操作数。
例 MOV AX,BX(其中AX为目的操作数,BX为源操作数)
三、存储器寻址:操作数来自存储区(除代码段以外的存储区)。通过不同的方式找到操作数地址,然后才能获得操作数。
1.直接寻址:存储器操作数地址的16位偏移量直接包含在指令中,它与操作码一起存放在代码段。操作数一般在数据段(它的地址为数据段寄存器DS的内容左移 4位,再与指令中的16位地址偏移量相加),也可在代码段、堆栈段或附加段。
例 MOV AX,[2000H] 操作数在数据段
MOV AX,ES:[2000H] 操作数在附加段
2.寄存器间接寻址:操作数的有效地址在基址寄存器BX、BP或变址寄存器SI、DI中。
①若以BX、SI、DI间接寻址,则操作数在现行数据段,即数据段寄存器DS加上SI或DI或BX中的16位偏移量为操作数地址。
②也可以使用段跨越前缀把存储器操作数指定在其他段,则SI、DI、BX与其它段寄存器相加,形成操作数地址。
③若以BP间接寻址,则操作数在现行堆栈段,SS与BP相加作为操作数地址。
例 MOV AX,[SI] 操作数在数据段
MOV AX,[BP] 操作数在堆栈段
MOV AX,ES:[BX] 操作数在附加段
3.寄存器相对寻址:操作数的有效地址是一个基址或变址寄存器的内容和指令中给定的位移量之和。若以BX、SI、DI相对寻址,则段寄存器用DS;若以BP寄存器相对寻址,则段寄存器用SS。
例 MOV AX,[BX+3AH] 操作数在数据段
MOV AX,COUNT[SI] 其中COUNT为16位位移量
MOV AX, [BP+42B3H] 操作数在堆栈段
MOV AX, ES:[BX+25H] 操作数在附加段
4.基址变址寻址:操作数的有效地址是指令中指定的一个基址寄存器(BX或BP)和一个变址寄存器(SI或DI)的内容之和。若使用BX,则段寄存器用DS;若使用BP,则段寄存器用SS。
例 MOV AX,[BX][SI]
5.相对基址变址寻址(基址加变址的相对寻址):操作数的有效地址是基址寄存器与变址寄存器的内容之和再加上指令中给定的位移量。段寄存器的选择仍由基址寄存器确定(同前)。
例 MOV AX,[BX+SI+6BH] 操作数在数据段
MOV AX,MASK[BX][DI] 其中MASK是位移量
MOV AX,[BP+DI+00FEH] 操作数在堆栈段
MOV AX,ES:[BX+DI+3FH] 操作数在附加段
8086的寻址方式与高级语言中所用的数据结构相应的,关系如表∶
┌────┬──────────────┬───────┐
│数据结构│ 数据存储器 │ 堆栈 │
│ ├──────┬───────┤ │
│ │ 不具有基址 │ 具有基址 │ │
├────┼──────┼───────┼───────┤
│简单变量│ 直接 │ BX+偏移量 │ BP+偏移量 │
├────┼──────┼───────┼───────┤
│ 矩阵 │ SI │ BX+SI │ BP+SI │
│ │ PI │ BX+DI │ BP+DI │
├────┼──────┼───────┼───────┤
│ 记录 │ SI+偏移量 │BX+SI+偏移量│BP+SI+偏移量│
│ 的矩阵 │ DI+偏移量 │BX+DI+偏移量│BP+DI+偏移量│
└────┴──────┴───────┴───────┘
|
|
|