5.2 Loop指令
loop指定的格式是:loop 标号,CPU执行loop指令的时候,要进行两步操作,①(cx)=(cx)-1;②判断cx中的值,不为零则转至标号处执行程序,如果为零则向下执行。
从上面的描述中,可以看到,cx中的值影响着loop指令的执行结果。通常(注意,我们说的是通常)我们用loop指令来实现循环功能,cx中存放循环次数。
这里讲解loop指令的功能,关于loop指令如何实现转至标号处的细节,将在后面的课程中讲解。下面我们通过一个程序来看一下loop指令的具体应用。
任务1:编程计算2^2,结果存在ax中。
分析:设(ax)=2,可计算(ax)=(ax)*2
,最后(ax)中为2^2的值。N*2
可用N+N实现,程序如下。
assume cs:code
code segment
mov ax,2
add ax,ax
mov ax,4c00H
int 21H
code ends
end
任务2:编程计算2^3。
分析:2^3=2*2*2
,若设(ax)=2,可计算(ax)=(ax)*2*2
,最后(ax)中为2^3的值。N*2
可用N+N实现,程序如下。
assume cs:code
code segment
mov ax,2
add ax,ax
add ax,ax
mov ax,4c00H
int 21H
code ends
end
任务3:编程计算2^12。
分析:2^12=2*2*2*2*2*2*2*2*2*2*2*2
,若设(ax)=2,可计算(ax)=(ax)*2*2*2*2*2*2*2*2*2*2*2
,最后(ax)中为2^12的值。N*2
可用N+N实现,程序如下。
assume cs:code
code segment
mov ax,2
;做11次 add ax,ax
mov ax,4c00H
int 21H
code ends
end
可见,按照我们的算法,计算2^12需要11条重复的指令 add ax,ax。我们显然不希望这样来写程序,这里,可用loop来简化我们的程序。
程序 5.1
assume cs:code
code segment
mov ax,2
mov cs,11
s: add ax,ax
loops
mov ax,4c00H
int 21H
ends code
end
下面分析一下程序5.1。
(1)标号
在汇编语言中,标号代表一个地址,程序5.1中有一个标号s。它实际上标识了一个地址,这个地址处有一个指令 add ax,ax。
(2)loop s
CPU执行loop s的时候,要进行两步操作:
① (cs)=(cs)-1;
②判断cx中的值,不为0则转至标号s所标识的地址处执行(这里的指令是add ax,ax),如果为0则执行下一条指令(下一条指令是mov ax,4c00h)。
(3)以下3条指令
mov cx,11
s: add ax,ax
loop s
执行loop s 时,首先要将(cx)减1,然后若(cx)不为0,则向前转至s处执行 add ax,ax。所以,可以利用cx来控制add ax,ax的执行次数。
下面我们详细分析一下这段程序的执行过程,从中体会如何用cx和loop s 相配合实现循环功能。
(1)执行mov cx,11,设置(cx)=11;
(2)执行add ax,ax(第1次);
(3)执行loop s将(cx)减1,(cx)=10,(cx)不为0,所以转至s处;
(4)执行add ax,ax(第2次);
(5)执行loop s将(cx)减1,(cx)=9,(cx)不为0,所以转至s处;
(6)执行add ax,ax(第3次);
(7)执行loop s将(cx)减1,(cx)=8,(cx)不为0,所以转至s处;
(8)执行add ax,ax(第4次);
(9)执行loop s将(cx)减1,(cx)=7,(cx)不为0,所以转至s处;
(10)执行add ax,ax(第5次);
(11)执行loop s将(cx)减1,(cx)=6,(cx)不为0,所以转至s处;
(12)执行add ax,ax(第6次);
(13)执行loop s将(cx)减1,(cx)=5,(cx)不为0,所以转至s处;
(14)执行add ax,ax(第7次);
(15)执行loop s将(cx)减1,(cx)=4,(cx)不为0,所以转至s处;
(16)执行add ax,ax(第8次);
(17)执行loop s将(cx)减1,(cx)=3,(cx)不为0,所以转至s处;
(18)执行add ax,ax(第9次);
(19)执行loop s将(cx)减1,(cx)=2,(cx)不为0,所以转至s处;
(20)执行add ax,ax(第10次);
(21)执行loop s将(cx)减1,(cx)=1,(cx)不为0,所以转至s处;
(22)执行add ax,ax(第11次);
(23)执行loop s将(cx)减1,(cx)=0,(cx)为0,所以向下执行。(结束循环)
从上面的过程中,我们总结出用cx和loop指令相配合实现循环功能的3个要点:
- 在cx中存放循环次数;
- loop指令中的标号所标识地址要在前面;
- 要循环执行的程序段,要写在标号和loop指令的中间。
用cx和loop指令相配合实现循环功能的程序框架如下。
mov cx,循环次数
s:
循环执行的程序段
loop s