一、立即寻址方式
立即数可以是8位、也可以是16位
注意:立即数只能作为源操作数,而不能作为目的操作数
用途:用于直接指定一个常数送给寄存器
二、寄存器寻址方式【存取寄存器操作数完全在CPU内部进行】
1、一个存储单元逻辑地址表示形式:段基址:偏移量
(1)段基址由某个段寄存器提供;
偏移量表示了该存储单元与段起始地址之间的距离,也叫做有效地址EA
(2)有效地址EA:
a.位移量:位移量是指令中直接给出的一个8位或16位数。一般源程序中以操作数的名字(变量名或标号)的形式出现
b.基址:由基址寄存器BX或基址指针BP提供的内容
c.变址:由源变址寄存器SI或目的寄存器DI提供的内容
例:MOV AX,BX 指令执行后:AX=BX,BX保持不变
2、用途:用于指定两个寄存器作为操作数
三、直接寻址方式
1、操作数的有效地址EA只有位移量地址分量
2、指令形式如下:MOV AX,DS:[4040H]
方括号里的数值作为操作数的偏移地址(有效地址EA)
操作数的物理地址=(DS)*10H+EA
3、在汇编中,直接寻址方式用符号或常数来表示
(1)用符号表示
(2)用常数表示
注意:用常数表示时,必须要用方括号括起来。段寄存器不能省略
4、存储器读操作
例:MOV AX,DS:[2000H]
5、寄存器写操作
例:MOV DS:[4000H],AX
6、符号地址
采用符号地址时,用数据定义伪指令DB、DW等定义的存储单元名字,其对应的段默认数据段,但是如果使用EQU符号定义伪操作来定义符号地址,则需要加上前缀“DS:”
例:VALUE DW 5678H
MOV AX,VALUE
MOV AX,[VALUE]
7、段前缀
操作数的短地址默认为数据段,如果操作数在其他段中存放,成为段超越,即用操作数前加上段寄存器和冒号表示。
无段超越前缀:物理地址=(DS)*10H+EA
有段超越前缀ES:物理地址=(ES)*10H+EA
例:VALUE EQU 1000H
MOV AX,DS:[VALUE]
MOV AX,ES:[VALUE]
8、用途:用于直接指定一个变量作为操作数
四、寄存器间接寻址
1、注意:在寄存器间接寻址中只允许BX、BP、SI和DI
操作数的物理地址=(DS)*10H+(BX)
操作数的物理地址=(DS)*10H+(SI)
操作数的物理地址=(DS)*10H+(DI)
操作数的物理地址=(SS)*10H+(BP)
2、用途:用寄存器间接指向一个内存单元,寄存器的值不同,指向的内存单元的地址就不同,常用于循环程序中
五、寄存器相对寻址(基址寻址/变址寻址)
1、有效地址EA是一个寄存器和位移量之和
操作数的物理地址=(DS)*10H+(BX)+8位(16位)位移量
操作数的物理地址=(DS)*10H+(SI)+8位(16位)位移量
操作数的物理地址=(DS)*10H+(DI)+8位(16位)位移量
操作数的物理地址=(SS)*10H+(BP)+8位(16位)位移量
2、常用于查表操作
例:
3、用途:特别适用于访问一维数组,寄存器可作为数组下标(或数组元素的位置),利用修改寄存器的值来定位数组中的各个元素
4、这种寻址方式只需通过改变寄存器的内容就可用一条指令访问不同的存储单元,并且由于增加了一个位移量分量,因此他们能很方便地访问数组和表格数据
六、基址变址寻址
EA=基址+变址+位移量
操作数的物理地址=(DS)*10H+(BX)+(DI)
操作数的物理地址=(DS)*10H+(BX)+(SI)
操作数的物理地址=(SS)*10H+(BP)+(SI)
操作数的物理地址=(SS)*10H+(BP)+(DI)
例:MOV AX,[BX+DI]
七、相对基址变址寻址
操作数的物理地址=(DS)*10H+(BX)+(DI)+8位(16位)位移量
操作数的物理地址=(DS)*10H+(BX)+(SI)+8位(16位)位移量
操作数的物理地址=(SS)*10H+(BP)+(SI)+8位(16位)位移量
操作数的物理地址=(SS)*10H+(BP)+(DI)+8位(16位)位移量
八、总结