本节内容:当指令操作数为内存操作数,且内存操作数的地址使用指针寄存器表示时,称为寄存器间接寻址方式。
■寄存器间接寻址方式:在地址表达式中,只能使用BX、SI、DI、BP四个指针寄存器用来寻址。
7.4.1 寄存器间接寻址方式
寄存器间接寻址方式的操作数在存储器中,操作数有效地址只能使用SI、DI、BX、BP四个寄存器。一般情况下,缺省段超越前缀,如果有效地址在SI、DI变址寄存器中,则默认段寄存器为DS。如果有效地址在BP堆栈基址指针寄存器中,默认段寄存器为SS。
图7-7 寄存器间接寻址方式
如图7-7所示:
假设:(DS)=5000H,(SI)=1234H。
MOV AX,[SI];意为将数据段SI(偏移地址1234H)处存储的值送入AX寄存器。存取的物理存储单元地址为51234H。如果该存储单元的内容是5678H,那么(AX)= 5678H。
在其他段中使用寄存器间接寻址方式:
MOV DL,CS:[BX] ;将代码段CS内偏移地址BX处一个字节的值送入DL寄存器。
MOV [BP],CX ;引用缺省段寄存器为SS,将CX寄存器的值送入堆栈段内偏移地址BP处。
寄存器间接寻址方式可以用于表格处理,只要修改指针寄存器的内容就可以方便的处理表中的另一项。
动手实验20:演示寄存器间接寻址方式
如图7-8所示,在debug调试器内输入:
mov si,1234H;将偏移地址1234H送入SI寄存器。
mov ax,[si];将数据段si偏移地址处的值送入ax寄存器。
图7-8 演示寄存器间接寻址方式
谨慎
在书写表示寄存器间接寻址时,寄存器必须要放在方括号中。
如:MOV [SI],AX ;将AX的值送入数据段内偏移地址SI处对应的存储空间
MOV SI,AX ;将AX寄存器的值送入SI寄存器
7.5节 寄存器相对寻址方式
本节内容:寄存器相对寻址方式。
■寄存器相对寻址方式:指令操作数为内存操作数,操作数的有效地址是一个基地址寄存器(BX,BP)或变址寄存器(SI,DI)加上指令中给定的8位或16位位移量之和。
7.5.1 寄存器相对寻址方式
寄存器相对寻址方式的操作数在存储器中,操作数的有效地址是一个基地址寄存器(BX,BP)或变址寄存器(SI,DI)加上指令中给定的8位或16位位移量之和。如图7-9所示:
图7-9 寄存器相对寻址方式地址表达式
通常BX,SI,DI引用数据段DS,BP引用堆栈段SS。
在指令中给定的8位或16位位移量如果是有符号整数,则采用补码形式表示。如果是8位有符号整数,则带符号位扩展成16位。
如果所得地址超出FFFFH,则取其64K(FFFFH)的模。
如图7-10所示:
图7-10 寄存器相对寻址方式
假设(DS)=5000H,(DI)=3456H。
MOV AX,[DI+1234H] ;那么内存操作数[DI+1234H]的物理地址为5468AH(5000H*16+3456H+1234H),(AX)=5678H。
动手实验21:演示寄存器相对寻址方式
如图7-11所示,在debug调试器内输入:
mov ax,5000H
mov ds,ax;将段值5000H赋给ds段寄存器。
mov word ptr [468ah],6789h;将6789H送入数据段偏移地址468aH处。
mov di,3456H;将偏移地址3456H送入di寄存器Mov ax,[di+1234H];将数据段偏移地址di+1234H地址处的值送入ax寄存器。
图7-11 寄存器相对寻址方式
在其他段中使用寄存器相对寻址方式:
MOV BX,[BP-4];默认引用SS段寄存器,将堆栈段BP-4偏移地址处存储的16位数存入BX。
MOV ES:[BX+5],AL ;引用ES段寄存器,将AL的值存入附加段BX+5偏移地址处。
寄存器相对寻址方式通常用于表格处理,表格的首地址可设置为指令中的位移量,利用修改基址或变址寄存器的内容来存取表格中的项值。这种方式很有利于实现高级语言中对结构或记录等数据类型所实施的操作。我们将在后续课程的代码中反复练习。
提示
在书写基址或变址寄存器名一定要放在方括号中,而位移可不写在方括号中。如下两种方式等价:
MOV AX , [SI+3]
MOV AX,3[SI]
本文摘自编程达人系列教材《X86汇编语言基础教程》。资料下载www.bcdaren.com