第5章 [BX]和loop指令
一、[bx]和内存单元的描述
[bx]是什么呢?和[0]有些类似,[0]表示内存单元,它的偏移地址是0。比如在下面的指令中(在Debug中使用):
mov ax,[0]
将一个内存单元的内容送入ax,这个内存单元的长度为2字节(字单元),存放一个字,偏移地址为0,段地址在ds中。
mov al,[0]
将一个内存单元送入al,这个内存单元的长度为1字节(字节单元),存放一个字节,偏移地址为0,段地址在ds中。
要完整地描述一个内存单元,需要两种信息:①内存单元的地址;②内存单元的长度(类型)。
用[0]表示一个内存单元时,0表示单元的偏移地址,段地址默认在ds中,单元的长度(类型)可以由具体指令中的其他操作对象(比如说寄存器)指出。
[bx]同样也表示一个内存单元,它的偏移地址在bx中,比如下面的指令:
mov ax,[bx]
将一个内存单元的内容送入ax,这个内存单元的长度为2字节(字单元),存放一个字,偏移地址在bx中,段地址在ds中。
mov al,[bx]
将一个内存单元的内容送入al,这个内存尿胆原的长度为1字节(字节单元),存放一个字节,偏移地址在bx中,段地址在ds中。
二、Loop
英文单词“loop”有循环的含义,显然这个指令和循环有关。
我们在这一章,讲解[bx]和loop指令的应用、意义和相关的内容。
三、我们定义的描述性符号:“()”
为了描述上的简洁,在以后的课程中,我们将使用一个描述性的符号“()”来表示一个寄存器或一个内存单元中的内容。比如:
(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)的应用,比如,
- 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
- ((sp)*16+(sp))=(ax)
- 对于pop ax的功能,可以这样来描述:
- (ax)=((ss)*16+(sp))
- (sp) = (sp)+2
"X"所代表的数据有两种类型:①字节;②字。是哪种类型由寄存器名和具体的运算决定,比如:
(al)、(bl)、(cl)等得到的数据为字节型;(ds)、(ax)、(bx)等得到的数据为字型。
(al)=(20000H),则(20000H)得到的数据为字节型;(ax)=(20000H),则(20000H)得到的数据为字型。
四、约定符号 idata表示常量
我们在Debug中写过类似的指令:mov ax,[0],表示将ds:0处的数据送入ax中。指令中,在“[...]”里面用一个常量0表示内存地址单元的偏移地址。以后,我们用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 da,1、mov ds,2等,它们都是非法指令。
5.1 [BX]
看一看下面指令的功能。
mov ax,[bx]
功能:bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将SA:EA处的数据传入ax中。即:(ax)=((ds)*16+(bx))
mov [bx],ax
功能:bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将ax中的数据送入内存SA:EA处,即:((ds)*16+(bx))=(ax)
问题5.1
程序和内存中的情况如图5.1所示,写出程序执行后,21000H~21007H单元的内容。
思考后看分析。
注意,inc bx的含义是bx中的内容加1,比如下面两条指令:
mov bx,1
inc bx
执行后,bx=2。
分析:
(1) 先看一下程序的前3条指令:
mov ax,2000H
mov ds,ax
mov bx,1000H
这3条指令执行后,ds=2000H,bx=1000H。
(2)接下来,第4条指令:
mov ax,[bx]
指令执行前:ds=2000H,bx=1000H,则mov ax,[bx]将把内存2000:1000处的字型数据送入ax中。该指令执行后,ax=00beH。
(3)接下来,第5、6条指令:
inc bx
inc bx
这两条指令执行前bx=1000H,执行后bx=1002H。
(4)接下来,第7条指令:
mov [bx],ax
指令执行前:ds=2000H,bx=1002H,则mov [bx],ax 将把ax的数据送入内存2000:1002处。指令执行后,2000:1002单元的内容为BE,2000:1003单元的内容为00。
(5)接下来,第8、9条指令:
inc bx
inc bx
这两条指令执行前bx=1002H,执行后bx=1004H。
(6)接下来,第10条指令:
mov [bx],ax
指令执行前:ds=2000H,bx=1004H,则mov [bx],ax 将把ax中的数据送入内存2000:1004处。指令执行后,2000:1004单元的内容为be,2000:1005单元的内容为00。
(7)接下来,第11条指令:
inc bx
这条指令执行前bx=1004H,执行后bx=1005H。
(8)接下来,第12条指令:
`mov [bx],al
指令执行前:ds=2000H,bx=1005H,则mov [bx],al 将把al中的数据送入内存2000:1005处。指令执行后,2000:1005单元的内容为BE。
(9)接下来执行,第13条指令:
inc bx
这条指令执行前bx=1005H,执行后bx=1006H。
(10)接下来,第14条指令:
mov [bx],al
指令执行前:ds=2000H,bx=1006H,则mov [bx],al将把al中的数据送入内存2000:1006处。指令执行后,2000:1006单元的内容为BE。
程序执行后,内存的情况如图5.2所示。