和[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指令时候:

  1. (cx)=(cx)-1

  2. 判断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