七种寻址方式(从该处学习转载,感谢,如有侵犯,请联系删除)
- 立即寻址
操作数作为指令的一部分而直接写在指令中,这种操作数称为立即数,这种寻址方式也就称为立即数寻址方式。
立即数寻址方式通常用于对通用寄存器或内存单元赋初值。说白了就是在代码中直接向寄存器赋固定值。
MOV AX,4576H;将16位数据4576H传送到AX寄存器
- 寄存器寻址方式
指令所要的操作数已存储在某寄存器中,或把目标操作数存入寄存器。把在指令中指出所使用寄存器(即:寄存器的助忆符)的寻址方式称为寄存器寻址方式。
寄存器寻址方式是一种简单快捷的寻址方式,源和目的操作数都可以是寄存器。
1、源操作数是寄存器寻址方式
如:ADD VARD, EAX ADD VARW, AX MOV VARB, BH等。
2、目的操作数是寄存器寻址方式
如:ADD BH, 78h ADD AX, 1234h MOV EBX, 12345678H等。
3、源和目的操作数都是寄存器寻址方式
如:MOV EAX, EBX MOV AX, BX MOV DH, BL等。
由于指令所需的操作数已存储在寄存器中,或操作的结果存入寄存器,这样,在指令执行过程中,会减少读/写存储器单元的次数,所以,使用寄存器寻址方式的指令具有较快的执行速度。通常情况下,我们提倡在编写汇编语言程序时,应尽可能地使用寄存器寻址方式,但也不要把它绝对化。
- 直接寻址
指令所要的操作数存放在内存中,在指令中直接给出该操作数的有效地址,这种寻址方式为直接寻址方式。
在通常情况下,操作数存放在数据段中,所以,其物理地址将由数据段寄存器DS和指令中给出的有效地址直接形成,但如果使用段超越前缀,那么,操作数可存放在其它段。
说白了,就是找到操作地址然后取上面的值,就是直接寻址
- 寄存器间接寻址
操作数在存储器中,操作数的有效地址用SI、DI、BX和BP等四个寄存器之一来指定,称这种寻址方式为寄存器间接寻址方式。该寻址方式物理地址的计算方法如下:
说白了就是,需要基地址寄存器、偏移地址寄存器,就能够找到偏移后的地址,从而取得值
- 寄存器相对寻址方式
操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)或变址寄存器(SI、D
I)的内容和指令中的8位/16位偏移量之和。其有效地址的计算公式如公式所示。
说白了,就是在寄存器间接寻址的基础上,偏移地址也要变址寄存器通过累加一个长度(偏移8位、16位)之后,再加上段寄存器地址得到最终地址。
- 基址加变址寻址方式
操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)和一个变址寄存器(SI、DI)的内容之和。其有效地址的计算公式如公式所示。
在不使用段超越前缀的情况下,规定:如果有效地址中含有BP,则缺省的段寄存器为SS;否则,缺省的段寄存器为DS。
说白了,就是地址=基址+变址+段寄存器地址
- 相对基址加变址寻址方式
作数在存储器中,其有效地址是一个基址寄存器(BX、BP)的值、一个变址寄存器(SI、DI)的值和指令中的8位/16位偏移量之和。其有效地址的计算公式如公式所示。
在不使用段超越前缀的情况下,规定:如果有效地址中含有BP,则其缺省的段寄存器为SS;否则,其缺省的段寄存器为DS。
说白了就是地址=基址+变址+8位/16位偏移量+段寄存器地址。
总结:
总的来说,后面几种真的记不住,记住寻址效率:立即寻址>寄存器寻址>直接寻址>间接寻址>其他。