版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第6章章微型计算机的程序设计微型计算机的程序设计6.1程序设计步骤程序设计步骤1376.2简单程序简单程序1386.3分支程序分支程序1406.4循环程序循环程序1436.5子程序子程序1466.6查表程序查表程序150习题习题在了解和熟悉了在了解和熟悉了86系列指令系统的基础上,本章将系列指令系统的基础上,本章将介绍程序设计的一般过程,以及几种典型的程序形介绍程序设计的一般过程,以及几种典型的程序形成的编写方法。成的编写方法。6.1 程序设计步骤程序设计步骤程序是计算机命令程序是计算机命令(语句语句)的有序集合,当用计算机求解某的有序集合,当用计算机求解某些问题时需要编制程序。汇编语言程序
2、设计归纳如下些问题时需要编制程序。汇编语言程序设计归纳如下7个步骤:个步骤:(1) 分析问题:分析问题: 分析问题就是全面理解问题,要把解决分析问题就是全面理解问题,要把解决问题所需条件、原始数据、输入和输出信息、运行速问题所需条件、原始数据、输入和输出信息、运行速度要求、运算精度要求和结果形式等搞清楚。对较大度要求、运算精度要求和结果形式等搞清楚。对较大问题的程序设计,一般还要用某种形式描绘一个问题的程序设计,一般还要用某种形式描绘一个“工工艺艺”流程,以便于对整个问题的讨论和进行程序设计。流程,以便于对整个问题的讨论和进行程序设计。“工艺工艺”流程是指用表格、线条图、形象图或流程图流程是指
3、用表格、线条图、形象图或流程图等去描述问题或问题的物理过程。等去描述问题或问题的物理过程。(2) 建立数学模型:建立数学模型: 在对问题全面理解后,需要建在对问题全面理解后,需要建立数学模型,这是把问题向计算机处理方式转化的立数学模型,这是把问题向计算机处理方式转化的第第1步骤。建立数学模型是把问题数学化、公式化,有步骤。建立数学模型是把问题数学化、公式化,有些问题比较直观,可不去讨论数学模型问题;有些些问题比较直观,可不去讨论数学模型问题;有些问题符合某些公式或某些数学模型,可以直接利用;问题符合某些公式或某些数学模型,可以直接利用;但有些问题没有对应的数学模型可以利用,需要建但有些问题没有
4、对应的数学模型可以利用,需要建立一些近似数学模型模拟问题,由于计算机的运算立一些近似数学模型模拟问题,由于计算机的运算速度很快,所以运算精度可以很高,近似运算往往速度很快,所以运算精度可以很高,近似运算往往可以达到理想精度。可以达到理想精度。对初学者来说,主要是学习程序设计语法,复杂的对初学者来说,主要是学习程序设计语法,复杂的数学模型可暂不去考虑。数学模型可暂不去考虑。(3) 确定算法:确定算法: 建立数学模型后,许多情况下还不能建立数学模型后,许多情况下还不能直接进行程序设计,需要确定符合计算机运算的算直接进行程序设计,需要确定符合计算机运算的算法。计算机的算法比较灵活,一般要优选逻辑简单
5、、法。计算机的算法比较灵活,一般要优选逻辑简单、运算速度快、精度高的算法用于程序设计;此外,运算速度快、精度高的算法用于程序设计;此外,还要考虑占用内存空间小、编程容易等特点。还要考虑占用内存空间小、编程容易等特点。算法可由计算机语言、日常生活语言、表格、自定算法可由计算机语言、日常生活语言、表格、自定义关系图或流程图等按计算机能够接受的方法进行义关系图或流程图等按计算机能够接受的方法进行描述,读者采用哪一种方式描述算法,有时还取决描述,读者采用哪一种方式描述算法,有时还取决于习惯。于习惯。(4) 绘制程序流程图:绘制程序流程图: 程序流程图是用箭头线段、框程序流程图是用箭头线段、框图及菱形图
6、等绘制的一种图。用它能够把程序内容图及菱形图等绘制的一种图。用它能够把程序内容直接描述出来,因此,它在程序设计中应用很普遍。直接描述出来,因此,它在程序设计中应用很普遍。程序流程图如图程序流程图如图6.1所示。所示。(5) 内存空间分配:内存空间分配: 汇编语言的重要特点之一是能够汇编语言的重要特点之一是能够直接用机器指令或伪指令为数据或代码程序分配内直接用机器指令或伪指令为数据或代码程序分配内存空间,当然,在程序中没有指定分配存储空间时,存空间,当然,在程序中没有指定分配存储空间时,系统会按约定方式分配存储空间。系统会按约定方式分配存储空间。86系列存储器结系列存储器结构是分段的,如代码段、
7、数据段、堆栈段或附加段,构是分段的,如代码段、数据段、堆栈段或附加段,在程序设计时要考虑分段结构,要执行的程序段应在程序设计时要考虑分段结构,要执行的程序段应设在当前段设在当前段(活动段活动段)中。中。程序在运行时所需要的工作单元应尽可能设在程序在运行时所需要的工作单元应尽可能设在CPU寄存器中,这样存取速度快,而且操作方便。寄存器中,这样存取速度快,而且操作方便。(6) 编制程序与静态检查:编制程序与静态检查: 编制程序就是按计算机语编制程序就是按计算机语法规定书写计算机解决问题的过程。汇编语言编程法规定书写计算机解决问题的过程。汇编语言编程应按指令系统和伪指令的语法规则进行,汇编语言应按指
8、令系统和伪指令的语法规则进行,汇编语言符号虽然简单,但它的含意并不直观。初学者应多符号虽然简单,但它的含意并不直观。初学者应多参照指令表或指令说明进行,以免给程序调试造成参照指令表或指令说明进行,以免给程序调试造成许多麻烦。许多麻烦。编制程序首先关心的还是程序结构,它应是模块化编制程序首先关心的还是程序结构,它应是模块化和通用子程序结构,程序的结构要层次简单、清楚、和通用子程序结构,程序的结构要层次简单、清楚、易读、易维护为好。若程序运行时还要伴随人机对易读、易维护为好。若程序运行时还要伴随人机对话过程,还应考虑用户在应用时操作简便,并有相话过程,还应考虑用户在应用时操作简便,并有相应的提示给
9、用户一些指导。应的提示给用户一些指导。静态检查是上机调试前的最后一步,只要细心,一静态检查是上机调试前的最后一步,只要细心,一般可以查出许多错误,这也就减少了程序调试时的般可以查出许多错误,这也就减少了程序调试时的许多麻烦。许多麻烦。图图6.1(7) 程序调试程序调试(实验实验): 程序程序调试是程序设计最后一步,调试是程序设计最后一步,也是非常重要的一步。没也是非常重要的一步。没有调试过的程序,很难保有调试过的程序,很难保证程序无错误,就是很熟证程序无错误,就是很熟练的程序员也不能保证这练的程序员也不能保证这一点,因此,程序调试是一点,因此,程序调试是不可缺省的。不可缺省的。程序调试是为了纠
10、正错误。程序调试是为了纠正错误。纠正错误的方法很多,例纠正错误的方法很多,例如在编辑、汇编、连接或如在编辑、汇编、连接或用调试软件用调试软件(如如DEBUG)调调试时都可以发现错误并设试时都可以发现错误并设法修改程序。法修改程序。6.2 简单程序简单程序这种程序的形式最简单,计算机执行程序的方式是这种程序的形式最简单,计算机执行程序的方式是“从头到从头到尾尾”,逐条执行指令语句,直到程序结束,这是程序的最,逐条执行指令语句,直到程序结束,这是程序的最基本形式,任何程序都离不开这种形式。基本形式,任何程序都离不开这种形式。一般熟悉指令的读者,对于这类简单程序不用按上述一般熟悉指令的读者,对于这类
11、简单程序不用按上述7个步个步骤,而直接对给出的题目写出助记符程序清单。第骤,而直接对给出的题目写出助记符程序清单。第5章讲章讲述指令系统时所举的例子大多属于这种形式的程序。下面述指令系统时所举的例子大多属于这种形式的程序。下面例子是为了熟悉上述程序设计步骤。例子是为了熟悉上述程序设计步骤。【例例6.1】用数据运算指令,对两个用数据运算指令,对两个16位数做加法运算。这位数做加法运算。这两个数从地址两个数从地址10050H开始连续存放,低位在小地址一端,开始连续存放,低位在小地址一端,结果放在这两个数之后。结果放在这两个数之后。(1) 分析题目:它是一个分析题目:它是一个16位数相加的问题。在用
12、加法指令位数相加的问题。在用加法指令时,必须要考虑低时,必须要考虑低8位和低位和低8位相加后产生的进位问题。位相加后产生的进位问题。(2) 根据根据86系列指令系统,可以直接对累加器系列指令系统,可以直接对累加器AX做字做字操作,但在低位相加后,会影响标志寄存器的进位操作,但在低位相加后,会影响标志寄存器的进位位位CF,所以,要用带进位的加法指令。,所以,要用带进位的加法指令。(3) 绘制程序流程图,如图绘制程序流程图,如图6.2所示。所示。图图6.2(4) 内存空间分配:被加数、加数及和在内存的空间内存空间分配:被加数、加数及和在内存的空间分配见表分配见表6.1所示所示(见书第见书第139页
13、页)。(5) 编制的程序如下:编制的程序如下:MOVAX,1000HMOVDS,AX ; DS1000HMOVSI,50H ; 被加数指针被加数指针SI50HMOVDI,52H ; 加数指针加数指针DI52HMOVBX,54H; 和的指针和的指针BX54HCLC ; 清清CFXORAX,AX ; 清清AXMOVAX,SI ; 取一个字到取一个字到AXADCAX,DI ; AXAX+DI+CFMOVBX,AX ; 存一个字到存一个字到BXHLT ; 暂停暂停【例例6.2】将内存将内存(10050)单元的内容拆成两段,每段单元的内容拆成两段,每段4位,位,并将它们分别存入内存并将它们分别存入内存(
14、10051)和和(10052)单元。即单元。即(10050)单元中的低单元中的低4位放入位放入(10051)的低的低4位,位,(10050)单单元中的高元中的高4位放入位放入(10052)的低的低4位,而位,而(10051)和和(10052)的高的高4位均为零。位均为零。(1) 分析题目:这个题目所提出的任务在十六进制显示及分析题目:这个题目所提出的任务在十六进制显示及二二十进制计算中常遇到的。我们现在假设内存十进制计算中常遇到的。我们现在假设内存(10050)中放着中放着7AH,则题目要求就是把,则题目要求就是把7AH拆成拆成07H和和0AH两两部分,并把部分,并把0AH放在放在(10051
15、)单元,单元,07H放在放在(10052)单单元。元。我们在拆字时,想取得一个数的前我们在拆字时,想取得一个数的前4位和后位和后4位可以位可以用移位指令的方法,也可以用逻辑与一个用移位指令的方法,也可以用逻辑与一个0F0H(二二进制为进制为11110000)和逻辑与一个和逻辑与一个0FH(二进制为二进制为00001111)的办法。的办法。(2) 根据指令系统中含有的指令,先取出该数用逻辑根据指令系统中含有的指令,先取出该数用逻辑指令与上一个指令与上一个0FH,得到低,得到低4位,存入内存。再取位,存入内存。再取出该数用移位指令逻辑右移出该数用移位指令逻辑右移SHR(见图见图5.10(c)4次,
16、次,取得高取得高4位,存入内存,即可完成此题目。位,存入内存,即可完成此题目。(3) 绘制程序流程图,如图绘制程序流程图,如图6.3所示。所示。(4) 内存空间分配:把内存空间分配:把7AH拆成拆成07H和和0AH两部分,两部分,它们在内存空间的分配情况见表它们在内存空间的分配情况见表6.2所示所示(见书第见书第140页页)。图图6.36.3 分支程序分支程序分支程序是利用条件转移指令,使程序执行到某一指令分支程序是利用条件转移指令,使程序执行到某一指令后,根据条件后,根据条件(即上面运算的情况即上面运算的情况)是否满足,来改变是否满足,来改变程序执行的次序。这类程序使计算机有了判断作用。程序
17、执行的次序。这类程序使计算机有了判断作用。一般来说,它经常是先用比较指令或数据操作及位检一般来说,它经常是先用比较指令或数据操作及位检测指令等来改变标志寄存器各个标志位。然后用条件测指令等来改变标志寄存器各个标志位。然后用条件转移指令进行分支。转移指令进行分支。分支程序执行完后可以立即结束,也可以转到公共点结分支程序执行完后可以立即结束,也可以转到公共点结束,如图束,如图6.4所示。分支程序可以再分支,各分支程序所示。分支程序可以再分支,各分支程序之间没有对应关系,分支程序只要求在转移指令中给之间没有对应关系,分支程序只要求在转移指令中给出目标地址,即可实现程序分支。出目标地址,即可实现程序分
18、支。在编写程序流程时,我们必定会用到菱形判断框。在编在编写程序流程时,我们必定会用到菱形判断框。在编好流程图写助记符程序时,建议先按上下流程线写。好流程图写助记符程序时,建议先按上下流程线写。写完上下流程线上的各框环节后,再写分支部分里的写完上下流程线上的各框环节后,再写分支部分里的框框。框框。图图6.4【例例6.3】求求AX累加器和累加器和BX寄存器中两个无符号数寄存器中两个无符号数之差的绝对值,结果放在内存之差的绝对值,结果放在内存(2800)单元中。单元中。(1) 分析题目:此题目中,分析题目:此题目中,AX累加器和累加器和BX寄存器中寄存器中的数是不知道的。对两个不知大小的数相减并求绝
19、的数是不知道的。对两个不知大小的数相减并求绝对值,显然应该先解决哪一个值稍大些,然后再用对值,显然应该先解决哪一个值稍大些,然后再用大数减小数的方法,才可求得绝对值。大数减小数的方法,才可求得绝对值。(2) 根据指令系统中的比较指令,编出判断大小的环根据指令系统中的比较指令,编出判断大小的环节,即可解决问题,图节,即可解决问题,图6.5即为该例题的程序流程即为该例题的程序流程图。图。图图6.5(3) 根据流程图编制程序如下:根据流程图编制程序如下:CLC; 清除清除CFSUBAX,BX; AXAX-BXJCAA; CF转转AA去执行去执行(即即AXBX时转移时转移)MOVDI,2800H; 结
20、果指针结果指针DI2800HMOVDI,AX; 结果送到结果送到2800H和和2801H单元单元HLT; 暂停暂停AA:SUBBX,AX; BXBX-AXMOVDI,2800HMOVDI,BXHLT【例例6.4】我们要编一个程序,从外设我们要编一个程序,从外设71H号中取一号中取一个数个数M,判断其值是否在,判断其值是否在10和和20之间,即之间,即10M20。如果。如果M20H,则送,则送0FFH给外设给外设73H;如果;如果M10,则送,则送00H给外设给外设73H;如果;如果10M20,则送,则送88H给外设给外设73H。(1) 分析题目:根据题意,我们可以看出这是一个需分析题目:根据题
21、意,我们可以看出这是一个需要两次判断要两次判断M大小的问题。我们可以先判大小的问题。我们可以先判M是否大是否大于于10,再判,再判M是否大于是否大于20。(2) 根据解决问题的思路,我们先画出程序流程图,根据解决问题的思路,我们先画出程序流程图,如图如图6.6所示。所示。从图从图6.6的程序流程图来看,两个分支都要的程序流程图来看,两个分支都要“回归回归”原程序。原程序。(3) 编制的程序如下:编制的程序如下:START:INAL,71H; 将将71H端口的字节读入端口的字节读入ALCLC; 清除清除CFCMPAL,10; 将将AL的内容和的内容和10相比较相比较JCLP1; 小于小于10转转
22、LP1CMPAL,20; 将将AL的内容和的内容和20相比较相比较JCLP2; 10AL20转转LP2MOVBL,0FFH; 将将0FFH送入送入BL寄存器寄存器LP3:OUT73H,BL; 将将0FFH输出到输出到73H端口端口HLT; 暂停暂停LP1:MOVBL,00 JMPLP3LP2:MOVBL,88H JMPLP3图图6.6在编写这种两次判断的问题时,应注意其次序,否在编写这种两次判断的问题时,应注意其次序,否则,有可能出现重复或矛盾。例如,上面的问题,则,有可能出现重复或矛盾。例如,上面的问题,两次判断可以安排成如图两次判断可以安排成如图6.7所示的所示的4种流程图形式。种流程图形
23、式。图图6.7(c)中的这种方法,即是我们已经在例中的这种方法,即是我们已经在例6.4中采用中采用的方法。图的方法。图6.7(b)的这种方法是等效于图的这种方法是等效于图6.7(c)的方的方法,因此也是可用的。但对于图法,因此也是可用的。但对于图6.7(a)的这种方法,的这种方法,由于已判断在由于已判断在LP0处的处的AL已大于等于已大于等于20,再判是,再判是否大于否大于10,就多此一举了,因此不可能出现,就多此一举了,因此不可能出现LP2的的流程,从而分不出中间值的情况。再看图流程,从而分不出中间值的情况。再看图6.7(d)的的方法,在逻辑上就有矛盾,既然方法,在逻辑上就有矛盾,既然AL不
24、大于等于不大于等于10,处于处于LP1,也就不可能出现,也就不可能出现AL20的可能,因此加的可能,因此加判是否大于判是否大于20的环节是不合理的。的环节是不合理的。所以说,在应用判断环节时,要十分注意把握住这所以说,在应用判断环节时,要十分注意把握住这些逻辑关系和标志位的意义。些逻辑关系和标志位的意义。图图6.76.4 循环程序循环程序循环程序是强制循环程序是强制CPU重复执行某一指令系列重复执行某一指令系列(程程序段序段)的一种程序结构形式,凡是要重复执行的一种程序结构形式,凡是要重复执行的程序段都可以按循环结构设计。循环结构程的程序段都可以按循环结构设计。循环结构程序简化了程序清单书写形
25、式,而且减少了占内序简化了程序清单书写形式,而且减少了占内存空间。值得注意的是循环程序并不简化程序存空间。值得注意的是循环程序并不简化程序执行过程,相反,增加了一些循环控制等环节,执行过程,相反,增加了一些循环控制等环节,总的程序执行语句和时间会有所增加。总的程序执行语句和时间会有所增加。循环程序一般由循环程序一般由4部分组成:初始化、循环体、部分组成:初始化、循环体、循环控制和循环结束处理,它的程序结构流程循环控制和循环结束处理,它的程序结构流程图如图图如图6.8所示。其中各部分的内容如下:所示。其中各部分的内容如下:初始化:它完成建立循环次数计数器,设定变量和存放数据初始化:它完成建立循环
26、次数计数器,设定变量和存放数据的内存地址指针的内存地址指针(常用间址方式常用间址方式)的初值,装入暂存单元的的初值,装入暂存单元的初值等;初值等;(2) 循环体:这是程序的处理部分;循环体:这是程序的处理部分;(3) 循环控制:它包括修改变量和修改指针,为下一次循循环控制:它包括修改变量和修改指针,为下一次循环做准备,以及修改循环计数器环做准备,以及修改循环计数器(计数器减计数器减1),判断循,判断循环次数到了没有。到了则结束循环;不到,则继续循环次数到了没有。到了则结束循环;不到,则继续循环环(即转移回去,再执行一次循环体即转移回去,再执行一次循环体)。(4) 结束处理:它主要用来分析和存放
27、程序的结果。结束处理:它主要用来分析和存放程序的结果。循环程序分为单循环和多重循环,两重以上循环称为多循环程序分为单循环和多重循环,两重以上循环称为多重循环,如图重循环,如图6.9所示。所示。循环控制方式有多种,如计数控制、条件控制、循环控制方式有多种,如计数控制、条件控制、状态控制等。计数控制事先已知循环次数,每状态控制等。计数控制事先已知循环次数,每次循环加或减计数,并进行判定总次数以达到次循环加或减计数,并进行判定总次数以达到控制循环。条件控制事先不知循环次数,在执控制循环。条件控制事先不知循环次数,在执行循环时判定某种条件真假来达到控制循环的行循环时判定某种条件真假来达到控制循环的目的
28、。状态控制可事先设定二进制位的状态,目的。状态控制可事先设定二进制位的状态,或由外界干预、测试得到的开关状态,决定循或由外界干预、测试得到的开关状态,决定循环与否。环与否。不管哪一种控制循环方式,最终都是要达到控制循不管哪一种控制循环方式,最终都是要达到控制循环的目的。若考虑不周,会造成死循环,对这一点环的目的。若考虑不周,会造成死循环,对这一点要注意。要注意。【例例6.5】求两个多字节数之和。这两个数在求两个多字节数之和。这两个数在10050H地址开始的内存单元中,连续存放,低地址开始的内存单元中,连续存放,低位在小地址一端,结果放在这两个数之后。设位在小地址一端,结果放在这两个数之后。设这
29、两个多字节数均为这两个多字节数均为8个字节长。个字节长。(1) 分析题目:这是一个重复累加内存单元中数分析题目:这是一个重复累加内存单元中数的问题,因此可以用循环程序形式解决。因为的问题,因此可以用循环程序形式解决。因为86系列指令系统可以系列指令系统可以16位处理,所以,循环次位处理,所以,循环次数是数是4次。次。(2) 程序流程图如图程序流程图如图6.10所示。所示。图图6.8图图6.9图图6.10(3) 编制的程序如下:编制的程序如下:START:MOVAX,1000HMOVDS,AX; DS1000HMOVSI,50H; 第一个数指针第一个数指针SI50HMOVDI,58H; 第二个数
30、指针第二个数指针DI58HMOVBX,60H; 结果指针结果指针BX60HMOVCX,4; 循环次数循环次数CX4CLC; 清进位清进位CF0AA: MOVAX,SI; 取一个字到取一个字到AXADCAX,DI; AXAX+DI+CFMOVBX,AX; 存一个字到存一个字到BXPUSHF; 保护进位保护进位CFADDSI,2; 修改第一个数的地址指针修改第一个数的地址指针SISI+2ADDDI,2; 修改第二个数的地址指针修改第二个数的地址指针DIDI+2ADDBX,2; 修改结果指针修改结果指针BXBX+2POPF; 恢复标志寄存器恢复标志寄存器LOOPAA; CXCX-1,若,若CX0转转
31、AAHLT; CX0,暂停,暂停【例例6.6】要求设计一个软件延时程序,延时时间约要求设计一个软件延时程序,延时时间约1ms左左右。右。(1) 分析题目:此题是想让计算机做一些无用的操作,来拖分析题目:此题是想让计算机做一些无用的操作,来拖延时间。我们可以从指令手册中查得各条指令所需的时延时间。我们可以从指令手册中查得各条指令所需的时间节拍,但一般一条指令执行时间只有几个时钟周期,间节拍,但一般一条指令执行时间只有几个时钟周期,亦即只有几个微秒,为了能用较少的指令来编较长时间亦即只有几个微秒,为了能用较少的指令来编较长时间的延时,我们可以利用循环程序结构。的延时,我们可以利用循环程序结构。(2
32、) 程序流程图如图程序流程图如图6.11所示。在这个流程图中,初所示。在这个流程图中,初始化部分由于没有数据操作问题,因此也就不用设始化部分由于没有数据操作问题,因此也就不用设置间接地址指针。另外,延时的时间主要取决于循置间接地址指针。另外,延时的时间主要取决于循环体及循环次数。我们从手册上可以查得环体及循环次数。我们从手册上可以查得PUSHF和和POPF指令分别为指令分别为10和和8个时钟节拍,个时钟节拍,LOOP BX指令为指令为34个时钟节拍,即此循环体需要用个时钟节拍,即此循环体需要用10+8+34214拍,而每个时钟节拍是根据此系统的晶拍,而每个时钟节拍是根据此系统的晶振频率而定的。
33、假设此系统用的是振频率而定的。假设此系统用的是8MHz的晶振,的晶振,则每个时钟节拍需要则每个时钟节拍需要0125s,因此我们可以根据,因此我们可以根据下列公式算出循环次数:下列公式算出循环次数:X延时时间延时时间/一次循环时间一次循环时间1ms/21.40.125s374次次换算成十六进制数为换算成十六进制数为176H。图图6.11图图6.12(3) 编制的程序如下:编制的程序如下:START:MOVCX,176H; 初始化,设定循环次初始化,设定循环次数数CX374LP1:PUSHF; 循环体循环体POPFLOOPLP1; CXCX-1,若,若CX0转转LP1HLT; 暂停暂停对于上例,如
34、果我们想再延长对于上例,如果我们想再延长1 000倍时间倍时间(即想延时即想延时1s),我们可以采用双循环的方法来解决,如图,我们可以采用双循环的方法来解决,如图6.12所示的程序流程图。所示的程序流程图。对应的程序如下:对应的程序如下: MOVBX,3E8H; BX1000LP2: MOVCX,176HLP1: PUSHF POPF延时延时1ms程序段程序段LOOP LP1DECBX; BXBX-1JNZLP2; ZF0时,转至时,转至LP2,即,即BX0时转时转HLT; 暂停暂停此程序中内循环是此程序中内循环是1ms时间,而在外循环中的两条控时间,而在外循环中的两条控制指令制指令DEC和和
35、JNZ所对应的时钟节拍分别为所对应的时钟节拍分别为2个和个和4个,一共只需个,一共只需0.75s,与,与1ms比较极短,所以我们比较极短,所以我们在外循环里忽略不计了,外循环的循环初值仍设为在外循环里忽略不计了,外循环的循环初值仍设为1000次,对应的十六进制为次,对应的十六进制为3E8H。6.5 子程序子程序子程序相对主程序而言,是一个子的程序段,确子程序相对主程序而言,是一个子的程序段,确切地说,它是被父程序调用的程序。子程序调切地说,它是被父程序调用的程序。子程序调用示意图如图用示意图如图6.13所示。所示。图图6.13什么样的程序适合设计子程序呢什么样的程序适合设计子程序呢?一般是有公
36、用性、一般是有公用性、重复性或有相对独立性的程序应设计成子程序,这重复性或有相对独立性的程序应设计成子程序,这种结构给程序设计与调试带来许多方便。种结构给程序设计与调试带来许多方便。1. 子程序调用与返回子程序调用与返回子程序调用与返回由子程序调用与返回由CALL和和RET指令实现。子程序指令实现。子程序调用方式有近程调用、远程调用、直接调用和间接调用方式有近程调用、远程调用、直接调用和间接调用。调用。子程序调用实际是程序的转移,但它与转移指令有子程序调用实际是程序的转移,但它与转移指令有所不同,转子指令所不同,转子指令CALL执行时要保护返回地址,执行时要保护返回地址,而转移指令不考虑返回问
37、题。每个子程序都有而转移指令不考虑返回问题。每个子程序都有RET指令负责把压入栈区的返回地址弹出送指令负责把压入栈区的返回地址弹出送IP或或CS IP(段间返回段间返回),实现子程序返回。,实现子程序返回。2. 子程序设计与应用应注意的问题子程序设计与应用应注意的问题(1) 现场保护与恢复现场保护与恢复: 调用子程序后,调用子程序后,CPU处理权转处理权转到了子程序,在转子前,到了子程序,在转子前,CPU有关寄存器和内存有有关寄存器和内存有关单元是父程序的工作现场,若这个现场信息还有关单元是父程序的工作现场,若这个现场信息还有用处,那么在调用子程序前要设法保护这个现场。用处,那么在调用子程序前
38、要设法保护这个现场。保护现场的方式很多,多数情况是在调用子程序后保护现场的方式很多,多数情况是在调用子程序后由子程序前部操作完成现场保护,再由子程序后部由子程序前部操作完成现场保护,再由子程序后部操作完成现场恢复。现场信息可以压入栈区或传送操作完成现场恢复。现场信息可以压入栈区或传送到不被占用的存储单元,也可以避开这些有用的寄到不被占用的存储单元,也可以避开这些有用的寄存器或存储单元,达到保护现场的目的。存器或存储单元,达到保护现场的目的。恢复现场是保护现场的逆操作。当用栈区保护现场恢复现场是保护现场的逆操作。当用栈区保护现场时,还应注意恢复现场的顺序不能搞错,否则不能时,还应注意恢复现场的顺
39、序不能搞错,否则不能正确地恢复父程序的现场。正确地恢复父程序的现场。(2) 参数传递:参数传递: 指主程序与子程序之间相关信息或数指主程序与子程序之间相关信息或数据的传递。参数传递方式有寄存器传递、用内存单据的传递。参数传递方式有寄存器传递、用内存单元传递或用栈区传递。传递参数需要父程序与子程元传递或用栈区传递。传递参数需要父程序与子程序默契配合,否则会产生错误结果,或造成死机。序默契配合,否则会产生错误结果,或造成死机。(3) 子程序说明:子程序说明: 由于子程序有共享性,可被其他程由于子程序有共享性,可被其他程序调用,因此,每个子程序应有必要的使用注释,序调用,因此,每个子程序应有必要的使
40、用注释,它包括:它包括: 子程序名;子程序名; 功能、技术指标功能、技术指标(如执行如执行时间等时间等); 占用寄存器和存储单元;占用寄存器和存储单元; 入口、出入口、出口参数;口参数; 嵌套哪些子程序。嵌套哪些子程序。有些子程序在说明中还列举了调用实例,供使用者有些子程序在说明中还列举了调用实例,供使用者参考。参考。3. 子程序调用技巧子程序调用技巧子程序应用比较灵活,常用技巧有:子程序应用比较灵活,常用技巧有:(1) 子程序嵌套:子程序嵌套: 子程序调用子程序的过程称为子程子程序调用子程序的过程称为子程序嵌套,如图序嵌套,如图6.13(d)所示。所示。(2) 子程序递归:子程序递归: 子程
41、序调用自身的过程称为递归,子程序调用自身的过程称为递归,如图如图6.14(a)虚线部分所示。虚线部分所示。图图6.14(3) 可重入子程序:可重入子程序: 子程序被调用后没有执行完又被子程序被调用后没有执行完又被另一程序重复调用称为可重入。这种形式一般用在另一程序重复调用称为可重入。这种形式一般用在多用户系统,如图多用户系统,如图6.14(b)所示。所示。(4) 协同子程序:协同子程序: 两个以上子程序协同完成一项任务,两个以上子程序协同完成一项任务,且又相互调用,直到任务结束。且又相互调用,直到任务结束。【例例6.7】6.4节中的延时程序,在实际应用中一般作节中的延时程序,在实际应用中一般作
42、为子程序调用,现在我们把延时为子程序调用,现在我们把延时1s的程序改成子程的程序改成子程序。序。程序内容如下:程序内容如下:DELAY1S: PUSHFPUSHBXPUSHCXMOVBX,3E8HLP2:MOVCX,176HLP1:PUSHFPOPFLOOPLP1DECBXJNZLP2POPCXPOPBXPOPFRET从上面的子程序我们可以看出:子程序中因为用到从上面的子程序我们可以看出:子程序中因为用到了了BX,CX和标志寄存器和标志寄存器F,所以程序一开始就用,所以程序一开始就用了了3条条PUSH指令,把这些寄存器内容压进堆栈,指令,把这些寄存器内容压进堆栈,以保护以保护CPU的现场;而在
43、返回前,它又用了的现场;而在返回前,它又用了3条条POP指令指令(遵循遵循“先入后出先入后出”的原则的原则)把栈中内容弹把栈中内容弹回到寄存器中去。当然,这些保护现场和恢复现场回到寄存器中去。当然,这些保护现场和恢复现场的工作在主程序不怕丢失这些内容时,可以不用,的工作在主程序不怕丢失这些内容时,可以不用,或者放在主程序中解决,但一般来说,放在子程序或者放在主程序中解决,但一般来说,放在子程序中更妥当,也更通用些。中更妥当,也更通用些。【例例6.8】找出一个数据块中的最大数。其中,数据找出一个数据块中的最大数。其中,数据块的长度块的长度1,并且放在内存,并且放在内存(2001)单元中,而数单元
44、中,而数据块本身是从据块本身是从(2002)单元开始存放的,最后,把找单元开始存放的,最后,把找出的最大值放到出的最大值放到(2000)单元中。假设这段数据块中单元中。假设这段数据块中的数都是无符号的的数都是无符号的8位数。位数。(1) 分析题目:此题必定是个循环程序,而且在处理分析题目:此题必定是个循环程序,而且在处理部分应包括判断分支环节。部分应包括判断分支环节。(2) 根据指令系统,我们可以采用寻找最大值的计算根据指令系统,我们可以采用寻找最大值的计算方法。方法。首先,我们用首先,我们用00值放在值放在AL累加器中作为最大值;然累加器中作为最大值;然后,用数据块的第后,用数据块的第1个数
45、和个数和AL中的数做比较,如果中的数做比较,如果比比00大,则用这个数取代大,则用这个数取代00,放入,放入AL中;接着取中;接着取出第出第2个数与个数与AL中的数做比较,如果比它大,取而中的数做比较,如果比它大,取而代之,否则不取代,如此往复,直至最后一个数。代之,否则不取代,如此往复,直至最后一个数。这样,最后这样,最后AL累加器中必定存放着最大的数。这累加器中必定存放着最大的数。这就是寻找最大值的方法,而数据块的总长度就是寻找最大值的方法,而数据块的总长度(数的数的个数个数)就是循环次数。就是循环次数。(3) 绘制出此计算过程的程序流程如图绘制出此计算过程的程序流程如图6.15所示。所示
46、。图图6.15(4) 编制的程序如下编制的程序如下(未作为子程序时未作为子程序时):MOVSI,2001H; 指针指向放数据块长度的单元指针指向放数据块长度的单元MOVCL,SI; 取出来作为循环次数取出来作为循环次数INCSI; 指针指向第一个数指针指向第一个数MOVAL,00; 设置最大值设置最大值00MOVCH,00; 初始化初始化LP:CLC; 清除进位位清除进位位CMPAL,SI; 取出数与最大值比较取出数与最大值比较JCBB; AL中数小,转到取代处中数小,转到取代处JMPAA; AL中数大,跳过去中数大,跳过去BB:MOVAL,SI; 把大数放到把大数放到AL中保存中保存AA:I
47、NCSI; 指针下移指针下移LOOPLP; 次数减次数减1,判循环结束否,判循环结束否MOV2000H,AL; 把最大值放到指定单元保把最大值放到指定单元保存存HLT(5) 把这段程序改为子程序形式,程序清单如下:把这段程序改为子程序形式,程序清单如下:MAX:PUSHFPUSHAXPUSHCXPUSHSI上面程序段上面程序段POPSIPOPCXPOPAXPOPFRET在编写实际子程序时要注意下列问题:在编写实际子程序时要注意下列问题:(1) 入口信息入口信息 。例如在例。例如在例6.8中,要比较的一系列数,中,要比较的一系列数,必须先存放在以必须先存放在以2002H开始的内存单元中,而数据开
48、始的内存单元中,而数据的个数要放在的个数要放在2001H单元中。单元中。(2) 出口信息。例如在例出口信息。例如在例6.8中,寻得的最大值放在中,寻得的最大值放在2000H单元中。单元中。(3) 现场的保护和恢复。先仔细观察子程序中到底用现场的保护和恢复。先仔细观察子程序中到底用了哪些寄存器,以便主程序调用它时注意保护和恢了哪些寄存器,以便主程序调用它时注意保护和恢复现场。复现场。(4) 最后一条一定是最后一条一定是RET指令。指令。在这一节里,我们只举了例在这一节里,我们只举了例6.7和例和例6.8两个简单的子两个简单的子程序,但在实际应用中,我们可以把各种功能的程序,但在实际应用中,我们可
49、以把各种功能的程序编成子程序。例如,一个任意数的平方;把程序编成子程序。例如,一个任意数的平方;把一组数进行排序;多倍精度的二一组数进行排序;多倍精度的二十进制数相加;十进制数相加;十进制数与二进制数的转换等等,都可以编成子程十进制数与二进制数的转换等等,都可以编成子程序来调用。这种工作不仅对学习子程序来说是必要序来调用。这种工作不仅对学习子程序来说是必要的,而且,对于熟练编程,积少成多也是必不可少的,而且,对于熟练编程,积少成多也是必不可少的。的。另外,值得提出的是:子程序方式也可以利用到编另外,值得提出的是:子程序方式也可以利用到编写大型复杂的程序中去。也就是说,我们可以把一写大型复杂的程
50、序中去。也就是说,我们可以把一个复杂的程序分割成很多独立的,关联较少的模块,个复杂的程序分割成很多独立的,关联较少的模块,分别编写成子程序,然后,用一个主程序分别编写成子程序,然后,用一个主程序(主要由主要由调用子程序指令构成调用子程序指令构成)把它们串联起来。这样的程把它们串联起来。这样的程序不但结构清晰,而且对调试也带来极大的方便。序不但结构清晰,而且对调试也带来极大的方便。这一点,在具体实践中会有更深刻的体会。这一点,在具体实践中会有更深刻的体会。6.6 查表程序查表程序表格是所有计算机都可能使用的基本数据结构。它在代表格是所有计算机都可能使用的基本数据结构。它在代码转换、文件记录等方面
51、有很广泛的应用。在这里,码转换、文件记录等方面有很广泛的应用。在这里,我们只就其在过程控制中常用的一些方面做些介绍。我们只就其在过程控制中常用的一些方面做些介绍。我们知道在计算我们知道在计算x2或或sinx等值时,用机器码编写程序,不等值时,用机器码编写程序,不但程序十分繁杂,而且计算机所需要计算的时间也比但程序十分繁杂,而且计算机所需要计算的时间也比较长。这对于实时控制较长。这对于实时控制(机器在现场对各种信息做出及机器在现场对各种信息做出及时的响应和处理时的响应和处理),有时会感到太慢了。为此人们采用,有时会感到太慢了。为此人们采用查表法代替数据运算的方法。即人在计算机工作前,查表法代替数
52、据运算的方法。即人在计算机工作前,先把全部答案存放在计算机的内存中,而工作时,程先把全部答案存放在计算机的内存中,而工作时,程序只是用间址的方法取出变量对应的结果就可以了。序只是用间址的方法取出变量对应的结果就可以了。这里存放答案的原则是能够方便地找到问题的答案,这里存放答案的原则是能够方便地找到问题的答案,为此必须安排好这些答案的地址。一是表格的起始为此必须安排好这些答案的地址。一是表格的起始地址地址(或称基地址或称基地址),二是某一个答案在表中的序号,二是某一个答案在表中的序号(或称索引值或称索引值)。答案的地址值即等于基地址加上索。答案的地址值即等于基地址加上索引值。基地址比较好办,只要看哪些单元区域空着,引值。基地址比较好办,只要看哪些单元区域空着,即可考虑开始存放答案。这些单元区域的第一个地即可考虑开始存放答案。这些单元区域的第一个地址即为基地址,而索引值则应该和答案有直接的对址即为基地址,而索引值则应该和答案有直接的对应关系。应关系。【例例6.9】在在5.2节中表节中表5.2所列的十进制数的所列的十进制数的7段显示段显示码实例,用程序来实现。假设这段数据存放在码实例,用程序来实现。假设这段数据存放在2000H开始的内存中,取出开始的内存
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年问题地图专项治理工作方案【模板】
- 设备维护响应时效合同协议
- 2026年健康知识竞赛考试题库及答案解析
- 药品质量管理制度定期检查考核表
- 2026年电子围栏工程竣工验收协议
- 农业产品配送预计到达时间协议
- 物业服务协议
- 即时配送合作协议范本
- 教育数据服务合同协议
- 仓储分拣系统操作协议
- 合作购车位协议书
- 2025重庆城口县国有企业公开招聘26人参考题库附答案
- 咨政类课题申报书
- 产科护士长2025年度述职报告
- 2026五个带头发言材料三
- 总承包管理实施指南
- DB3205-T 1123-2024 职业教育集团建设与运行规范
- 2025年铁路职业技能竞赛线路工理论考试试题库答案
- 钢结构加固施工方案及施工工艺流程方案
- 广东省东华高级中学2026届高一化学第一学期期末统考试题含解析
- 2025至2030中国全麦面粉行业项目调研及市场前景预测评估报告
评论
0/150
提交评论