七种寻址方式
寻址方式可以分为:
①立即数寻址方式
②寄存器寻址方式
③存储器寻址方式 (而存储器又可以分以下五种方式)
直接寻址方式
寄存器间接寻址方式
寄存器相对寻址方式
基址加变址寻址方式
相对加基址变址寻址方式
1、立即数寻址
操作数为立即数,直接存放在指令的操作数字段中。
立即数寻址时,只允许源操作数为立即数,目标操作数必须是寄存器或存储器,其作用是给寄存器或存储单元赋值。
在汇编中,立即数不能作为指令中的第一操作数。
例如:
MOV AL,80H
MOV AX,1234H
2、寄存器寻址
操作数在指令所指示的
寄存器
之中。
表示格式:直接在指令中写出寄存器名称
例如:
INC BX
MOV AX,CX
3、存储器寻址
操作数在指令所指示的
寄存器
之中 (
内存、I/O口
)
表示格式:直接在指令中写出寄存器的名称
包括一下方式:
直接寻址方式
寄存器间接寻址方式
寄存器相对寻址方式
基址加变址寻址方式
相对加基址变址寻址方式
3.1、直接寻址
操作数存在内存中,操作数的
偏移地址
直接表示在指令中
表示格式:[偏移地址]
默认操作数
存放在内存的
数据段
中
例如:
MOV AL,[1046H]
段超越
操作数也允许存放在其他段中(ES,SS),
此时应该在指令指明段超越。
段超越;
若操作书不在指令默认的段中,而是在其他某个段中,
则需要在指令中加以表示,这种情况称为段超越。
例如:
直接寻址方式中操作数在附加段中,则应该表示为:
MOV AL,ES:[1064H]
3.2、寄存器间接寻址方式
操作数存在存储器中,操作数的偏移地址在BX、SI、DI和BP的某个寄存器中。
若以BX,SI,DI作为间接寻址寄存器
则默认操作数存放在数据段中,用DS寄存器中的内容作为地址
若以BP作为间接寻址寄存器
则默认操作数存放在栈堆段中,用SS寄存器中的内容作为地址。
例如:
MOV AX,[SI];
MOV [BX],AL;
图解在这里就不给大家画出来了,
第一个
MOV AX,[SI]
,这个SI默认使用的是DS数据段寄存器中的值,例如2000H,则2000Hx10H=20000H,在加上SI本身中的偏移地址,得到一个实际地址,将这个地址中的值传给AX。
第二个 **MOV [BX],AL;**这个是用的BX即默认DS数据段寄存器中的值,2000H,则2000Hx10H=20000H,再加上BX本身的偏移地址,得到一个实际地址,再将AL中的数据传到这个地址当中。
3.3、寄存器相对寻址方式
操作数在存储器中,操作数的有效地址是一个
基址寄存器(BX、BP)
或
变址寄存器(SI、DI)
的内容加上指令中给定的8位或16位位移量之和。
如果SI、DI、或BX中的内容作为有效地址的一部分,
那么引用的段寄存器是DS;
如果BP中的内容作为有效地址的一部分,
那么引用的段寄存器是SS。
下面指令中,源操作数采用寄存器相对寻址,
引用的段寄存器是SS
MOV BX,[BP-4]
下面指令中,目的操作数采用寄存器相对寻址,
引用的段寄存器是ES
MOV ES:[BX+5],AL
3.4、基址加变址寻址方式
在基址加变址寻址方式中,通常把
BX和BP
看作是
基址寄存器
,把
SI和DI
看作
变址寄存器
,
可把两种方式组合起来形成一种新的寻址方式。
基址加变址的寻址方式是把一个基址寄存器BX或BP的内容,加上便知寄存器SI或DI的内容,并以一个段寄存器作为地址基准,作为操作数的地址,
例如:
MOV AH,[BP][SI];
3.5、相对基址加变址寻址方式
在相对基址变址寻址方式中,通常把BX和BP看作是基址寄存器,把SI和DI看作变址寄存器。他是把一个基址寄存器BP或BX的内容加上变址寄存器SI或DI的内容;**再加上指令中给定的8位或16位位移量,**并以一个段寄存器作为地址基准,作为操作数的地址。
当基址寄存器为BX时,段寄存器使用DS;
当基址寄存器为BP时,段寄存器则用SS。
例如; MOV [BX+DI+1234H],AH