一、80286的8中寻址方式
1、 立即寻址方式(immediate addressing)
立即数:操作数直接放在指令中,紧跟在操作码之后,它作为指令的一部分存放在代码段里。
指令中的源操作数是立即数,即源操作数是参加操作的数据本身。
eg1:MOV AL, 5
指令执行后,(AL)=05H
eg2:MOV AX, 1234H
执行指令后,(AX) = 1234H
备注:立即寻址方式用来表示常数,它经常用于给寄存器赋初值,并且只能用于源操作数字段,不能用于目的操作数字段,且源操作数长度应与目的操作数长度一致。
2、 寄存器寻址方式(register addressing)
参加操作的操作数在CPU的通用寄存器中(寄存器可存放源、目的操作数)。
eg: MOV AX, BX
如(BX) = 1234H,执行指令后(AX) = 1234H
3、 直接寻址方式(direct addressing)
指令中直接给出操作数的偏移地址。
eg: MOV AX, [0012]
备注:基地址默认在DS处,否则应该指定段跨越前缀,在该方式下可用符号地址代替数值偏移地址。MOV AX, [ VALUE ]
80x86为了使指令字不要过长,规定双操作数中,只能有一个使用存储器寻址方式,这就是一个变量常常要送到寄存器的原因。
4、 寄存器间接寻址方式(register indirect addressing)
参与操作的操作数存放在内存中,其偏移地址为指令中的寄存器的内容。由寄存器间接给出操作数的偏移地址。
间址寄存器:存放偏移地址的寄存器。包括a、基址寄存器(BX,BP)。b、 变址寄存器(SI,DI)
操作数的段地址(数据处于哪个段)取决于选择哪一个间址寄存器:
BX,SI,DI -> 默认在数据段
BP -> 默认在堆栈段
寄存器间接寻址包括:基址寻址(间址寄存器为基址寄存器BX,BP)和变址寻址(间址寄存器为变址寄存器SI,DI)。
5、 寄存器相对寻址方式(register relative addressing)(或称直接变址寻址方式)
操作数的偏移地址为寄存器的内容加上一个位移量(基址寻址,变址寻址)。
eg:MOV AX,[BX+DATA]
设DS=2000H,BX=0220H,DATA=05H
则:AX=[20225H]
6、 基址变址寻址方式(based indexed addressing)
操作数的偏移地址为一个基址寄存器的内容加上一个变址寄存器的内容,操作数的段地址由选择的基址寄存器决定。
eg:MOV AX,[SI+BX]
备注:这种寻址方式同样适用于数组或表格处理,首地址可存放在基址寄存器中,而用变址寄存器来访问数组中的各个元素。
7、 相对基址变址寻址方式(relative based indexed addressing)
操作数的偏移地址为一个基址寄存器的内容加上一个变址寄存器的内容,再加上一个位移量。操作数的段地址由选择的基址寄存器决定。
eg: MOV AX,[BP+SI+DATA]
8、 隐含寻址
指令隐含了的一个或两个操作数的地址,即操作数在默认的地址中
例: MUL BL
指令的执行:AL*BL->AX
二、80386和8486寻址方式
相对于前面所讲的寻址方式而言80386和80486寻址方式有效地址的计算增加了比例因子,即
EA = 基址寄存器+(变址寄存器 * 比例)+ 位移量
备注:这种寻址方式优点在于对于元素大小为2、4、8字节的数组,可以在变址寄存器中给出数组元素下表,而由寻址方式控制直接用比例因子把下标转换为变址值。
参考资料:《IBM-PC汇编语言程序设计(第二版)》