一、[bx]:
说明:
1、[bx]和[0]有些类似,[0]表示内存单元,他的偏移地址是0。[bx]表示一个内存单元,他的偏移地址在bx中
在编译器中:
mov ax,[0] 把0给寄存器ax
mov ax,[bx] 把0对应的偏移地址该寄存器ax
在Debug中:
mov ax,[0] 把 ds:0 处的数据送入寄存器al
2、描述性符号“()”:
①、ax中的内容为0010H,可描述为:(ax) = 0010H
②、2000 : 1000处的内容为0010H,可描述为:(21000H) = 0010H
③、mov ax,[2]的功能,可描述为:(ax) = ((ds)16+2)
④、mov [2],ax的功能,可描述为:((ds)16+2) = (ax)
⑥、add ax,2的功能,可描述为:(ax) = (ax) + 2
⑦、add ax,bx的功能,可描述为:(ax) = (ax) + (bx)
⑧、push ax的功能,可描述为:(sp) = (sp) - 2、((ss)16 + (sp)) = (ax)
⑨、pop ax的功能,可描述为:(ax) = ((ss)16 + (sp))、(sp) = (sp) + 2
3、约定符号idata:表示常量
指令中,在“[…]”里用一个常量
表示内存单元的偏移地址,以后,用idata表示常量
①、mov ax,[idata] 就代表:mov ax,[1]、mov ax,[2]、mov ax,[3] 等
②、mov bx,idata 就代表:mov bx,1、mov bx,2、mov bx,3 等
③、mov ds,idata 就代表:mov ds,1、mov ds,2、mov ds,2 等,他们都是非法指令
4、mov ax,[bx]:
bx中的存放的数据作为一个偏移地址EA、段地址SA默认在ds中,将SA:EA处的数据送入ax中,即:(ax) = ((ds)16 + (bx))
5、mov [bx],ax:
bx中的存放的数据作为一个偏移地址EA、段地址SA默认在ds中,将ax处的数据送入SA:EA中,即:((ds)16 + (bx)) = (ax)
二、loop:循环的意识
语法:loop 标号
过程:CPU执行loop指令的时候,要进行两步操作:
①、(cx) = (cx) - 1;
②、判断cx中的值,不为零则转至标号处执行程序,如果为零则向下执行
assume cs:YYY
YYY segment
start mov ax,2
mov cx,11
s:add ax,ax
loop s
mov ax,4c00H
int 21H
YYY ends
end
说明:
①、标号:
在汇编语言中,标号代表一个地址,上程序中有一个标号s,它实际上标识了一个地址,这个地址处有一条指令:add ax,ax
②、loop s:
CPU执行loop指令的时候,要进行两步操作:
a、(cx) = (cx) - 1;
b、判断 cx 中的值,不为0则转至标号 s 所标识的地址处执行(add ax,ax),如果为0则向下执行下一条指令(mov ax,4c00H)
③、mov cx,11:
在 cx 中存放循环次数
注:在汇编源程序中,数据不能以字母开头。例如:mov ax,0ffffH,不能写成mov ax,ffffH
三、段前缀:
mov ax,cs:[0] cs是段前缀
mov bx,es:[0] es是段前缀
四、一段安全的空间:
在一般的PC机中,DOS方式下DOS和其他合法的程序一般不会使用0:200~0:2FF的256个字节的空间,所以,我们使用这段空间是安全的