基本概念
- 立即操作数:操作数包含在指令中
- 寄存器操作数:操作数包含在CPU的某个内部寄存器中
- 存储器操作数:约定操作数事先存放在存储器中存放数据的某个单元
- 基本格式
MOV xx,yy
xx:目的操作数字段
yy:源操作数字段
- EA(Effect Address):有效地址
- PA(Physical Address):物理地址
寻址方式
1、立即数寻址
- 操作数直接存在指令中,紧跟在指令的操作码之后。
- 主要用来对寄存器赋值,只能用于源操作数字段。
例如:MOV BX,1234H ;执行指令后,(BX)=1234H
- 注意:立即数只能是整数,不能是小数、变量或其他类型的数据。
2、寄存器寻址
- 操作数就在CPU的内部寄存器中
例如:MOV DX,AX ;AX的内容送到DX中
- 注意:当源和目的操作数都采用寄存器寻址时,一定要注意类型要一致。
立即数寻址和寄存器寻址都没有有效地址(EA)
3、直接寻址
- 操作数在存储器中,存储单元的有效地址由指令直接指出
- 操作数本身若无特殊声明使用段超越,则默认存放在内存的数据段(DS段)中
例如:MOV AX,[1070H]
;若(DS)=2000H,该指令的操作数的物理地址为PA = 2000H + 1070H = 21700H,则执行过程是将物理地址为21700H和21701H两个单元的内容取出送AX。
4、寄存器间接寻址
- 操作数在存储器中,操作数的有效地址一般在基址寄存器BX、BP或变址寄存器SI、DI中,即EA等于其中某一个寄存器的内容。
- 如果指令前面没有用超越前缀指明具体的段寄存器,其操作数的段基址可以分为以下两种情况
- 操作数在当前数据段(DS给出段基址)
PA = 16 * (DS) + EA = 16 * (DS) + [ BX | SI | DI ] - 操作数在当前堆栈段(SS给出段基址)
PA = 16 * (SS) + EA = 16 * (DS) + (BP)
例如:MOV AX,[BX] ,若(DS) = 2000H,(BX) = 1000H
;EA = 1000H PA = 2000H * 16 +1000H = 21000H
5、寄存器相对寻址
- 操作数在存储器中,并且一般在指定基址寄存器BX、BP或变址寄存器SI、DI的内容进行间接寻址,但是操作数的EA(即偏移量)还要加上指令中指定的8位或16位位移量
- EA = [ BX | BP | SI | DI ] + { 8位或16位位移量 }
例如:MOV AL,COUNT[SI] or MOV AL,[COUNT + SI]
设(DS) = 6000H,(SI) = 1000H,COUNT = 55H(表示位移量的常量符号)
;EA = 1000H + 05H = 1005H。
PA = 6000H * 16 + 1000H + 05H = 61500H.
6、基址变址寻址
8086指令系统允许把基址寄存器和变址寄存器组合起来构成一种新的寻址方式
- 操作数一定存在存储器中,操作数的EA是由指令指定的一个基址寄存器(BX、BP)加上一个变址寄存器(SI、DI)的内容,即 EA = [ BX | BP ] + [ SI | DI ]
- 只要用上BP,那么默认段寄存器就是SS;在其他情况,默认段寄存器都为DS。也可以用使用段超越前缀来指定段寄存器。
例如:MOV AX,[BP][SI] ,设(SS) = 2000H,(SI) = 1000H,(BP) = 5000H
;EA = 1000H + 5000H = 6000H
PA = 20000H + 5000H + 1000H = 26000H
7、相对基址变址寻址
- 操作数的EA是一个基址寄存器内容、一个变址寄存器内容和8位或16位偏移量这三者之和。
- 与基址变址一样,使用基址寄存器BP时,默认的段寄存器是SS,其他情况默认的段寄存器是DS。
- EA = [ BX | BP ] + [ SI | DI ] + { 8位或16位位移量 }
例如:设(BX) = 1000H,(SI) = 2000S), (DS)= 3000H,位移量为0020H
MOV AX,[BX+DI+1020H]
;EA = 1000H + 2000H + 1020H = 4020H
PA = 30000H + 4020H = 34020H