第十五讲 汇编语言的基本结构 (二) 教学目的: 1、掌握循环程序结构 2、了解循环结束判断的两种方法 3、能编写单间的单循环、双循环的程序 教学重点: 单循环程序编制 教学难点: 循环程序的结构构思 教学环节 组织教学:(2分钟)检查学生人数,强调作业要求。 复习提问: 1、循环转移指令DJNZ的功能是怎样的? 2、汇编程序的在三种基本结构是什么? 顺序程序 —— 每条指令只执行一次; 分支程序 —— 根据不同条件,会跳过一些指令,而转去执行另一些指令 共同点:每条指令至多执行一次。但是,实际中有时要求某程序段多次重复执行,需要采用循环结构。 引入新课: §3-8 汇编语言程序的基本结构及应用举例 循环结构不但使程序简练,而且大大节省存储空间。 循环程序包含四部分: 初始化部分 循环处理部分(主体) 循环控制部分(修改地址指针、修改变量、检测循环结束条件) 循环结束部分(对结果分析、处理,存放结果) 循环有:单循环、多重循环。 循环次数已知,可用计数器控制循环次数; 循环次数未知,按问题条件控制循环是否结束。 一、单循环程序 1、循环次数是已知的程序 例1、已知片外RAM的10H单元存放8位二进制数,要求将其转移成相应的ASCII码,并以高位在前,低位在后的顺序,依次存放到片外RAM以11H为首地址的连续单元中,试编程。 先处理,后判断: 先判断,后处理: 解:先将中间单元置成30H,然后判欲转换位是否为1, 若是,则将中间单元内容加1;否则,中间单元内容保持不变。 通过左移指令实现由高到低的顺序进行转换。 ORG 1000H START:MOV R2,#08H ;循环计数初值(循环次数已知) MOV R0,#10H ;地址指针初值 MOVX A,@R0 ;取数 MOV B,A ;暂存B中 LOOP:MOV A,#30H ;将中间单元(A)置成30H JNB B.7,NA ;判断转换的二进制位为0否? ;若是转NA INC A ;若为1,则(A)内容加1,成为 ;1的ASCII码“31H” NA:INC R0 ;修改地址指针 MOVX @R0,A ;存放转换的结果 MOV A,B RL A,B ;作好准备,判断下一位 MOV B,A ;暂存 DJNZ R2,LOOP ;判断转换结束否?未完继续 SJMP $ END (2)循环次数未知的程序 例2、设用户用键盘输入长度不超过100字节的字符串放在8031单片机外部RAM以20H为首地址的连续单元,该字符串用回车符CR(‘CR’= 0DH)作为结束标志,要求统计此字符串的长度并存入内部RAM的1FH单元中。 解:从首单元开始取数,每取一数判断其是否为‘CR’,是则结束。 ORG 1000H STADA DATA 20H SLANG DATA 1FH CMCR2:MOV R0,#STADA-1 MOV B,#0FFH CRLOP:INC R0 INC B MOVX A,@R0 CJNE A,#0DH,CRLOP MOV SLANG,B SJMP $ END 2、多重循环设计 循环体中还包含着一个或多个循环结构,即双重或多重循环。 例3、设8031使用12MHz晶振,试设计延迟100ms的延时程序。 解:延时程序的延迟时间就是该程序的执行时间,通常采用MOV 和DJNZ二指令。 T = 12 / fosc = 12 / (12×106)= 1us ORG 1000H DELAY:MOV R2,#CTS ;T = 1us LOOPS:MOV B,#CTR ;T = 1us 内 外 LOOPR:DJNZ B,LOOPR ;2T = 2us 循 循 DJNZ R2,LOOPS ;2T = 2us 环 环 END 内循环延时: (1 + 2 × CTR)T = 500us(假设) 则CTR = 250 实际延时:[1 + 2 × 250] × 1us = 501us 外循环延时:T +(501 + 2T)× CTS = 100ms = 100 000us 所以 , CTS = 198.8 取 199 实际延时:[1 + (501 + 2)×199] = 1000.98ms 例4、设在8031内部RAM中存一无符号数的数组,其长度为100,起始地址是30H,要求将它们从大到小排序,排序后仍存放在原区域中,试编者按程。 解: 内RAM 第一次循环 第二次循环 ······ 30H 0 0 0 3 0 6 31H 0 3 0 6 0 3 大 32H 0 6 0 2 8 0 数 33H 0 2 8 0 0 4 向 · · · · 上 100个 · · · · ······ 冒 · · · · 90H 3 5 7 6 2 4 91H 7 6 2 4 6 0 92H 2 4 6 0 0 1 93H 6 0 0 0 0 0 最多99次循环 这就是所畏的“冒泡法”。 实际上大多情况,用不到99次循环,排序就结束。为了提高排序速度,程序中可设一交换标志位,如10H位, 每次循环中:若有交换则 SETB 10H 若无交换则 CLR 10H 每次循环结束时,测10H位,判断排序是否结束。 ORG 1000H BUBBLE:MOV R0,#30H MOV B,#64H CLR 10H DEC B ;长度计数 LOOP:MOV A,@R0 MOV 20H,A ;暂存,为交换作准备 INC R0 MOV 21H,@R0 CJNE A,21H,BUEU ;若(20H)≠(21H)转移 BUEU:JNC BUNEXT ;(20H)≥(21H)转移 MOV A,@R0 ;若(20H)< (21H)则交换 MOV @R0,20H DEC R0 ;使R0退格指向小地址 MOV @R0,A INC R0 ;恢复R0指向大地址 SETB 10H ;置交换标志 BUNEXT: DJNZ B,LOOP JB 10H,BUBBLE ;判断标志位为1否?若为1,则继续 END 小结: 循环程序包括几部分内容? 何谓单循环,多重循环? 何谓循环程序的先判断,后处理;先处理,后判断? 布置作业:题目抄在黑板上 版书设计 一、循环结构流程图 1、…. 2、……. 3、 二、单循环程序 1、…….. 2、……..  三、循环次数未知的程序 1、……. 2、……. 3、…….. 四、举例 1、……. 2、……. 3、…….. 小结: 1、…….. 2、……. .作业: