8086 CPU 寻址方式灵活。有以下几种
idata 表示常量
1. [ idata ] 用一个常量来表示地址,可用于直接定位内存单元,但是在 MASM中要显实在的说明 ds 段寄存器, 比如 mov ax, ds:[0] ,表示把 ds 寄存器中所在段的地址+偏移地址 0 的内存单元中的值赋给ax , 不能用
mov ax, [0] ,这样在masm 中会当作mov ax, 0, 在windows的 debug 和 nasm 中可以用 mov ax, [..] 的方式定位内存,段地址默认放在 ds 中。
2. [bx] 用一个变量来表示内存地址,可用于间接定位一个内存单元。 比如 mov ax, [bx] ,段地址默认放在ds 中
3. [bx+idata] 用一个变量加常量表示内存地址,可在一个其实地址的基础上用变量间接定位一个内存单元
比如:
mov ax, [bx+idata]
mov ax, [idata+bx]
mov ax, idata[bx]
都是等价的,相当于高级语言中的数组表示方法。
4. [bx+si] 用两个变量表示地址。
5. [bx+di] 等价于 [bx+si].
6. [bx+si+idata] 用两个变量和一个常量表示地址。
7 [bx+di+idata] 等价于 [bx+si+idata].
关于 bx,si,di,bp
在 8086 CPU 中,只有这四个寄存器可以用在 [...] 中进行内存单元的寻址,比如
mov ax, [bx]
mov ax, [bx+si]
mov ax, [bx+di]
mov ax,[ bp]
mov ax, [bp+si]
mov ax, [bp+di]
在[..]中,bx,di,si,bp,可以单个出现,但是只能以四种组合方式出现
bx和si, bx和di, bp和si, bp和di
比如
mov ax,[bx+bp]
mov ax,[si+di]
这两条指令是错误的。
只要在[...]中使用寄存器bp, 而指令中没有显实的给出段地址,段地址默认在 ss 中
mov ax, [bp] 段地址在 ss中
mov ax,[bp+idata] 段地址在 ss中
mov ax,[bp+si] 段地址在 ss中
mov ax, [bp+si+idata] 段地址在 ss中
也可以显实的指定段寄存器
mov ax, ds:[bp]
mov ax, es:[bx]
mov ax, ss:[bx]
mov ax ,cs:[bx+si]
-------------------------------------------------------------------------------------------------
寻址方式总结
寻址方式 名称
[idata] 直接寻址
[bx] 寄存器间接寻址
[si] 寄存器间接寻址
[di] 寄存器间接寻址
[bp] 寄存器间接寻址
[bx+idata] 寄存器相对寻址
[ si+idata] 寄存器相对寻址
[di +idata] 寄存器相对寻址
[bp+ idata] 寄存器相对寻址
[bx+si] 基址变址寻址
[bx+di] 基址变址寻址
[bp+si] 基址变址寻址
[bp+di] 基址变址寻址
[bx+si+idata] 相对基址变址寻址
[bx+di+idata] 相对基址变址寻址
[bp +si +idata] 相对基址变址寻址
[bp+di+idata] 相对基址变址寻址