和[0]有些类似,但是偏移地址是在bx中。比如
mov ax, [bx]
mov al, [bx]
(ax) 表示ax中的内容,(20000H表示20000H单元中的内容)
括号里面的元素可以有三种类型:1. 寄存器名 2. 段寄存器名 3. 内存单元的物理地址。
(ax),(ds),(al),(cx),(20000H),((ds)*16+(bx))都是正确用法
(2000:0),((ds):1000H)等是不正确的用法。
mov ax, [2] ;可以写为(ax)=((ds)*16)+2)
mov ax, [idata] 合法
mov ax, idata 合法
mov ds, idata 非法,因为不可以直接向ds段寄存器直接传入值
CPU执行loop指令时候:
(cx)=(cx)-1
判断cx中的值,不为0则转至标号处执行程序。如果为0则向下执行。
assume cs:codeseg
codeseg segment
mov ax,2
mov cx,11
s: add ax,ax
loop s
mov ax,4c00h
int 21h
codeseg ends
end
assume cs:code
code segment
mov ax,0H
mov cx,236
s: add ax,123
loop s
mov ax,4c00h
int 21h
code ends
end
assume cs:code
code segment
mov ax,0ffffh
mov ds,ax
mov bx,6 ;设置ds:bx指向ffff:6
mov al,[bx]
mov ah,0 ;设置(al)=((ds)*16+(bx)),(ah)=0
mov dx,0 ;dx通常用作累加器
mov cx,3 ;循环3次
s: add dx,ax
loop s
mov ax,4c00h
int 21h
code ends
end