Bootstrap

寻址方式

8086寻址方式

什么是寻址方式

寻址方式就是处理器根据指令中给出的地址信息来寻找有效地址的方式,是确定本条指令的数据地址以及下一条要执行的指令地址的方法。

七种寻址方式

计算机系统中有七种基本的寻址方式:立即寻址方式、寄存器寻址方式、直接寻址方式、寄存器间接寻址方式、寄存器相对寻址方式、基址加变址寻址方式和相对基址加变址寻址方式。其中,后五种寻址方式是确定内存单元有效地址的五种不同的计算方法,用它们可方便地实现对数组元素的访问。

立即寻址方式

操作数作为指令的一部分。

例如:

mov ax, 0x4e20
; ax中数据为0x4e20

寄存器寻址方式

操作数存放在寄存器中,通过指定寄存器来获取数据。

例如:

; 假定ax中数据为0x4e20
mov bx, ax
; bx中数据为0x4e20

直接寻址方式

指令所要的操作数存放在内存中,在指令中直接给出该操作数的有效地址。

在通常情况下,操作数存放在数据段中。所以,默认情况下操作数的物理地址由数据段寄存器 ds 中的值和指令中给出的有效地址直接形成。

例如:

; 假定ds中的数据为0x1000
mov ax, [0x1234]
; 执行这条指令之后,内存单元0x11234和0x11235中的值(一个字(word))被放入ax

但是如果在指令中使用段超越前缀指定使用的段,则可以从其他段中取出数据。

例如:

; 假定es中的数据为0x2000
mov ax, es:[0x1234]
; 执行这条指令之后,内存单元0x21234和0x21235中的值被放入ax

8086有20根地址总线,但8086又是16位结构的,所以通过如下方式计算物理地址:

物理地址 = 段地址 * 16 + 段内偏移

物理地址 = 段地址 << 4 + 段内偏移

寄存器间接寻址方式

操作数有效地址在 sidibxbp 这四个寄存器之一中。在不使用段超越前缀的情况下,如果有效地址在 sidibx 中,则以段寄存器 ds 中的内容为段值。如果有效地址在 bp 中,则以段寄存器 ss 中的内容为段值。

例如:

; 假定ds中的值为0x1000di中的值为0x2345
mov ax, [di]
; 执行这条指令后,内存单元0x12345和0x12346中的值被放入ax

寄存器相对寻址方式

操作数的有效地址是一个基址寄存器( bxbp )或变址寄存器( sidi )的值加上指令中给定的8位或16位偏移量之和。

在不使用段超越前缀的情况下,如果有效地址在 sidibx 中,则以段寄存器 ds 中的内容为段值。如果有效地址在 bp 中,则以段寄存器 ss 中的内容为段值。

在指令中给定的8位或16位偏移量采用补码形式表示。在计算有效地址时,如偏移量是8位,则被带符号扩展成16位。

例如:

; 假定ds中的值为0x1000,di中的值为0x2345
mov ax, [di + 0x1234]
; 有效地址为0x1000 * 16 + 0x2345 + 0x1234 = 0x13579
; 执行这条指令后,内存单元0x13579和0x1357a中的值被放入ax

基址加变址寻址方式

操作数的有效地址由基址寄存器( bxbp )之一的值与变址寄存器( sidi )之一的值相加得到。

在不使用段超越前缀的情况下,如果 bp 中的值作为有效地址的一部分,则以 ss 中的值为段值,否则以 ds 中的值为段值。

例如:

mov ax, [bx][si]
; mov ax, [bx + si]
; mov ax, [si][bx]
; 以上几种方式等价

这种寻址方式可以很方便的定位数组中的各个元素。

相对基址加变址寻址方式

基本同上,只是增加了偏移量。

例如:

mov ax, 0x1000[bx][si]
; mov ax, [bx + si + 0x1000]
; mov ax, 0x1000[si][bx]
; mov ax, 0x1000[bx + si]
; 以上几种方式等价

更多资料

[1] 《汇编语言(第三版)》(王爽著)

;