第十五讲汇编语言的基本结构(二)§3-8汇编语言程序的基本结构及应用举例循环结构不但使程序简练,而且大大节省存储空间。循环程序包含四部分:初始化部分循环处理部分(主体)循环控制部分(修改地址指针、修改变量、检测循环结束条件)循环结束部分(对结果分析、处理,存放结果)循环有:单循环、多重循环。循环次数已知,可用计数器控制循环次数;循环次数未知,按问题条件控制循环是否结束。一、单循环程序1、循环次数是已知的程序例1、已知片外RAM的10H单元存放8位二进制数,要求将其转移成相应的ASCII码,并以高位在前,低位在后的顺序,依次存放到片外RAM以11H为首地址的连续单元中,试编程。先处理,后判断:先判断,后处理:解:先将中间单元置成30H,然后判欲转换位是否为1,若是,则将中间单元内容加1;否则,中间单元内容保持不变。结束部分处理部分修改变量初始化部分开始结束部分修改变量处理部分初始化部分开始通过左移指令实现由高到低的顺序进行转换。ORG1000HSTART:MOVR2,#08H;循环计数初值(循环次数已知)MOVR0,#10H;地址指针初值MOVXA,@R0;取数MOVB,A;暂存B中LOOP:MOVA,#30H;将中间单元(A)置成30HJNBB.7,NA;判断转换的二进制位为0否?INCA;若是转NA;若为1,则(A)内容加1,成为;1的ASCII码“31H”NA:INCR0;修改地址指针MOVX@R0,A;存放转换的结果MOVA,BRLA,B;作好准备,判断下一位MOVB,A;暂存DJNZR2,LOOP;判断转换结束否?未完继续SJMP$END(2)循环次数未知的程序例2、设用户用键盘输入长度不超过100字节的字符串放在8031单片机外部RAM以20H为首地址的连续单元,该字符串用回车符CR(‘CR’=0DH)作为结束标志,要求统计此字符串的长度并存入内部RAM的1FH单元中。解:从首单元开始取数,每取一数判断其是否为‘CR’,是则结束。ORG1000HSTADADATA20HSLANGDATA1FHCMCR2:MOVR0,#STADA-1MOVB,#0FFHCRLOP:INCR0INCBMOVXA,@R0CJNEA,#0DH,CRLOPMOVSLANG,BSJMP$END2、多重循环设计循环体中还包含着一个或多个循环结构,即双重或多重循环。例3、设8031使用12MHz晶振,试设计延迟100ms的延时程序。解:延时程序的延迟时间就是该程序的执行时间,通常采用MOV和DJNZ二指令。T=12/fosc=12/(12×106)=1usORG1000HDELAY:MOVR2,#CTS;T=1usLOOPS:MOVB,#CTR;T=1us内外LOOPR:DJNZB,LOOPR;2T=2us循循DJNZR2,LOOPS;2T=2us环环END内循环延时:(1+2×CTR)T=500us(假设)则CTR=250实际延时:[1+2×250]×1us=501us外循环延时:T+(501+2T)×CTS=100ms=100000us所以,CTS=198.8取199实际延时:[1+(501+2)×199]=1000.98ms例4、设在8031内部RAM中存一无符号数的数组,其长度为100,起始地址是30H,要求将它们从大到小排序,排序后仍存放在原区域中,试编者按程。解:内RAM第一次循环第二次循环······30H00030631H030603大32H060280数33H028004向····上100个··········冒····90H35762491H76246092H24600193H600000最多99次循环这就是所畏的“冒泡法”。实际上大多情况,用不到99次循环,排序就结束。为了提高排序速度,程序中可设一交换标志位,如10H位,每次循环中:若有交换则SETB10H若无交换则CLR10H每次循环结束时,测10H位,判断排序是否结束。BUBBLE:MOVR0,#30HORG1000HMOVB,#64HCLR10HDECB;长度计数LOOP:MOVA,@R0MOV20H,A;暂存,为交换作准备INCR0MOV21H,@R0CJNEA,21H,BUEU;若(20H)≠(21H)转移BUEU:JNCBUNEXT;(20H)≥(21H)转移MOVA,@R0;若(20H)(21H)则交换MOV@R0,20HDECR0;使R0退格指向小地址MOV@R0,AINCR0;恢复R0指向大地址SETB10H;置交换标志BUNEXT:DJNZB,LOOPJB10H,BUBBLE;判断标志位为1否?若为1,则继续END小结:1、循环程序包括几部分内容?2、何谓单循环,多重循环?何谓循环程序的先判断,后处理;先处理,后判断?