1.1 [bx]和内存单元的描述
[bx]是什么呢?
和[0]有些类似,[0]表示内存单元,它的偏移地址是0。比如在下面的指令中(但是注意这个是在 Debug 中使用的方式):
1.1.1 示例1
mov ax, [0]
将一个内存单元的内容送入 ax,这个内存单元的长度为2字节(字单元),存放一个字,偏移地址为0,段地址在ds中。
1.1.2 示例2
mov al, [0]
将一个内存单元的内容送入al,这个内存单元的长度为1字节(字节单元),存放一个字节,偏移地址为0,段地址在ds中。
要完整地描述一个内存单元,需要两种信息:①内存单元的地址;②内存单元的长度(类型)。
用[0]表示一个内存单元时,0表示单元的偏移地址,段地址默认在ds中,单元的长度(类型)可以由具体指令中的其他操作对象(比如说寄存器)指出。
[bx]同样也表示一个内存单元,它的偏移地址在bx中,比如下面的指令:
1.1.3 示例3
mov ax, [bx]
将一个内存单元的内容送入ax,这个内存单元的长度为2字节(字单元),存放一个字,偏移地址在bx中,段地址在ds中。
1.1.4 示例4
mov al, [bx]
将一个内存单元的内容送入 al,这个内存单元的长度为1字节(字节单元),存放一个字节,偏移地址在bx中,段地址在ds中。
1.2 loop
英文单词“loop”有循环的含义,显然这个指令和循环有关。
我们在这一章的学习中,会讲解[bx]和 loop 指令的应用、意义和相关的内容。
1.3 描述性的符号:“()”
为了描述上的简洁,在以后的内容中,我们将使用一个描述性的符号“()”来表示一个寄存器或一个内存单元中的内容。
比如:
-
(ax)表示 ax 中的内容、(al)表示 al 中的内容;
-
(20000H)表示内存20000H单元的内容(括号中的是内存单元的地址为物理地址);
-
((ds)*16+(bx))表示:ds 中的内容为 ADR1,bx中的内容为 ADR2,内存 ADR1*16+ADR2 单元的内容。也可以理解为:ds中的ADR1作为段地址,bx中的ADR2作为偏移地址,内存ADR1:ADR2 单元的内容。
❗注意,“()”中的元素可以有3种类型:
①寄存器名;②段寄存器名;③内存单元的物理地址(一个 20位数据)。
比如:
(ax)、(ds)、(al)、(cx)、(20000H)、((ds)*16+(bx))等是正确的用法;
(2000:0)、((ds):1000H)等是不正确的用法。
“(X)”所表示的数据有两种类型:①字节;②字。
是哪种类型由寄存器名或具体的运算决定,比如:
-
(al)、(bl)、(cl)等得到的数据为字节型;
-
(ds)、(ax)、(bx)等得到的数据为字型。
-
(al)=(20000H),则(20000H)得到的数据为字节型;
-
(ax)=(20000H),则(20000H)得到的数据为字型。
1.4 约定符号idata表示常量
我们在 Debug 中写过类似的指令:mov ax,[0],表示将 ds:0处的数据送入 ax中。
指令中,在“[…]”里用一个常量 0表示内存单元的偏移地址。以后,我们用 idata 表示常量。比如:
mov ax,[idata]:代表mov ax,[l]、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等,它们都是非法指令。