我们比较一下能用到的几种定位内存地址的方法(可称为寻址方式),就可以发现有以下几种方式:
(1)[iata] 用一个常量来表示地址,可用于直接定位一个内存单元;
(2)[bx]用一个变量来表示内存地址,可用于间接定位一个内存单元;
(3)[bx+idata] 用一个变量和常量表示地址,可在一个起始地址的基础上用变量间接定位一个内存单元;
(4)[bx+si]和[bx+di]用两个变量表示地址;
(5)[bx+si+idata] 用两个变量和一个常量表示地址。
SI和DI是8086CPU中和bx功能相近的寄存器,但是SI和DI不能够分成两个8位寄存器来使用。
下面的三组指令实现了相同的功能:
mov bx,0
mov ax,[bx]
mov si,0
mov ax,[si]
mov di,0
mov ax,[di]
下面的三组指令也实现了相同的功能:
mov bx,0
mov ax,[bx+123]
mov si,0
mov ax,[si+123]
mov di,0
mov ax,[di+123]
例题:用寄存器SI和DI实现将字符串‘welcome to masm!’复制到它后面的数据区中。
解析:汇编程序为:
assume cs:code,ds:data
data segment
db 'welcome to masm!' (一个字母占一个字节,偏移地址的宽度为10H)
db '................'
data ends
code segment
start:mov ax,data
mov ds,ax
mov si,0
mov cx,8H
s:mov ax,[si+0]
mov [si+10H],ax
add si,2
loop s
mov ax,4c00H
int 21H
code ends
end start
debug下该汇编程序内存初始结果为:

执行完程序后内存结果为:

例:用Debug查看内存,结果如下:s
2000:1000 BE 00 06 00 6A 22 ……
写出下面的程序执行后,ax、bx、cx中的内容。
mov ax,2000H
mov ds,ax
mov bx,1000H
mov si,0
mov ax,[bx+2+si]
inc si
mov cx,[bx+2+si]
inc si
mov di,si
mov ax,[bx+2+di]
解析:执行mov ax,[bx+2+si] 相当于:mov ax,[1002]
执行mov cx,[bx+2+si] 相当于:mov ax,[1003]
........