shanling2017 发表于 2018-6-4 15:34:25

关于CX与loop的小笔记

这篇文章,是我的一个小笔记,现在把它抄录下来,放在这儿。

2018-5-27
这次来谈一谈这个汇编语言的一条指令,loop指令。
它的格式为
标号:
   重复执行的代码块儿
    Loop 标号
它的这个执行的时候,是要这样子来的。那就是cx--,然后是判断cx是否得0.如果为0,则执行loop之后的语句。如果不为0,则跳转到标号处继续执行。
其实啊,这个指令的语法,倒不是重点。重点是在,对这个循环的理解上。按照书上所说的,可以用cx来设置循环的次数。那么,cx得几,就会执行几次循环。我的疑问点正是在这里,为什么说,cx得几,就会执行几次循环呢?学习的时候,我是直接就这么用了。对于其中的细节,也并未加以详察,一种似懂未懂的感觉。对于这么一点,cx的值即为循环的次数,对这么一点,我是并不了解的,不能够做到很清楚地,来了解,似懂非懂的感觉。
现在的话,我可以说一说,这种理解的方案。但是得说明一下。这次,我也只是来说明一下我这里得到这个理解方案。至于是怎么来得到这样的理解方案,其中的探讨为何,像当初我探讨两个变量交换值得算法的那样,进行那种层次的这种权衡取舍与探讨,本节,不会太多的涉及,而只是暂时给出理解的方案与答案,这个探索的这种权衡与决策,本节,不作为重点,不会太多地来探讨的。
那么,在这里,正式说一下我的这种理解。在这里,可以简化一下问题。那就是,将标号之上的代码区域,成为顺序执行的代码区,而将标号之下,loop指令之上的区域,成为循环代码区。而loop指令之下的部分,位后续执行区。假定程序开始运行时,是从上往下,从代码的开始部分,顺序执行的。并且,并不去定义什么数据段,栈段,只是简单的一个小模型。
程序执行的时候,首先从第一条指令开始,往下顺序执行。首先执行顺序执行区的内容。然后呢,当进行完了顺序执行区的最后一条指令的时候,就即将进入循环代码区了。这个时候呢,我方需要先在这个顺序执行区里面,设置cx的数值。然后呢,是这样的,第一次执行的时候,执行到loop指令,这个cx会进行一次减法运算。假定进行了第一次的减法运算以后,cx并不为0,那么就会转到这个标号处,来执行循环区。第二次执行到这个cx的时候,这个cx会进行第二次的减法运算。第二次执行减1的运算。
在这里,我还是觉得,一下子,没法儿把它说的很清楚。那么,暂时忽略一些细节,可以这样子来理解,这个循环执行区,每执行一次,这个cx就会执行一次减1的运算。然后呢,如果cx=1,则循环执行区执行第一次的时候,这个cx减1,然后就得0了。得0以后呢,不去循环执行,而是进行后续代码区的执行。如果cx=2,则第一次进入循环执行区,然后呢,cx-1,不为0,循环执行,到了第二次的时候,减1运算之后,才得0,然后执行后续代码区。如果是cx=3,那么,第一次执行的时候,cx-1,为2,不得0,跳转到标号处,循环执行。第二次执行循环代码区,到了loop处,cx减1,为1,不得0,跳转到标号处,循环执行。第三次执行循环代码区,到了loop处,cx减1,为0,不再执行循环区,而是进行后续代码区的执行。
在这里,可以略微小结一下,循环执行去,每执行一次,cx就进行一次减1的操作。也就是说,执行了1次,cx进行一次减1的操作。执行了两次,那么就进行两次减1的操作。执行了三次,就执行三次减1的操作。如果是执行了n次,则会执行n次减1的操作。这样一来,执行了n次,则会使得cx-n。。
Cx=1,则循环区执行1次,然后执行后续代码区
Cx=2,则循环区执行2次,然后执行后续代码区
Cx=3,则循环区执行3次,然后执行后续代码区
Cx=4,则循环区执行4次,然后执行后续代码区
Cx=5,则循环区执行5次,然后执行后续代码区
Cx=n,则循环区执行n次,然后执行后续代码区
在这里,经过这样的一番推导可以简单地说出这样的一句话。那就是说啊,这个cx得几,就会执行多少次循环区。循环次数,从进行完了顺序执行去,第一次进入循环区,开始算起,这就算作第一次了。Cx得几,然后呢,这个循环区就会执行几次。
基于以上的推导,我可以得出这样的一个东西,那就是,cx得几,循环区就会执行几次。那么,cx的数值,控制着循环的次数。它的数值,决定了循环区执行的次数,决定了循环的次数。
到了这里,我就大致地,讲完了这个问题。然后呢,暂时的话,我也就进行到这里了。后续的东西,就留到以后,来进行着研究与思考了。
那么,这次的这种研究,还是一样的,它是一种什么思路呢?就是说啊,把这个复杂的,难懂的部分,在我自己的这个笔记里面,把它给整理出来,然后呢,对于那个重要的结论,我直接去用。这样一来,我是对于这个推导过程,有了自己的一点儿理解,大致地,能够有一个印象。然后呢,平时的时候,对于这个结论,我是直接用。对于这个推理的过程,不去细究。然后呢,需要的时候,需要我来了解这个推导过程的时候,我再来查看这个推导的步骤,这样子,就可以了。我想,高级语言的所谓的抽象数据类型,英嘎也就是这么一回事儿。
这是这样的一种分解,这是这样的一种体制与处理。在这个问题上,我的这种处理,就是这样的了。Cx寄存器,loop指令,暂时来讲,就这样了。
这样的探索,很愉快。
页: [1]
查看完整版本: 关于CX与loop的小笔记