第十五讲 汇编语言的基本结构 (二)
教学目的:
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、…….
.作业: