第二十一课:汇编程序的基本结构
程序编写做到:
占用存储空间少;
运行时间短;
程序的编制、调试及排错所需时间短;
结构清晰,易读、易于移植。
按结构化程序设计思想,任何复杂程序都可由顺序结构、分支结构、循环结构等构成。
如图1所示。
一、顺序程序举例
例1、设在外RAM的60H单元存有1个字节代码,要求将其分解成两个4位字段,高4位存入原单元的低4位,其低4位存入61H单元的低4位,且要求这两个单元的高4位均为0,试编制完整程序。
解: 字节分解:
核心指令 ANL
ORL 1000H
MODE: MODE:MOV R0,#60H
MOVX A,@R0
MOV B,A
ANL A,#0F0H
SWAP A
MOVX @R0,A
ANL B,#0FH
MOV A,B
INC R0
MOVX @R0,A
END
二、分支结构与分支程序设计
结构:根据不同的条件,进行相应的处理。
通常用条件转移指令形成简单分支结构。
如: 判(A) = Z 或 NZ ,转移
判(CY)= 1 或 0 ,转移
判(bit)=1 或 0 ,转移
CJNE 比较不相等转移
例3、设a存放在累加器A中,b存放在寄存器B中,要求按下式计算Y值,并将结果Y存于累加器A 中,试编写程序。
解:本题关键是判a是正数,还是负数;由ACC7便知。
ORG 1000H
BR: JB ACC7,MINUS
CLR C
SUBB A,B
SJMP DONE
MINUS: ADD A,B
DONE: SJMP $
END
例4、设有两个16位无符号数NA,NB分别存放在8031单片机内部RAM的40H、41H及50H、51H单元中,当NA > NB时,将内部RAM的42H单元清0;否则,将该单元置成全1,试编程。
解法I:因为无16位数的比较指令,所以,只能用8位数的比较指令。
(画出流程框图)
ORG 2000H
CMP: MOV A,50H
CJNE A,40H,CMP1
MOV A,51H
CJNE A,41H,CMP1
SJMP NHIGHE
CMP1: JC HIGHE
NHIGHE:MOV 42H,#0FFH
SJMP DONE
HIGHE: MOV 42H,#00H
DONE: SJMP $
END
上述程序中多次用到SJMP语句,该语句为无条件转移语句。无条件语句应尽量少用,这样可使程序结构紧凑而易读,易理解。
解法II:先假设NA > NB,再来判断是否NA ≤ NB
ORG 3000H
CMP2: MOV R0,#00H
MOV A,50H
CJNE A,40H,CMP3
MOV A,51H
CJNE A,41H,CMP3
SJMP NHIGHE
CMP3: JC HIGHE
NHIGHE:MOV R0,#0FFH ;不大于标志
HIGHE: MOV 42H,R0
SJMP $
END
循环结构不但使程序简练,而且大大节省存储空间。
循环程序包含四部分:
初始化部分
循环处理部分(主体)
循环控制部分(修改地址指针、修改变量、检测循环结束条件)
循环结束部分(对结果分析、处理,存放结果)
循环有:单循环、多重循环。
循环次数已知,可用计数器控制循环次数;
循环次数未知,按问题条件控制循环是否结束。
一、单循环程序
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的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
MOV R0,#STADA-1
CMCR2: MOV B,#0FFH
INC R0
CRLOP: 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
内循环延时:
(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,要求将它们从大到小排序,排序后仍存放在原区域中,试编者按程。
这就是所畏的“冒泡法”。
实际上大多情况,用不到99次循环,排序就结束。为了提高排序速度,程序中可设一交换标志位,如10H位,
每次循环中:若有交换则 SETB 10H
若无交换则 CLR 10H
每次循环结束时,测10H位,判断排序是否结束。
ORG 1000H
MOV R0,#30H
BUBBLE: MOV B,#64H
CLR 10H
DEC B
MOV A,@R0 ;长度计数
LOOP: MOV 20H,A ;暂存,为交换作准备
INC R0
MOV 21H,@R0
CJNE A,21H,BUEU;若(20H)≠(21H)转移
JNC BUNEXT ;(20H)≥(21H)转移
BUEU: MOV A,@R0 ;若(20H)< (21H)则交换
MOV @R0,20H
DEC R0 ;使R0退格指向小地址
MOV @R0,A
INC R0 ;恢复R0指向大地址
SETB 10H ;置交换标志
DJNZ B,LOOP
BUNEXT: JB 10H,BUBBLE ;判断标志位为1否?若为1,则继续
END
导读:目前正在解读《51单片机指令系统(3)》的相关信息,《51单片机指令系统(3)》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《51单片机指令系统(3)》的详细说明。
提醒:《51单片机指令系统(3)》最后刷新时间 2024-03-14 01:23:12,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《51单片机指令系统(3)》该内容的真实性请自行鉴别。