《第6章 微型计算机的程序设计》由会员分享,可在线阅读,更多相关《第6章 微型计算机的程序设计(53页珍藏版)》请在金锄头文库上搜索。
1、第6章微型计算机的程序设计,本章教学目的,在理解和熟悉了86系列指令系统的基础上,即以不介绍程序设计的一般过程,以及几种典型的程序结构的编程方法。,本章 学习要求,1.掌握程序结构,顺序结构;分支结构;循环结构;子程序结构;查表结构 ;子程序,中断服务程序的概念及其异同点。,2.理解程序设计步骤,主要内容,程序设计步骤简单程序分支程序循环程序子程序查表程序,6.1 程序设计步骤,汇编语言程序设计归纳如下7个步骤:分析问题建立数学模型确定算法绘制程序流程图内存空间分配编制程序与静态检查程序调试,6.2 简单程序,简单程序形式简单,程序顺序执行,直到程序结束。【例6.1】用数据运算指令,对两个16
2、位数做加法运算。这两个数从地址10050H开始连续存放,低位在小地址一端,结果放在这两个数之后。(1) 分析题目:它是一个16位数相加的问题。在用加法指令时,必须要考虑低8位和低8位相加后产生的进位问题。(2) 根据86系列指令系统,可以直接对累加器AX做字操作,但在低位相加后,会影响标志寄存器的进位位CF,所以,要用带进位的加法指令。,(3) 绘制程序流程图,(4) 内存空间分配被加数、加数及和在内存的空间分配见表6.1 (139页)。(5) 编制的程序MOVAX,1000HMOVDS,AX ; DS1000HMOVSI,50H ; 被加数指针SI50HMOVDI,52H ; 加数指针DI5
3、2HMOVBX,54H; 和的指针BX54HCLC ; 清CFXORAX,AX ; 清AXMOVAX,SI ; 取一个字到AXADCAX,DI ; AXAX+DI+CFMOVBX,AX ; 存一个字到BXHLT ; 暂停,【例6.2】将内存(10050)单元的内容拆成两段,每段4位,并将它们分别存入内存(10051)和(10052)单元。即(10050)单元中的低4位放入(10051)的低4位,(10050)单元中的高4位放入(10052)的低4位,而(10051)和(10052)的高4位均为零。(1) 分析题目这个题目所提出的任务是在十六进制显示及二十进制计算中常遇到的。我们现在假设内存(1
4、0050)中放着7AH,则题目要求就是把7AH拆成07H和0AH两部分,并把0AH放在(10051)单元,07H放在(10052)单元。我们在拆字时,想取得一个数的前4位和后4位可以用移位指令的方法,也可以用逻辑与一个0F0H(二进制为11110000)和逻辑与一个0FH(二进制为00001111)的办法。,(2) 根据指令系统中含有的指令,先取出该数用逻辑指令与上一个0FH,得到低4位,存入内存。再取出该数用移位指令逻辑右移SHR(见图5.10(c)4次,取得高4位,存入内存,即可完成此题目。,(3) 绘制程序流程图,(4) 内存空间分配把7AH拆成07H和0AH两部分,它们在内存空间的分配
5、情况如下,内存地址 内容10050H 7AH10051H 0AH10052H 07H,(5) 编制的程序MOV AX,1000HMOV DS,AX ;DS=1000HMOV SI,50H ;需拆字节的指针SI=50HMOV AL,SI ;取一个字节到ALAND AL,0FH ;把AL的前4位清0MOV SI+1,AL ;把得到的后4位放到(10051H)单元MOV AL,SI ;再取出需拆字节放到AL中MOV CL,4SHR AL,CL ;逻辑右移4次,前4位补0MOV SI+2,AL ;放入(10052H)单元,6.3 分支程序,分支程序是利用条件转移指令,使程序执行到某一指令后,根据条件是
6、否满足,来改变程序执行的次序。这类程序使计算机有了判断作用。一般来说,它经常是先用比较指令或数据操作及位检测指令等来改变标志寄存器各个标志位。然后用条件转移指令进行分支。分支程序执行完后可以立即结束,也可以转到公共点结束,如图6.4所示。分支程序可以再分支,各分支程序之间没有对应关系,分支程序只要求在转移指令中给出目标地址,即可实现程序分支。在编写程序流程时,需用菱形判断框。在编好流程图写助记符程序时,建议先按上下流程线写。写完上下流程线上的各框环节后,再写分支部分里的框框。,【例6.3】求AX累加器和BX寄存器中两个无符号数之差的绝对值,结果放在内存(2800)单元中。(1) 分析题目此题目
7、中,AX累加器和BX寄存器中的数是不知道的。对两个不知大小的数相减并求绝对值,显然应该先解决哪一个值稍大些,然后再用大数减小数的方法,才可求得绝对值。(2) 根据指令系统中的比较指令,编出判断大小的环节,即可解决问题,图6.5即为该例题的程序流程图。,(3) 根据流程图编制程序CLC; 清除CFSUBAX,BX ; AXAX-BXJC AA ; CF转AA去执行(即AXBX时转移)MOVDI,2800H; 结果指针DI2800HMOVDI,AX ; 结果送到2800H和2801H单元HLT ; 暂停 AA:SUB BX,AX ; BXBX-AXMOVDI,2800HMOVDI,BXHLT,【例
8、6.4】我们要编一个程序,从外设71H号中取一个数M,判断其值是否在10和20之间,即10M20。如果M20H,则送0FFH给外设73H;如果M10,则送00H给外设73H;如果10M20,则送88H给外设73H。(1) 分析题目根据题意,我们可以看出这是一个需要两次判断M大小的问题。我们可以先判M是否大于10,再判M是否大于20。(2) 根据解决问题的思路,我们先画出程序流程图,如图6.6所示,两个分支都要“回归”原程序。,图6.6,(3) 编制的程序如下:START:INAL,71H ; 将71H端口的字节读入ALCLC ; 清除CFCMPAL,10 ; 将AL的内容和10相比较JCLP1
9、 ; 小于10转LP1CMPAL,20 ; 将AL的内容和20相比较JCLP2 ; 10AL20转LP2MOVBL,0FFH ; 将0FFH送入BL寄存器LP3: OUT73H,BL ; 将0FFH输出到73H端口 HLT ; 暂停LP1: MOVBL,00 JMPLP3LP2: MOVBL,88H JMPLP3,6.4 循环程序,循环程序是强制CPU重复执行某一指令系列(程序段)的一种程序结构形式,凡是要重复执行的程序段都可以按循环结构设计。循环结构程序简化了程序清单书写形式,而且减少了占内存空间。值得注意的是循环程序并不简化程序执行过程,相反,增加了一些循环控制等环节,总的程序执行语句和时
10、间会有所增加。循环程序一般由4部分组成:初始化、循环体、循环控制和循环结束处理,它的程序结构流程图如图6.8所示。其中各部分的内容如下:,(1)初始化它完成建立循环次数计数器,设定变量和存放数据的内存地址指针(常用间址方式)的初值,装入暂存单元的初值等(2) 循环体这是程序的处理部分;(3) 循环控制它包括修改变量和修改指针,为下一次循环做准备,以及修改循环计数器(计数器减1),判断循环次数到了没有。到了则结束循环;不到,则继续循环(即转移回去,再执行一次循环体)。(4) 结束处理它主要用来分析和存放程序的结果。循环程序分为单循环和多重循环,两重以上循环称为多重循环,循环控制方式有多种,如计数
11、控制、条件控制、状态控制等。计数控制事先已知循环次数,每次循环加或减计数,并进行判定总次数以达到控制循环。条件控制事先不知循环次数,在执行循环时判定某种条件真假来达到控制循环的目的。状态控制可事先设定二进制位的状态,或由外界干预、测试得到的开关状态,决定循环与否。不管哪一种控制循环方式,最终都是要达到控制循环的目的。若考虑不周,会造成死循环,对这一点要注意。,【例6.5】求两个多字节数之和。这两个数在10050H地址开始的内存单元中,连续存放,低位在小地址一端,结果放在这两个数之后。设这两个多字节数均为8个字节长。(1) 分析题目这是一个重复累加内存单元中数的问题,因此可以用循环程序形式解决。
12、因为86系列指令系统可以16位处理,所以,循环次数是4次。(2) 程序流程图如图6.10所示。,(3) 编制的程序START:MOVAX,1000HMOVDS,AX ; DS1000HMOVSI,50H ; 第一个数指针SI50HMOVDI,58H ; 第二个数指针DI58HMOVBX,60H ; 结果指针BX60HMOVCX,4 ; 循环次数CX4CLC ; 清进位CF0AA: MOVAX,SI; 取一个字到AXADCAX,DI; AXAX+DI+CFMOVBX,AX; 存一个字到BX,PUSHF ; 保护进位CFADDSI,2; 修改第一个数的地址指针SISI+2ADDDI,2; 修改第二
13、个数的地址指针DIDI+2ADDBX,2; 修改结果指针BXBX+2POPF ; 恢复标志寄存器LOOPAA ; CXCX-1,若CX0转AAHLT ; CX0,暂停,【例6.6】要求设计一个软件延时程序,延时时间约1ms左右。,(1) 分析题目:此题是想让计算机做一些无用的操作,来拖延时间。一般可以利用循环程序结构,循环执行几条已知时钟周期的指令,来达到延时的目的。,(2) 本程序利用PUSHF和POPF指令, PUSHF和POPF指令分别为10和8个时钟节拍,LOOP BX指令为3.4个时钟节拍,即此循环体需要用10+8+3. 421.4拍,而每个时钟节拍是根据此系统的晶振频率而定的。 假设此系统用的是8MHz的晶振,则每个时钟节拍需要0.125s,因此我们可以根据下列公式算出循环次数:X延时时间/一次循环时间1ms/(21.40.125s) 374次换算成十六进制数为176H。我们就可以设计出如下图所示的程序流程。,(3) 编制的程序如下:START:MOVCX,176H; 初始化,设定循环次数CX374LP1: PUSHF ; 循环体POPFLOOPLP1 ; CXCX-1,若CX0转LP1HLT ; 暂停,