资源预览内容
第1页 / 共26页
第2页 / 共26页
第3页 / 共26页
第4页 / 共26页
第5页 / 共26页
第6页 / 共26页
第7页 / 共26页
第8页 / 共26页
第9页 / 共26页
第10页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
4.2.1 简单程序设计 4.2.2 分支程序设计 4.2.3 循环程序设计 4.2.4 查表程序设计 4.2.5 散转程序设计 4.2.6 子程序设计 4.2.7 运算程序设计,4.2 汇编语言程序设计,4.2.1 简单程序设计,特点: 从第一条指令开始依次执行每一条指令,直到程序执行完毕,中间没有转移指令,没有分支。,例4-3 两位压缩的BCD码转换成相应的ASCII码。,算法1 ANL 拆字、 ORL #30H 拼字 算法2 DIV 拆字、 ORL #30H 拼字,存储 两位压缩的BCD码占一个单元 相应的ASCII码占二个单元,MOV A, R1 ANL A, #0FH ORL A, #30H MOV 31H, A MOV A, R1 MOV B, 10H DIV AB ORL A, #30H MOV 32H, A SJMP $,4.2.2 分支程序设计,分支程序的特点就是程序中含有转移指令,分为无条件分支程序和条件分支程序。根据不同的条件,条件分支程序执行不同的程序段。正确合理地运用条件转移指令是编写条件分支程序的关键。 JZ、JNZ、JC、JNC、JB、JNB、CJNE 。,分支程序的设计要点如下: (1)先建立可供条件转移指令测试的条件。 (2)选用合适的条件转移指令。 (3)在转移的目的地址处设定标号。,用条件转移语句实现二分支 用CJNE实现三分支 用 JMP A+DPTR 实现多分支,用条件转移语句实现二分支,用CJNE实现三分支,编程要点: cjne = 等于 不等于则: jc 大于,ORG 0000H CJNE R3, #15, NEQ SJMP L1 ;=15 NEQ: JNC L1 ;15 SJMP L2 ;15 L1: NOP ;15 L2:,比较指令相等于减法运算!,y=,(R0)x,(R1)y,判正负,CJNE R0, #0, NZERO,CLR C MOV A,R0 SUBB A,#0 JZ ZERO,MOV A, R0 JZ ZERO,其它方法?,判零,MOV A, R0 JNB ACC.7, positive,CJNE R0, #80H, DO1 SJMP negative DO1: JNC negative ;positive negative: .,0FFH80H negative 00H7FH positive,CJNE R0,#0,MP1 MOV R1,#0 SJMP MP3 MP1:MOV A,R0 JNB ACC.7,MP2 MOV R1,#0FFH SJMP MP3 MP2:MOV R1,#01H MP3:SJMP $ END,判正负,判零,例4-6 ONE和TWO单元中的两个带符号数比较大小,将较大者存入MAX单元中。两数相等则任一个存入MAX即可。,若X,Y异号, X正Y负(XY),差为正(0),OV=0 差为负(1),OV=1 X负Y正(XY),差为负(1),OV=0 差为正(0),OV=1,若X,Y同号,OV=0,差为正(0),XY 差为负(1),XY,ORG 1000H ONE DATA 30H TWO DATA 31H MAX DATA 32H CLR C MOV A, ONE SUBB A, TWO JZ XMAX JB ACC.7 , NEG JB OV, YMAX SJMP XMAX NEG:JB OV, XMAX YMAX:MOV A, TWO SJMP RMAX XMAX:MOV A, ONE RMAX:MOV MAX, A SJMP $ END,用 JMP A+DPTR 实现多分支,键入10,转AAA 11,转BBB 12, 转CCC 13, 转DDD,(A)=?,语句组1,语句组2,语句组3,语句组4,0AH,0BH,0CH,0DH,入口,AAA,BBB,CCC,DDD,4.2.3 循环程序设计,循环程序结构 循环程序的两种编制方法 循环问题的类型 循环程序设计举例,循环程序结构,循环初始化:位于循环程序的开头,用于完成循环前的准备工作。如给循环体中计数器和各工作寄存器设置初值 循环工作部分:循环主体,重复执行的部分 循环控制部分:由循环控制变量修改和条件转移语句等组成,用于控制循环执行的次数 循环结束:用于存放执行循环程序所得结果以及恢复各单元的初值,循环程序的两种编制方法,(b)当型循环,(a)直到型循环,1、计数型 循环次数已知,用计数方法控制循环的终止。 2、条件型 循环次数未知,根据某种条件判断循环是否终止。 例4-7 内部RAM块传,遇到“#”字符结束 3、计数型+条件型 例4-8 8031外部RAM块传及冒泡排序 重点,循环问题的类型,单循环程序 例1:多个单字节数求累加和 计数型 例2:内部数据区清零 计数型 例4-7 内部RAM块传 条件型 多重循环程序 例3:50ms延时程序 计数型 例4-7 内部RAM块传 计数型+条件型 例4-8 外部RAM块冒泡排序 计数型+条件型,循环程序设计举例,例1 多个单字节数求累加和,ORG 0000H MOV R3, #0 MOV R4, #0 MOV R0, #50H MOV R2, #5 Loop: MOV A, R4 ADD A, R0 MOV R4, A CLR A ADDC A, R3 MOV R3, A INC R0 DJNZ R2, Loop SJMP $ END,累加和单元清零,JNC L1 INC R3 L1:INC R0,例2 内部数据区清零,ORG 0000H Zero: MOV R0, #30H MOV R7, #10 MOV A, #00H Loop: MOV R0,A INC R0 DJNZ R7,Loop SJMP $ END,例3 50ms延时程序,Delay: MOV R7, # 200 ;1us Del1: MOV R6,# 123 ;1us NOP ;1us Del2: DJNZ R6, Del2 ;2us DJNZ R7,Del1 ;2us SJMP $,T =200(1+1+1232+2)+11us =50001us=50ms,参考程序如下: ORG2000H BLK1EQU30H BLK2EQU1000H MOV SP, #6FH MOVR0,#BLK1 ;BLK1数据块起始地址 MOVDPTR,#BLK2 ;BLK2数据块起始地址 Loop: CLRC MOVA,R0 ;取数据 PUSHACC SUBBA,#23H ;判是否为“#”字符 JZSTOP POPACC MOVXDPTR ,A ;数据传送 INCR0 INCDPTR SJMP Loop ;循环控制 STOP:SJMP$ END,例4-7把内部RAM中起始地址为BLK1的数据块传送到外部RAM以BLK2为 起始地址的区域,直到遇到“#”字符的ASC码为止。去掉块长度。,Loop:MOV A, R0 CJNE A, #23H, Con SJMP STOP Con:MOVX DPTR, A,参考程序如下: ORG2000H BLK1EQU30H BLK2EQU1000H N EQU 100 MOV SP, #6FH MOVR0,#BLK1 ;BLK1数据块起始地址 MOVDPTR,#BLK2 ;BLK2数据块起始地址 MOV R1, #N ;块长度 INCR1 SJMPCHECK ; 防止数据块的长度为零 XH: CLRC MOVA,R0 ;取数据 PUSHACC SUBBA,#23H ;判是否为“#”字符 JZSTOP POPACC MOVXDPTR,A ;数据传送 INCR0 INCDPTR CHECK : DJNZ R1,XH ;循环控制 STOP:SJMP$ END,计数型+条件型,例4-7把内部RAM中起始地址为BLK1的数据块传送到外部RAM以BLK2为起始地址的区域,直到遇到“#”字符的ASC码为止。块长度在R1中。,例4-8 设单片机8031外部RAM从3600H单元开始存放有100个无符号数,试编写程序能使它们按从小到大的顺序排列。(最小的数放在3600H单元) 解:排序程序采用“冒气泡”的方法,其“冒气泡”的过程如下:(设N=5时),8 5 4 2 9,5 4 2 8,4 2 5,2 4,第一轮 比较4次,第二轮 比较3次,第三轮 比较2次,第四轮 比较1次,9 8 5 4 2,8 9 5 4 2,8 5 9 4 2,8 5 4 9 2,8 5 4 2,5 8 4 2,5 4 8 2,5 4 2,4 2,4 5 2,对n个数,则要进行n-1轮扫描, 在第i轮扫描中要进行n-i次比较。,可以 推知:,若将原始数据改为 9 8 2 4 5,则排序过程如下:,8 2 4 5 9,2 4 5 8,2 4 5,2 4,9 8 2 4 5,8 9 2 4 5,8 2 9 4 5,8 2 4 9 5,8 2 4 5,2 8 4 5,2 4 8 5,2 4 5,2 4,2 4 5,第三轮排序中没有发生交换,即第三轮结束后,已经排好了,应结束排序,不必再排第四轮。为此增加一个“排好序标志位”,预先将它清0,当产生交换时,将它置1,表示没排好,可以进行下一轮排序;否则,结束排序。,第一轮 比较4次,第二轮 比较3次,第三轮 比较2次,第四轮 比较1次,冒泡法排序,ORG 0000H MOV PSW,#00H MOV P2,#36H MOV R2,#100-1 ;置外循环初值 Loop0: MOV R0,#00H MOV R1,#01H MOV 03H,R2 ;置内循环初值 CLR 7FH ;排好序标志清0 Loop1: MOVX A,R0 MOV 30H,A MOVX A, R1,CJNE A,30H,Loop2 SJMP L1 Loop2: JNC L1 MOVX R0,A XCH A,30H MOVX R1,A SETB 7FH ;排好序标志置1 L1: INC R0 INC R1 DJNZ R3,Loop1 ; 轮内次数 JNB 7FH,Loop3 ;排好序标志 DJNZ R2,Loop0 ; 轮数 Loop3: SJMP $ END,
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号