七种寻址方式:
1. 立即寻址:
操作数包含在指令中,是指令的一部分。此时的操作数称为立即数
MOV EAX, 1234H
2. 寄存器寻址:
操作数在CPU寄存器中,指令中指定寄存器编号
MOV SI, AX
MOV AL, AH
3. 直接寻址:
操作数在存储器中,指令直接包含操作数的有效地址。此时操作数一般存放在数据段DS中,采用换段前缀可以使用其它段寄存器。
MOV AX, [1234H]
4. 寄存器间接寻址:
操作数在存储器中,操作数有效地址在ESI、EDI、EBX、EBP之一种。在不使用换段前缀的情况下,
若有效地址在SI/DI/BX中,则以DS的值为段值;
若有效地址在BP中,则以段寄存器SS的值为段值。
MOV AX, [SI]
MOV [BP], CX
5. 寄存器相对寻址:
操作数在存储器中,操作数的有效地址是一个基址寄存器(BX、BP)或变址寄存器(SI、DI)内容加上指令中给定的8位或16位位移量之和。即:
EA = (BX/BP/SI/DI) + (8/16位位移量)
在不使用换段前缀的情况下,若SI/DI/BX的内容作为有效地址的一部分,则以DS的值为段值;若BP的内容作为有效地址的一部分,则以段寄存器SS的值为段值。
在指令中给定的8位或16位位移量以补码形式表示。在计算有效地址时,若位移量是8位,则将其有符号扩展为16位,当有效地址超过FFFFH,则对其进行64K取模。
MOV AX, [DI+1223H]
MOV BX, [BP-4]
MOV ES:[BX+5], AL
注意:书写时基址或变址寄存器名一定要放在方括号中,而位移可以不写在方括号中。
下面两条指令是等价的:
MOV AX, [SI+3]
MOV AX, 3[SI]
6. 基址加变址寻址:
操作数在存储器中,操作数的有效地址由基址寄存器之一的内容与变址寄存器之一的内容相加得到。
EA = (BX/BP) + (SI/DI)
在不使用换段前缀的情况下,若BP的内容作为有效地址的一部分,则以SS的值为段值;否则以DS的值为段值。有效地址超过FFFFH,则对其进行64K取模。例如:
MOV AX, [BX+DI] <=>MOV AX, [DI][BX]
MOV AX, ES:[BX+SI]
MOV DS:[BP+SI], AL
7. 相对基址加变址寻址:
操作数在存储器中,操作数的有效地址由基址寄存器之一的内容与变址寄存器之一的内容以及指令中给定的8位或16位位移量相加得到。
EA = (BX/BP) + (SI/DI) + (8/16位位移量)
在不使用换段前缀的情况下,若BP的内容作为有效地址的一部分,则以SS的值为段值;否则以DS的值为段值。有效地址超过FFFFH,则对其进行64K取模。例如:
MOV AX, [BX+DI+1234H]
MOV AX, 1234H[BX+DI]
MOV AX, 1234H[BX][DI]
MOV AX, 1234H[DI][BX]
来源:https://blog.csdn.net/weixin_42645168/article/details/102759843