不同的寻址方式
形式 | 名称 | 特点 | 举例 |
[idata] | 直接寻址 | 用一个常量/立即数来表示地址 | mov ax,[200] |
[bx] | 寄存器间接寻址 | 用一个变量表示内存地址 | mov bx,0 mov ax,[bx] |
[bx+idata] | 寄存器相对寻址 | 用一个变量和常量表示内存地址 | mov bx,4 mov ax,[bx+200] |
[bx+si] | 基址变址寻址 | 用两个变量表示地址 | mov ax,[bx+si] |
[bx+si+idata] | 相对基址变址寻址 | 用两个变量和一个常量表示地址 | mov ax,[bx+si+200] |
用于内存寻址的寄存器用法
8086CPU有14个寄存器
通用寄存器:AX,BX,CX,DX
变址寄存器:SI,DI
指针寄存器:SP,BP
指令指针寄存器:IP
段寄存器:CS,SS,DS,ES
标志寄存器:PSW
只有bx,bp,si,di可以用在[...]对内存单元寻址
bx,bp都可以作为基址寄存器,但存在区别:
- bx默认段地址在ds段
- bp默认段地址在ss段
- 注意:以上是默认段地址,如有指定则不适用
寻址方式的多种表达方式
同一寻址方式可以写成不同的形式,例如:
- mov ax,[bx][si] →mov ax,[bx+si]
- mov ax,[bx+si+count] → mov ax,count[bx][si] 或 mov ax,count[bx+si]
指令要处理的数据有多长?
- 字(word)操作:例如 mov ax,1
- 字节(byte)操作:例如mov al,1
- 在没有寄存器参与的内存单元访问指令中,用 word ptr/byte ptr 指明所要访问的内存单元的长度是很有必要的;否则,CPU无法得知所有访问的单元是字单元还是字节单元。