8086指令体系总共有7种寻址方式,详细如下:
立即数寻址mov ax, 3069H直接将值为3069H的立即数放到ax中。
(资料图片仅供参考)
mov AL, BH将BH寄存器的值放入AL中。
寄存器间接寻址使用BX寄存器进行间接寻址,BP,BI,DI寄存器也行。
mov ax, [bx]将bx保存的值当做偏移地址,这里假设为2000H,再到DS:2000H号单元中取出值放到ax中。
tips:注意在通用寄存器组中只有bx能够进行间接寻址,AX、CX、DX不行。
操作数的有效地址为基址寄存器(BP,SP)和变址寄存器(DI,SI)的内容和指令中指定的偏移量之和。
mov ax, count[SI]mov ax, [count + SI]这里的count是一个偏移量,可以是一个常数或者一个变量。
内存寻址直接寻址
mov ax,[2000H]将DS:2000H号单元的内容放入ax中,如果要指定别的段的话要使用段跨越前缀。例如
mov ax, ES:[2000H]要写上ES才能指定该段的有效地址为2000H号单元。
同时该寻址方式的操作数地址也可以由变量给出:
value db 10mov ah, valuemov ax, word ptr value# 将value强制转化为字类型在汇编语言中,变量名即意味着对应单元的偏移地址,因此直接使用变量名的方式也能进行内存寻址。
基址变址寻址操作数的有效值是一个基址寄存器和一个变址寄存器的内容之和,例如
mov ax, [BX][DI]mov ax, [BX + DI]其可能的组合为
DS:[BX|BP][DI|SI]相对基址变址寻址 操作数的有效地址为一个基址寄存器,一个变址寄存器和一个偏移量之和构成
mov ax, count[bx][si]mov ax,[count + bx + si]注意源对象的位数大小要和目标对象的位数大小相等。
寻址方式汇总如下
| 寻址方式 | 指令格式 |
|---|---|
| 立即数寻址 | mov ax, 1000H |
| 寄存器寻址 | mov ax, bx |
| 寄存器间接寻址 | mov ax, [bx] |
| 寄存器相对寻址 | mov ax, count[bx] |
| 直接寻址 | mov ax, [2000H] |
| 基址变址寻址 | mov ax, [bx + di] |
| 相对基址变址寻址 | mov ax, count[bx + di] |
| 访问方式 | 默认寄存器 | 可跨越 | 偏移地址 |
|---|---|---|---|
| 取指令 | cs | 无 | ip |
| 堆栈操作 | ss | 无 | sp |
| 一般数据访问 | ds | cs,es,ss | 有效地址EA |
| BP作为基址寻址 | ss | cs,ds,es | BP |
| 串操作的源操作数 | ds | cs,es,ss | SI |
| 串操作的目的操作数 | ES | 无 | DI |
关键词:
