[bx + idata] (idata = 常量)
可以用[bx]来指明一个内存单元。
也可以用[bx + idata]表示一个内存单元,它的偏移地址为bx + idata。
mov ax, [bx + 200]
含义:将一个内存单元的内容送入ax,这个内存单元的长度为2个字节(字单元),存放一个字,偏移地址为bx中的数值加上200,段地址在ds中。
ax = ds * 16 + bx + 200 //地址计算
还有如下格式:
mov ax, 200[bx]
mov ax, [bx].200
例:
2000:1000 BE 00 06 00 00 00
写出ax、bx、cx的内容
mov ax, 2000H
mov ds, ax
mov bx, 1000H
mov ax, [bx] //ax 00BEH
mov cx, [bx + 1] //cx 0600H
add cx, [bx + 2] //cx 0606H bx 1002H
解释cx:
2000:1000 BE
2000:1001 00
2000:1002 06
2000:1003 00
因为cx是16位reg,占2字节,所以2000:1001和2000:1002的内容给cx
(cx)= 0600H
2000:1002 高位, 2000:1001 底位
指到位置的地址为低位还要向后加上他的高位(小端,大端反过来)。
用[bx + idata]的方式进行数组的处理
将字符串中第一个字符串转化为大写,第二个转化为小写。(用数组方式处理)
assume cs:codesg, ds:datasg
datasg segment
db 'BaSiC'
db 'MinIX'
datasg ends
codesg segment
start: mov ax, datasg
mov ds, ax
mov bx, 0
mov cx, 5
s: mov al, ds:[bx]
and al, 11011111H
mov ds:[bx], al
mov al, [bx + 5] //第2个字符串开始
or al, 00100000H
mov [bx + 5], al
inc bx
loop s
mov ax, 4100H
int 21H
codesg ends
end statr