姓名:朱嘉仪 学号:16020199053
转载自https://zhuanlan.zhihu.com/p/22704404
【嵌牛导读】在8086\8088系列的处理器中,内存寻址方式有五种。下面从字面意思分别考察这五种寻址方式。
【嵌牛鼻子】8086 寻址方式 寄存器
【嵌牛提问】8086寻址方式都有哪些?用于寻址的寄存器都有哪些?
【嵌牛正文】
1、直接寻址
直接指以立即数形式给出地址,不存在任何的歪歪扭扭。所谓立即数则是在指令中已经直接给出的地址。
我们知道,指令结构采用“操作码+地址码”的形式,而立即数则在地址码中给出。
举例来说:
汇编代码 MOV AX,[3];
机器码(16进制) A1 03 00;
其中AX的定位由操作码A1给出,而明显的在地址码部分直接给出了0003(倒序读)的内存地址。
这种在地址码部分直接给出内存地址空间定位的方式就是立即寻址。立即寻址的特征是方便定位,但无法在运行该程序的时候进行地址变化。
2、寄存器间接寻址
将内存的地址存放在寄存器中,以特定寄存器中的值作为要定位的地址。
有四种寄存器用来存放内存地址,它们分别是:BX,BP,DI,SI。当这四种寄存器单独用以寻址,其本质含义没有什么不同。但从设计用意来理解bx,bp更趋向于“行”的意义,而di,si更趋向于列的意义。更广义地说,前BX,BP表示的维度要比DI,SI更高。
而BX,BP在寻址结构中是互斥的,如同SI,DI在寻址结构中也是互斥的。因为它们代表着同一维度上地址存结构。BX,BP的区别在于,BX默认的段地址SA在DS中, 而BP默认的段地址在SS中,即一个是用于管理数据段的结构,一个是用于管理栈段的结构。SI,DI的区别在于SI一般指向源地址,DI一般指向目的地址,两者结合起来可以进行串操作。
所谓间接寻址是相对于直接寻址而言的:内存地址存放在寄存器中,而不是直接放在指令中。
3、寄存器相对寻址
寄存器相对寻址中的“寄存器”依然指内存地址存放在寄存器中,但是由于添加了“相对”这一内容,需要要在寄存器的基础上加上一个立即数的因素。
举例来说:
MOV AX,[BX+3]
寄存器指得是BX,而相对指的是3。
这里的相对我们可以理解成相对地址。我们知道物理地址A=段地址SA+偏移地址EA。
相对地址可以理解成以立即数形式给出的偏移地址的偏移地址。
4、基址间址寻址
即使用两个寄存器来进行内存地址定位。
从实现角度来说,两个寄存器没有什么不同。但意义上,这两个寄存器分别表示了不同的维度。上已述,习惯上BX,BP相比DI,SI维度要更高。在基址间址寻址中,要高一个维度(因为两个寄存器只能有两个维度)。两者相加即得到我们要的偏移地址。
举例来说:
MOV AX,[BX+SI]
其中,认为BX的维度高于SI的维度。其中维度高的BX称为基址寄存器,维度低的SI称为间址寄存器。
5、相对基址间址寻址
如寄存器相对寻址一样,这里的相对指一个立即数地址。而基址指基址寄存器,间址指间址寄存器。相对基址间址寻址的意思就是一个立即数的值加上一个基址寄存器中的值再加上一个变址寄存器中的值得到我们的偏移地址。
举例来说:
MOV AX,[BX+SI+3]。
总结:物理地址A=段地址SA+偏移地址EA。寻址过程实际上是对偏移地址EA的计算过程。而段地址默认的寻址方式是寄存器间接寻址,也就是说,段地址的内容只能存在于某一段寄存器中。使用时,可以采取默认的方式,比如[bx]默认段寄存器为DS,而[BP] 默认的段地址在SS中,也可以采用段前缀的方式显式指出段地址所在的段寄存器。
使用寄存器来寻址使我们能够方便可靠地对数据结构进行管理。在寄存器间接寻址中已经说过,其寻址的本质并没有多少不同,但是人为的赋予其一些意义,使得我们操作数据起来更加的方便快捷。