汇编语言[Loop]汇编指令

loop指令的格式是:loop标号,CPU执行loop指令的时候,要进行两步操作,
①(cx)=(cx)-l
②判断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曰冰)*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来简化我们的程序。

assume cs:code
code segment
      mov ax,2
mov cx,11
s:add ax,aX
      loop s
mov ax,4c00h
int 21h
code ends
end

分析
(1)标号
在汇编语言中,标号代表一个地址,程序5.1中有一个标号s。它实际上标识了一个地址,这个地址处有一条指令:add ax,ax
(2) loop s
CPU执行loop s的时候,要进行两步操作:
①(cx)=(cx)-1;
②判断cx中的值,不为0则转至标号s所标识的地址处执行(这里的指令是add ax,ax),如果为零则执行下一条指令(下一条指令是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, l l,设置(cx)=11;
(2)执行add ax,ax(第1次);
(3)执行loop s将(cx)减1, (cx)=10 ,(cx)不为。,所以转至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次);
(IS)执行loop s将(cx)减1, (cx)=4, (cx)不为0,所以转至s处;
(16)执行add ax,ax(第8次);
(17)执行loop s将(cx)减1, (cx)=3, (cx)不为。,所以转至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)=O, (CX)为O,所以向下执行。(结束循环)
从一上面的过程中,我们可以总结出用cx和loop指令相配合实现循环功能的3个要点:
(1)在cx中存放循环次数;
(2)loop指令中的标号所标识地址要在前面;
(3)要循环执行的程序段,要写在标号和loop指令的中间
用cx和loop指令相配合实现循环功能的程序框架如下

mov cx,循环次数
s:
   循环执行的程序段
   loop s

问题
编程,用加法计算123*236,结果存在ax中。思考后看分析
可用循环完成,将123加236次。可先设(ax)=0,然后循环做236次(ax)=(ax)+123

assume cs:code
code segment
   mov ax,0
   mov cx,236
s:add ax,123
   loop s
   mov ax,4c00h
   int 21h
code ends
end

发布日期:

所属分类: 易语言 标签: