8086处理器的寻址方式

一:寄存器寻址

就是说,指令执行时,操作数位于寄存器中,源操作数可以是寄存器;

例:

	mov ax,0xb800
	mov es,ax
	inc dx

​ 第一条指令的目的操作数是寄存器,是寄存器寻址。第二条指令的两个操作数都是寄存器,是典型的寄存器寻址。第三条同样是寄存器寻址。

二:立即寻址

立即寻址又叫立即数寻址。也就是说,指令的源操作数是一个立即数。

例:

	add bx,0xf000
	mov dx,label_a

​ 第一条指令的目的操作数采用了寄存器寻址方式,用于提供被加数;第二个操作数(源 操作数)用于给出加数 0xf000。这是一个直接给出的数值,是立即在指令中给出的,最终参与加法 运算的就是它,不需要通过其他方式寻找,故称为立即数。这也是一种寻址方式,称为立即寻址。

​ 在第二条指令中,目的操作数也采用的是寄存器寻址方式。尽管源操作数是一个标号,但是, 标号是数值的等价形式,代表了它所在位置的汇编地址。因此,在编译阶段,它会被转化为一个立 即数。因此,该指令的源操作数也采用了立即寻址方式。

三:内存寻址

1.直接寻址

使用该寻址方式的操作数是一个偏移地址,而且给出了具体数值。

例:

	mov ax,[0x5c0f]
	add word [0x0230],0x5000
	xor byte [es:label_b],0x05

但凡表示内存地址的,都必须用中括号括起来。

​ 第一条指令中,源操作数使用的是直接寻址方式,当这条指令执行时,处理器将数据 段寄存器 DS 的内容左移 4 位,加上这里的 0x5c0f,形成 20 位物理地址。接着,从该物理地址处取 得一个字,传送到寄存器 AX 中。

​ 第二条指令中,目的操作数采用的是直接寻址方式。当这条指令执行时,处理器用同样的方 法,访问由段寄存器 DS 指向的数据段,并把指令中的立即数加到该段中偏移地址为 0x0230 的字单元里。

​ 尽管在第三条指令中,目的操作数使用了标号和段超越前缀,但它依然属于直接寻址方式。原 因很简单,标号是数值的等价形式,在指令编译阶段,会被转换成数值;而段超越前缀仅仅用来改 变默认的数据段。

*2.基址寻址

基址寻址就是在指令的地址部分使用基址寄存器BX或者BP来提供偏移地址。

例:

	mov [bx],dx
	add byte [bx],0x55

​ 第一条指令中的目的操作数采用了基址寻址。在指令执行时,处理器将数据段寄存器 DS 的内容左移 4 位,加上基址寄存器 BX 中的内容,形成 20 位的物理地址。然后,把寄存器 DX 中的内容传送到该地址处的字单元里。

​ 第二条指令中的目的操作数也采用的是基址寻址。指令执行时,将数据段寄存器 DS 的内容左 移 4 位,加上寄存器 BX 中的内容,形成 20 位的物理地址。然后,将指令中的立即数 0x55 加到该 地址处的字节单元里。

基址寻址也可以是BP。例:

	mov ax,[bp]

​ 基址寄存器 BP,在形成 20 位的物理地址时,默认的段寄存器是 SS。也就是说, 它经常用于访问堆栈。这条指令执行时,处理器将堆栈段寄存器 SS 的内容左移 4 位,加上寄存器 BP 的内容,形成 20 位的物理地址,并将该地址处的一个字传送到寄存器 AX 中。

基址寻址允许在基址寄存器的基础上使用一个偏移量。例:

	mov dx,[bp-2]

​ 处理器在执行时,将段寄存器SS的内容左移4位,加上BP的内容,再减去偏移量2以形成物理地址。偏移量仅用于在指令执行时形成有效地址,不会改变寄存器 BP 的原有内容。

变址寻址

变址寻址类似于基址寻址,唯一不同之处在于这种寻址方法使用的是变址寄存器(或称索引寄存器)SI和DI。例:

	mov [si],dx
	add ax,[di]
	xor word [si],0x8000

​ 和基址寻址一样,当带有这种操作数的指令执行时,默认的段地址由DS指定,偏移地址由SI或DI提供。

​ 同样,变址寻址也允许带一个偏移量。

基址变址寻址

使用基址变址的操作数可以是一个基址寄存器(BX或BP),外加一个变址寄存器(SI或DI)。例:

	mov ax,[bx+si]
	add word [bx+di],0x3000

​ 第一条指令的源操作数采用了基址变址寻址。当处理器执行这条指令时,把数据段寄存 器 DS 的内容左移 4 位,加上基址寄存器 BX 的内容,再加上变址寄存器 SI 的内容,共同形成 20 位的物理地址。然后,从该地址处取得一个字,传送到寄存器 AX 中。

​ 第二条指令与第一条指令类似,只不过是加法指令,它的目的操作数采用了基址变址寻址,源 操作数采用的是立即寻址。这条指令执行时,处理器访问由段寄存器 DS 指向的数据段,加上由 BX 和 DI 相加形成的偏移地址,共同形成 20 位的物理地址,然后将立即数 0x3000 加到该地址处的字单元里。

同样的,基址变址寻址允许在基址寄存器和变址寄存器的基础上带一个偏移量。