汇编语言寄存器间接寻址方式

本文内容

操作数的有效地址 EA 就在寄存器中,这种寻址方式称为寄存器间接寻址。寄存器间接寻址方式与寄存器寻址方式不同,它不是把寄存器的内容作为操作数,而是把寄存器的内容作为操作数的地址,而操作数还是在内存中,故称为间接寻址。注意,在寄存器间接寻址中只允许 BX、BP、SI 和 DI。

操作数的物理地址=(DS)×10H+(BX)

操作数的物理地址=(DS)×10H+(SI)

操作数的物理地址=(DS)×10H+(DI)

操作数的物理地址=(SS)×10H+(BP)

由于 EA 是间接从寄存器中得到的,所以称为寄存器间接寻址方式。8086 CPU 只允许 BX、BP、SI、DI 这四个寄存器作为间接地址寄存器。

在这种寻址方式中,操作数同样也可以用段超越前缀。此寻址方式适于简单的表格处理。

例 8 MOV AX,[BX]

已知(DS)=1500H,(BX)=4580H,则

EA=(BX)=4580H

物理地址=(DS)×10H+EA=15000H+4580H=19580H

若(19580H)=2364H

执行指令后:(AX)=2364H

例 9 MOV SS:[DI],AX

已知(ES)=2500H,(DI)=5318H,则

EA=(DI)=5318H

物理地址=(SS)×10H+EA=25000H+5318H=2A318H

若(AX)=2468H

执行指令后:(2A318H)=68H

(2A319H)=24H

例 10

1
2
3
4
5
MOV AX,[BX]      ; 默认DS寄存器作段地址

MOV DX,[BP]      ; 默认SS寄存器作段地址

MOV ES:[DI],AX     ; 指定ES寄存器作段地址

Debug 下的实验如图 5 所示。

寄存器间接寻址示例

图 5 寄存器间接寻址示例

图中第一条指令 NOP 为空操作,是为了便于观察跟踪指令有意安排。由于 BX、BP、SI 寄存器的值为 0,所以由图中右侧可见,上面 3 条指令的操作数逻辑地址分别是:

DS:0000

SS:0000

ES:0000

巧合的是:这里 3 个内存单元的值都是 20CD。

注意,如果指令中指定 BX、SI、DI 寄存器作间接寻址的有效地址,则默认 DS 寄存器作段地址,如果指令中指定 BP 寄存器作间接寻址的有效地址,则默认 SS 寄存器作段地址。

寄存器间接寻址方式的用途:用寄存器间接指向一个内存单元,寄存器的值不同,指向的内存单元的地址就不同,常用于循环程序中。

请参阅

(完)

comments powered by Disqus

本文内容