? ? ? ?基址寻址和变址寻址都属于偏移寻址,最大的区别在于 基址寻址中隐含的寄存器是寻址过程中的“基地址” , 变址寻址中隐含的寄存器的地址则是寻址过程中的“偏移量”。
? ? ? ?偏移寻址是直接寻址和寄存器间接寻址的一种结合,有多种形式,这里只讨论基址寻址和变址寻址。它的有效地址的计算公式是: EA=A+(R) 。这要求指令中至少要有两个地址字段,且至少其中一个是显示的,其中一个是形式地址A被直接使用,另一个是寄存器地址或者基于操作码的一个隐含引用的寄存器。
? ? ? ?基址寻址中被引用的寄存器中有一个存储器地址,地址字段含有一个相对于该地址的偏移量。所以寄存器中的地址就是接下来运行使用到的“基地址”,在一段时间内都是不用改变的;改变寄存器中的“基地址”之后,你就可以在另外一个地址空间中进行寻址了。综上所诉, 通过基址寻址,你可以得到一个很大的寻址空间 。 段寻址 就是基址寻址的一种。
? ? ? ?变址寻址中指令的地址字段引用一个主存的地址,被引用的专用寄存器中含有相对于这个地址的一个偏移量。所以在你运行的一段时间中,指令中的地址都不会改变,通过逐渐的改变寄存器的内容就可以访问一片连续的地址空间了。 变址寻址最重要的应用则是在对数组进行重复的操作 。
可能尚有一些细节没有指出,还请大家不吝赐教。
比如这样一个子程序
SEG: INC A
M0VC A,@A+PC
RET
DB 00H,01H,02H,03H
程序要实现的是当A=0 时, 取表里的00H,=1时,取01H...。因为PC值 是当前指令的地址, 下一条是RET占了一个地址。再下一个地址才是存放 01H,所以要加1 修正。