找回密码
 register

QQ登录

只需一步,快速开始

查看: 35|回复: 0

[汇编语言] [零基础入门学习]·24·[BX]和loop指令·Loop指令

[复制链接]

[汇编语言] [零基础入门学习]·24·[BX]和loop指令·Loop指令

[复制链接]
  • 打卡等级:热心大叔
  • 打卡总天数:91
  • 打卡月天数:14
  • 打卡总奖励:91
  • 最近打卡:2025-01-15 02:59:34
Waylee

主题

0

回帖

1万

积分

仙帝

积分
11890
Waylee 2025-1-2 00:44 | 显示全部楼层 |阅读模式 | Google Chrome | Windows 10

马上注册,查看网站隐藏内容!!

您需要 登录 才可以下载或查看,没有账号?register

×

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个要点:

  1. 在cx中存放循环次数;
  2. loop指令中的标号所标识地址要在前面;
  3. 要循环执行的程序段,要写在标号和loop指令的中间。

用cx和loop指令相配合实现循环功能的程序框架如下。

    mov cx,循环次数
s:
    循环执行的程序段
    loop s
您需要登录后才可以回帖 登录 | register

本版积分规则

雪舞知识库 | 浙ICP备15015590号-1 | 萌ICP备20232229号|浙公网安备33048102000118号 |天天打卡

GMT+8, 2025-1-15 13:29 , Processed in 0.101867 second(s), 8 queries , Redis On.

Powered by XueWu Licensed

Copyright © Tencent Cloud.

快速回复 返回顶部 返回列表