首页 理论教育 微型计算机原理中循环程序设计

微型计算机原理中循环程序设计

时间:2023-11-03 理论教育 版权反馈
【摘要】:在程序设计中,循环是一种常用的控制结构。这些指令和指令前缀的使用能够有效地减少指令数、提高程序的效率。单重循环结构程序的设计本质上和单重循环没有区别。但是由于多重循环不同层的循环体依靠不同的参数控制其执行和结束,对这些参数的设置与使用一定要小心,避免混淆。汇编语言对多重循环的嵌套层数不做任何限制,也就是说,根据程序逻辑上的需要可以设计任意多层的循环。

微型计算机原理中循环程序设计

在程序设计中,循环是一种常用的控制结构。使用汇编语言的转移指令(包括条件转移指令和无条件转移指令),可以简单地构造出循环结构,实现一个程序段的反复执行。比如下面这段程序用来计算从1到100的和。

一般来讲,一个循环由初始化部分、循环体、循环变量的修改部分和循环控制部分组成。在这段代码中,开头的两句MOV指令用来实现循环前的准备工作,是循环的初始化部分。随后的ADD指令用来完成循环的基本操作(累加),称为循环体。循环体之后的INC指令用来修改BX寄存器的值,而BX寄存器的值作为循环条件决定循环是否继续进行,这条指令就是这个循环的修改部分。最后的CMP和JNG指令通过比较BX寄存器的值来判断循环是否继续,是循环的控制部分。

除了使用条件转移和无条件转移指令实现循环之外,X86系列处理器还提供了一些用来实现循环的专用指令,包括LOOP、LOOPE/LOOPZ、LOOPNE/LOOPNZ和用来处理串的REP、REPE/REPZ、REPNE/REPNZ指令前缀等。这些指令和指令前缀的使用能够有效地减少指令数、提高程序的效率。比如下面这段代码可以用更简洁的方法实现计算1到100的和:

由于LOOP指令用一条指令完成了CX减一、判断和条件转移三个功能,这段代码显得比前面使用CMP-JNG指令实现的循环结构更加简洁,执行起来的效率也更高。但是由于LOOP指令和CX寄存器之间的绑定关系,LOOP指令只能用于实现单重循环,对于多重循环就无能为力了,最多在多重循环的某一重(最常见的是最内层循环)中使用。

和LOOP系列指令一样,REP系列指令前缀也能够用来简化循环结构的设计,而且简化得更加彻底,下面三个程序段都是用来实现在一个字符串中找到特定字符“a”的功能:

数据定义:

程序段1:

程序段2:(www.xing528.com)

程序段3:

这三个程序段分别使用“判断-转移”、LOOP指令和REP指令前缀实现了在一个字符串中查找特定字符的功能,很明显,使用REP指令前缀的实现最为简洁和高效。

前面所介绍的循环结构只包括一个循环过程,其执行与结束的控制也只依赖于一个参数,这种循环称作单重循环。在实际应用中,除了上面介绍的单重循环之外,还经常要用到多重循环,也就是多个单重循环的嵌套。从实现上来看,多重循环的每一重都可以通过上面介绍的判断-转移指令或LOOP指令来实现,而其最内层循环除了使用判断-转移指令或LOOP指令之外,还可以使用REP指令前缀来实现,和单重循环并没有绝对的区别。

单重循环结构程序的设计本质上和单重循环没有区别。但是由于多重循环不同层的循环体依靠不同的参数控制其执行和结束,对这些参数的设置与使用一定要小心,避免混淆。下面一段程序段就是一个二重循环的例子:

这是一段使用“最小数法”实现对一组数字进行排序的例子,其原理是依次找出剩余数字中最小者并将其交换到剩余数字的最前面,从而实现将一组数字从小到大排列的目标。在这个例子中,两重循环分别由CMP-JNE指令和LOOP指令实现,循环控制变量分别是DX寄存器和CX寄存器。

汇编语言对多重循环的嵌套层数不做任何限制,也就是说,根据程序逻辑上的需要可以设计任意多层的循环。而且条件转移语句的灵活性也使得循环条件的设置可以非常复杂和多样,不过在使用条件转移语句实现循环,尤其是多重循环的时候,一定要注意条件转移语句的转移目标地址和当前地址之间的距离不得超过127字节。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈