SI 和 DI
si和di是8086CPU中和bx功能相近的16位寄存器,si和di不能够分成两个8位寄存器来使用。
例:实现功能相同
mov bx, 0
mov ax, [bx]
mov si, 0
mov ax, [si]
mov di, 0
mov ax, [di]
例2:实现功能相同
mov bx, 0
mov ax, [bx + 123]
mov si, 0
mov ax, [si + 123]
mov di, 0
mov ax, [di + 123]
例3:用si和di实现将字符传“welcome to masm!” 复制到它后面的数据区中。(一个字符为一个字节)
assume cs:code, ds:data
data segment
db 'welcome to masm!'
db '0000000000000000'
data ends
code segment
start: mov ax, data
mov ds, ax
mov si, 0
mov di, 16
mov cx, 8
s: mov ax, [si] //用了16位,一次传送2个字符
mov [di], ax
add si, 2
add di, 2
loop s
mov ax, 4c00H
int 21H
code ends
end start
在程序中,用16为寄存器进行内存单元之间的数据传送,一次复制2个字节(2个内存单元),一共循环8次。
例4:用[bx(si或di) + idata] 实现上面的程序。
assume cs:code, ds:data
data segment
db 'welcome to masm!'
db '0000000000000000'
data ends
code segment
start: mov ax, data
mov ds, ax
mov si, 0
mov cx, 8
s: mov ax, [si] //mov ax, 0[si]
mov [si + 16], ax //mov 16[si], ax
add si, 2
loop s
mov ax, 4c00H
int 21H
code ends
end start
[bx + si] 和 [bx + di]
[bx + si] 和 [bx + di] 的含义相似。
[bx + si]表示一个内存单元,它的偏移地址为(bx)+ (si)(即bx中的数值加上si中的数值。)
mov ax, [bx + si]
含义: 将一个内存单元的内容送入ax,这个内存单元的长度为2字节(字单元) ,存放一个字,偏移地址为bx中的数值加上si中的数值,段地址在ds中。
即
(ax)= ((ds)* 16 + (bx) + (si))
该指令也可以协程如下格式(常用):
mov ax, [bx][si]
[bx + si + idata] 和 [bx + di + idata]
[bx + si + idata] 和 [bx + di + idata]两者的含义相似。
[bx + si+ idata] 表示一个内存单元,它的偏移地址为(bx)+ (si)+ idata(即 bx 中的数值加上 si 中的数值再加上 idata 这个常量值。)
mov ax, [bx + si + idata]
该指令还可以写成一下格式:
mov ax, [bx + 200 + si]
mov ax, [200 + bx + si]
mov ax, 200[bx][si]
mov ax, [bx].200[si]
mov ax, [bx][si].200