• 8086汇编-24[BX]和Loop指令02


    #pragma once
    /*    24-[BX]和Loop指令02

      Loop指令
        指令的格式是:loop 标号,CPU 执行loop指令的时候,要进行两步操作:

            ① (cx)=(cx)-1;
            ② 判断cx中的值,不为零则转至标号处执行程序,如果为零则向下执行。

        从上面的描述中,我们可以看到,cx中的值影响着loop指令的执行结果。

        通常(注意,我们说的是通常)我们用loop指令来实现循环功能,cx 中存放循环次数。            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来简化我们的程序。
                程序代码:
                   assume cs:code
                   code segment
                        mov ax,2
                        mov cx,11            loop 的条件哦~ 表示执行11 次,当然这是loop 自己的机制, 不是cx 的机制,cx 最开始的时候存放的是程序默认的大小
                    s:  add ax,ax            这里的s 是一个标号
                        loop s                loop 会跳到 标号的地方 执行,此时cx 自减1, cx 减到 0 的时候,loop 才会不执行,先自减,然后再跳.   Loop 中自带更改IP 的值.

                        mov ax,4c00h
                        int 21h
                   code ends
                   end

        程序分析: 
                (1)标号在汇编语言中,标号代表一个地址,此程序中有一个标号s 。它实际上标识了一个地址,这个地址处有一条指令:add ax,ax。
                (2)loop s
                    CPU 执行loop s的时候,要进行两步操作:
                    ① (cx)=(cx)-1;
                    ② 判断cx 中的值,不为0 则转至标号s 所标识的地址处执行(这里的指令是“add ax,ax),如果为零则执行下一条指令(下一条指令是mov ax,4c00h)。
                (3)以下三条指令
                       mov cx,11 
                   s:  add ax,ax 
                       loop s

                    执行loop s时,首先要将(cx)减1,然后若(cx)不为0,则向前转至s处执行add ax,ax。所以,我们可以利用cx来控制add ax,ax的执行次数。
                        标号的名字不能起太多,最多32个字符.


        下面我们详细分析一下这段程序的执行过程,从中体会如何用cx 和loop s 相配合实现循环功能。(微软的编译器默认是十进制的,如果要进行十六进制的数据,要在数据后面加H 例如:0001H)


    */

  • 相关阅读:
    Java 并发编程解析 | 如何正确理解Java领域中的并发锁,我们应该具体掌握到什么程度?
    【花雕体验】11 上手ESP32C3
    App逆向1——油联合伙人
    中班防暴力安全教案
    AI时代项目经理与架构师的成长之道:ChatGPT让你插上翅膀
    MFC 定时器使用
    nginx清除缓存
    我们再来谈一谈HashMap呗(负载因子,遍历角度)
    【C++学习】string的使用
    如何选择正确的哈希算法?
  • 原文地址:https://blog.csdn.net/CSDN_DaShuiNiu/article/details/127667650