当前位置:课程学习>>第二章>>知识讲解>>视频课堂>>知识点三
以下视频[录人 2.2.8086寻址方式与指令系统.寻址方式]讲解8086的7种寻址方式:
1.立即寻址
2.寄存器寻址
3.直接寻址
4.寄存器间接寻址
5.寄存器相对寻址
6.基址变址寻址
7.相对基址变址寻址
接下来,我们详细了解每种寻址方式的特点、示例,以及使用时的注意事项。
1.立即寻址,操作数直接出现在指令中,此时的操作数也叫立即数。
立即数紧跟在操作码后面,一起存放在代码段中。
例如:
MOV AX,2010H
在该指令格式中,AX是目标操作数,2010H是源操作数。
操作数2010H使用了立即数寻址。
在所有的指令中,立即数只能作源操作数,不能作目标操作数。立即数应与目标操作数的长度一致。立即数默认采用十进制形式,以十六进制形式出现的立即数应以字母H为后缀。以十六进制形式出现的立即数,若以字母开头,则必须以数字0为前缀。立即数还可以用表示+、-、×、/表示的算术表达式,也可以用圆括号改变运算顺序。立即数只能是整数,不能是小数、变量或其它类型的数据。
原理及操作示例,在[录屏\02 8086寻址方式与指令系统_1.mp4],代码为 示例代码中的 1.asm。
2.寄存器寻址
操作数在寄存器中,在指令中指定寄存器名称。
例如
MOV AX,2010H
在该指令格式中,AX是目标操作数,2010H是源操作数。
在该指令格式中,AX是目标操作数,2010H是源操作数。在该指令格式中,AX是目标操作数,2010H是源操作数。
操作数AX使用了寄存器寻址。
在一条指令中,寄存器寻址方式既可用于源操作数,也可用于目标操作数,还可以两者都用寄存器寻址方式。源操作数与目标操作数的长度应一致。例如,不能将寄存器AX的内容传送到寄存器BH中,也不能将寄存器BH的内容传送到寄存器AX中。两个操作数不能同时为段寄存器。目标操作数不能是代码段寄存器。
原理及操作示例,在[录屏\02 8086寻址方式与指令系统_2.mp4],代码为 示例代码中的 2.asm。
3.直接寻址
操作数在存储器中,指令中以具体数值的形式直接给出操作数所在存储单元的有效地址。为了与立即数区别,该有效地址必须用方括号[]括起。
例如:
MOV AX,[2010H]
该指令的源操作数[2010H]采用直接寻址方式。
若(DS)=2000H,那么指令执行后,(AX)=1225H。
取出存储器地址为 2000H*10H + 2010H = 22010H 处的数据 1225H,移入AX寄存器。
采用直接寻址方式时,如果指令中没有用前缀说明操作数存放在哪个段,则操作数默认存放在数据段。8086系统允许操作数存放在代码段、堆栈段或附加段。此时,就需要在指令中指明段超越。
例如:
MOV ES:[1225H],AX
该指令的目标操作数采用直接寻址方式。操作数存放在由ES指示的附加段中。
物理地址=ES×10H+1225H。
在汇编语言指令中,可以用符号地址代替数值地址。
例如:
MOV AX,NUMA
此时,NUMA是存放操作数的内存单元的符号地址。
上面这条指令还可以写成如下的形式:
MOV AX,[NUMA]
如DATA1数据存放在附加段,则可以用如下的形式指定段跨越前缀:
MOV AX,ES: NUMA
或
MOV AX,ES:[ NUMA]
原理及操作示例,在[录屏\02 8086寻址方式与指令系统_3.mp4],代码为 示例代码中的 3.asm。
其中数据总线16条,地址总线20条。
4.寄存器间接寻址
操作数的有效地址EA存放在基址寄存器BX、BP或变址寄存器SI、DI中。为了区别于寄存器寻址方式,指令中指定的寄存器名要用[]括起来。
指令中使用SI、DI、BX寄存器时,操作数默认存放在数据段中;使用BP寄存器时,操作数默认存放在堆栈段中,允许段超越。
即,
操作数的物理地址=(DS)×10H+(SI)或(DI)或(BX)
或
例如:
MOV AX,[SI]
该指令的源操作数采用寄存器间接寻址方式。
若(DS)=2000H,(SI)=2010H,那么指令执行后,(AX)=1225H。
取出在存储器地址为2000H*10H+2010H=22010H处的数据,其值为1225H,移入AX寄存器。
如操作数不存放在间址寄存器默认的段,则指定段超越的指令可采用如下形式。
MOV AX,ES:[SI]
此时,操作数的物理地址=ES×10H+SI。
原理及操作示例,在[录屏\02 8086寻址方式与指令系统_4.mp4],代码为 示例代码中的 4.asm。
5.寄存器相对寻址
操作数的有效地址EA是指令中指定的基址或变址寄存器的值与位移量之和。指令中使用SI、DI、BX寄存器时,操作数默认存放在数据段中;使用BP寄存器时,操作数默认存放在堆栈段中,允许段超越。
操作数的物理地址=(DS)×10H + (SI)或(DI)或(BX) + 8位或16位位移量
或
操作数的物理地址=(SS)×10H + (BP) + 8位或16位位移量
例如:
MOV AX,8[BX]
该指令的源操作数采用寄存器相对寻址方式。
若(DS)=2000H,(BX)=2008H,那么指令执行后,(AX)=1225H。
把在存储器地址为 2000H*10H + 2008H + 8 = 22010H 处的数据取出,移入AX寄存器。
偏移量是符号数,8位偏移量的取值范围为:00~0FFH(即+127D~-128D);16位偏移量的取值范围为:0000~0FFFFH(即+32767D~-32768D)。8086汇编允许用下面三种形式表示相对寻址,它们是等效的。
MOV AX,[BX]+8
MOV AX,8[BX]
MOV AX,[BX+8]
原理及操作示例,在[录屏\02 8086寻址方式与指令系统_5.mp4],代码为 示例代码中的 5.asm。
6.基址变址寻址
操作数的有效地址EA是指令中指定的基址寄存器的值与变址寄存器的值之和。
指令中使用基址寄存器BX时,操作数默认存放在数据段中;
使用基址寄存器BP时,操作数默认存放在堆栈段中,允许段超越。
操作数的物理地址 =(DS)×10H+(SI)或(DI)+(BX)
或
操作数的物理地址 =(SS)×10H+(SI)或(DI)+(BP)
例如:
MOV AX,[BX] [SI]
该指令的源操作数采用基址变址寻址方式。
若(DS)=2000H,(BX)=2008H,(SI)=8H,那么指令执行后,(AX)=1225H。
从存储器地址为 2000H+2008H+8H处读出数据,移入AX寄存器。
原理及操作示例,在[录屏\02 8086寻址方式与指令系统_6.mp4],代码为 示例代码中的 6.asm。
7.相对基址变址寻址
操作数的有效地址EA是指令中指定的基址寄存器的值与变址寄存器的值以及8位或16位位移量之和。指令中使用基址寄存器BX时,操作数默认存放在数据段中;使用基址寄存器BP时,操作数默认存放在堆栈段中,允许段超越。
操作数的物理地址 =(DS)×10H+(SI)或(DI)或(BX)+8位或16位位移量s
或
操作数的物理地址 =(SS)×10H+(SI)或(DI)或(BP)+8位或16位位移量
例如:
MOV AX,3[BX] [SI]
该指令的源操作数采用寄存器相对寻址方式。
若(DS)=2000H,(BX)=2008H,(SI)=5H,那么指令执行后,(AX)=1225H。
从存储器地址为 2000H+2008H+5H+3=22010H处读出数据,移入AX寄存器。
原理及操作示例,在[录屏\02 8086寻址方式与指令系统_7.mp4],代码为 示例代码中的 7.asm。