寄存器间接寻址(register indirect addressing)
操作数在存储器中,其有效地址EA存放在某个寄存器中。寄存器的使用在16位寻址和32位寻址时不一样。
(1)16位寻址
寄存器
有效地址存放在SI, DI, BX, BP中。
如果指令中指定的寄存器是BX, SI, DI,则操作数在数据段中,段基址在DS中,操作数的物理地址为:
SI:是源变址寄存器,默认段地址和DI一样,在DS中.和DS联用
DI:是目的变址寄存器.一般情况下与ds联用,来确定某个储存单元的地址
BX:基址寄存器,常用来存放访问内在时的基地址
BP:是基址指针,段地址默认在SS中.可以定位物理地址,比如:”mov ax,[bp+si+6]/mov ax,[bp+di+6]
SS: 堆栈段地址 ,指出当前堆栈的底部地址,即存放堆栈段的段基值。一旦你确定了堆栈地址,ss也不能随便改变了
DS:数据段寄存器,指出当前程序使用的数据所存放段的最低地址,即存放数据段的段基值
物理地址
在一般情况下,如果有效地址在SI、DI和BX中,则以DS段寄存器的内容为段值;
如果有效地址在BP中,或者是说是指令中指定的寄存器是BP,则操作数在堆栈中,段基址在SS中(SS段寄存器的内容为段值。),操作数的物理地址为:
物理地址=(SS)×16+(BP)
例如:
MOV AX, [SI] ; 自动引用DS作为段寄存器,以DS段寄存器的内容为段值
假设 (DS)= 5000H, (SI)= 1234H
注意,在汇编语言中,带方括号“[ ]”的操作数表示存储器操作数,括号中的内容作为存储单元的有效地址EA。
若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS。
寄存器SI的值不是操作数,而是操作数的地址(有效地址)。该操作数的物理地址应由DS和SI的值形成。
物理地址=(DS)×16+(SI)=50000H+1234H=51234H。那么存储的物理存储单元地址是51234H。
再设该字存储单元的内容是6789H,那么在执行该指令后,(AX)= 6789H。
MOV DL, CS:[BX] ; CS作为段寄存器
指定段超越前缀,此时引用的段寄存器是CS而不是自动引用了DS
目的操作数显式指定的段寄存器为CS
目的操作数的物理地址PA = CS * 16+BX
DL的值为该地址单元中存放的字类型数据
MOV AX, [BP] 引用的段寄存器为SS
设SS=3000H,BP=1000H该指令寻址及执行过程如图所示。
目的操作数的物理地址PA =(SS)×16+(BP)=30000H+1000H=31000H
把从物理地址为31000H开始的对应的一个字的值传送给AX寄存器。
(2)32位寻址
寄存器
八个32位通用寄存器均可作为寄存器间接寻址使用。除ESP和EBP默认段寄存器为SS外,其余六个通用寄存器均默认段寄存器为DS。
32位cpu通用寄存器: EAX,EBX,ECX,EDX,ESI,EDI(缺省为DS)/EBP,ESP(缺省默认为SS)
物理地址
**物理地址=(DS/SS)×16+(EAX/EBX/ECX/EDX/ESI/EDI/EBP/ESP)**
寄存器间接寻址方式用于表格处理,执行完一条指令后,只需要修改寄存器内容就可取出表格中的下一项。