汇编杂谈-寻址

1 隐含寻址

含义:操作数隐含的由累加器给出。(即某指令由固定的操作数,不需要给出)

1
2
cwd ; 把ax中的内容按符号位拓展成dx,ax双字
clc ; cf置为0

2 立即寻址

操作数为立即数。 常用于给寄存器或内存单元赋初值,只能用于源操作数,不能用于目的操作数

1
2
mov al, 34H
mov ax, 1234H

3 寄存器寻址

操作数存放在 CPU 内部的寄存器中。

1
mov cx, ax

4 直接寻址

操作数地址的 16 位偏移量直接在指令中给出(存放于代码区),而操作数存放在数据区。(操作数的地址为 DS 左移四位加上该 16 位偏移量)

1
mov ax, [1200H] ; ds * 16 + 1200H

5 寄存器间接寻址

操作数在存储器中,操作数地址的 16 位偏移量在寄存器中(SI、DI、BX、BP)。若以 SI、DI、BX 间接寻址,操作数在数据段中,操作数地址为 DS 左移四位加上 SI、DI、BX 其中之一的内容。若以 BP 间接寻址,则操作数在堆栈段区域内,操作数地址为 SS 左移四位加上 BP 的内容。

[!note]

  • SI、DI、BX 配合 DS
  • BP 配合 SS
1
mov ax, [si] ; ds * 16 + si

6 寄存器相对寻址

在寄存器相对寻址方式中,操作数存放在存储器中,操作数的16位段内偏移地址是由 SI, DI, BX, BP 之一的内容,再加上指令中所指出的8位或者16位相对地址偏移量而得到的。

1
mov ax, [si + 0x10] ; ds * 16 + si + 0x10

7 基址变址寻址

在8086/8088中,通常把 BX,BP 作为基址寄存器,而把 SI、DI 作为变址寄存器。将这两种寄存器联合起来进行的寻址就称为基址、变址寻址。

在基址、变址寻址方式中,操作数存放在存储器中,操作数的16位段内偏移地址是由基址寄存器内容(BX或BP内容),再加上变址寄存器内容(SI或DI内容)而得到的。

1
2
mov ax, [bx + si] ; ds * 16 + bx + si 
mov bx, [bp + si] ; ss * 16 + bp + si

8 基址变址相对寻址

基址变址相对寻址方式实际上是基址变址寻址方式的扩充。即操作数存放在存储器中,操作数的16位段内偏移地址是由基址、变址方式得到的地址再加上由指令指明的8位或16位的相对偏移地址而得到的。

1
mov ax, [bx + si + 1030H]

9 注意

内存操作数地址只能由 BX、BP、SI、DI 给出,它们的组合也不是任意的。

寄存器间接寻址[SI]、[DI]、[BX]、[BP]。 寄存器相对寻址[SI+X]、[DI+X]、[BX+X]、[BP+X]。 基址加变址寻址[BX+SI+X]、[BX+DI+X]、[BP+SI+X]、[BP+DI+X]。

0%