06-第四章程序设计

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第四章:MCS-51程序设计计算机与通信工程学院李耀明计算机与通信工程学院一、汇编语言概述1、指令系统语句格式[标号]:操作码[操作数];[注释]指令编码长短:单字节,双字节,三字节执行周期:一个机器周期占12个振荡周期,单周期指令,双周期,4周期寻址方式:指令中所规定的寻找操作地址的方式立即、直接、寄存器、寄存器间接寻址、基址加变址、相对寻址、位寻址指令分类:数据传送、算术、逻辑、位操作、控制转移2、程序设计的步骤(1)分析问题,编制说明要解决问题的程序框图。(2)确定数据结构、算法、工作单元、变量设定(与高级语言不同)(3)根据所用的指令系统,按照已编制的程序框图用汇编语言编制出源程序。(4)将编制出的程序在计算机上调试,直至实现预定的功能。计算机与通信工程学院二、程序设计分类1、顺序程序:执行时按顺序一条条地执行指令2、分支程序:当程序不再顺序执行,而向一个方向或多个方向转移时,叫分支程序。3、循环程序:对于需要反复的程序段,常采用循环办法,以缩短程序。4、子程序及其调用程序主程序使用子程序时,用调用指令(ACALL),子程序最后放一条RET指令。计算机与通信工程学院三、程序设计准则结构清晰:便于分析层次分明:便于阅读语言简洁:便于分析易于理解:便于阅读计算机与通信工程学院4.1简单程序设计简单程序又称顺序程序。计算机是按指令在存储器中存放的先后次序来顺序执行程序的。除非用特殊指令让它跳转,不然它会在PC控制下执行。计算机与通信工程学院例4-1两个8位无符号数相加ORG0000HAJMPBEGINORG0030HBEGIN:MOV40H,#01HMOV41H,#02HLOOP:MOVR0,#40HMOVA,@R0INCR0ADDA,@R0INCR0MOV@R0,AJMPLOOPEND开始R0←40HA←(R0)A送(42H)(40H)+(41H)和送A返回图4-1例1流程图例:将加数和被加数分别送入40H、41H单元,加完后和送入42H单元计算机与通信工程学院例4-2将两个半字节数合并成一个单字节数程序ORG0000HAJMPstartORG0030HSTART:MOVsp,#60HMOV40h,#01hMOV41h,#02hloop:MOVR1,#40HMOVA,@R1ANLA,#0FH;取第一个半字节SWAPAINCR1XCHA,@R1;取第二字节ANLA,#0FH;取第二个半字节ORLA,@R1;拼字INCR1MOV@R1,A;存放结果AJMP$END执行完后如何不改变内存和寄存器的值?开始(40H)内容送A,屏蔽高位,交换高低位A←(R0)A与(R1)或后送(42H)取(41H)内容,屏蔽高位,送A返回图4-2例2流程图计算机与通信工程学院4.2分支程序设计在处理实际事务中,只用简单程序设计的方法是不够的。因为大部分程序总包含有判断、比较等情况。根据判断、比较的结果转向不同的分支计算机与通信工程学院例4-3:两个无符号数比较大小设两个连续外部RAM单元ST1和ST2中存放不带符号的二进制数,找出其中的大数存入ST3单元中。ST1EQU8040HORG0000HJMPSTARTORG0030HSTART:MOVDPTR,#ST1MOVA,#12HMOVX@DPTR,AINCDPTRMOVA,#34HMOVX@DPTR,ALOOP:CLRC;进位位清零MOVDPTR,#ST1;设数据指针MOVXA,@DPTR;取第一数MOVR2,A;暂存R2INCDPTRMOVXA,@DPTR;取第二个数SUBBA,R2;两数比较JNCBIG1XCHA,R2;第一数大BIG0:INCDPTRMOVX@DPTR,A;存大数SJMP$BIG1:MOVXA,@DPTR;第二数大SJMPBIG0END开始设置指针DPTR初始值取第一个数存入R2取第二个数后者减前者进位标志是否为0?存后者结束存前者图5-3例4流程计算机与通信工程学院例4-4:编制计算符号函数y=SGN(x)的程序AREEQU8040HBUFEQU8060HORG0000HJMPSTARTORG0030HSTART:MOVDPTR,#AREMOVA,#0F0HMOVX@DPTR,ALOOP:MOVDPTR,#ARE;进位位清零MOVXA,@DPTR;取第一数JZSULJBACC.7,NEGMOVA,#01HSUL:MOVDPTR,#BUFMOVX@DPTR,AJMPLOOPNEG:MOVA,#0FFHSJMPSULEND计算机与通信工程学院4.3循环程序设计简单程序,每条指令只执行一次分支程序则根据条件的不同,会跳过一些指令,执行另一些指令。它们的特点是,每一条指令至多执行一次。在处理实际事务时,有时会遇到多次重复处理的问题,用循环程序的方法来解决就比较合适。循环程序中的某些指令可以反复执行多次。采用循环程序,使程序缩短,节省存储单元。重复次数越多,循环程序的优越性就越明显。程序的执行时间并不节省。由于要有循环准备、结束判断等指令,速度要比简单程序稍慢些。计算机与通信工程学院循环程序组成循环程序一般由五部分组成:1、初始化部分:为循环程序做准备。如:设置循环次数计数器的初值,地址指针置初值,为循环变量赋初值等。2、处理部分:为反复执行的程序段,是循环程序的实体。3、修改部分:每执行一次循环体后,对指针作一次修改,使指针指向下一数据所在位置,为进入下一轮处理作准备。4、控制部分:根据循环次数计数器的状态或循环条件,检查循环是否能继续进行,若循环次数到或循环条件不满足,应控制退出循环,否则继续循环。通常2、3、4部分又称为循环体。5、结束部分:分析及存放执行结果。计算机与通信工程学院循环程序的结构循环程序的结构一般有两种形式:先进入处理部分,再控制循环。至少执行一次循环体。先控制循环,后进入处理部分。即先根据判断结果,控制循环的执行与否,有时可以不进入循环体就退出循环程序。计算机与通信工程学院主要语句寻址方式寄存器间接寻址MOVA,@RiMOVXA,@DPTRMOVXA,@Ri基址寄存器+变址寄存器间接寻址MOVCA,@A+DPTRMOVCA,@A+PC循环计数DJNZRn,relDJNEA,direct,relJZ(JNZ,JC,JNC,JB,JNB)rel计算机与通信工程学院例4-5工作单元清零将40H为起点的8个单元清“0”ORG0000HCLEAR:CLRA;A清0MOVR0,#40H;确定清0单元起始地址MOVR7,#08;确定要清除的单元个数LOOP:MOV@R0,A;清单元INCR0;指向下一个单元DJNZR7,LOOP;控制循环END计算机与通信工程学院例4-5工作单元清零例如:设有50个外部RAM单元要清“0”,即为循环次数存放在R2寄存器中,其首址存放在DPTR中,设为2000HORG0000HMOVDPTR,#2000HCLEAR:CLRAMOVR2,#32H;置计数值LOOP:MOVX@DPTR,AINCDPTR;修改地址指针DJNZR2,LOOP;控制循环END计算机与通信工程学院例4-5工作单元清零写成通用子程序形式:CLEAR:CLRALOOP:MOVX@DPTR,AINCDPTR;修改地址指针DJNZR2,LOOP;控制循环RET完整调用ORG0000HMOVDPTR,#2000HMOVR2,#50ACALLCLEARSJMP$CLEAR:CLRALOOP:MOVX@DPTR,AINCDPTR;修改地址指针DJNZR2,LOOP;控制循环RETEND计算机与通信工程学院例4-6多个单字节数据求和已知有n个单字节数据,依次存放在内部RAM40H单元开始的连续单元中。要求把计算结果存入R2,R3中(高位存R2,低位存R3)。程序如下:ORG8000HSAD:MOVR0,#40H;设数据指针MOVR5,#NUM;计数值0AH→R5SAD1:MOVR2,#0;和的高8位清零MOVR3,#0;和的低8位清零LOOP:MOVA,R3;取加数ADDA,@R0MOVR3,A;存和的低8位JNCLOP1;无进位,直接计算高8位INCR2;有进位,和的高8位+1LOP1:INCR0;指向下一数据地址DJNZR5,LOOPRETNUMEQU0AHEND上述程序中,用R0作间址寄存器,每作一次加法,R0加1,数据指针指向下一数据地址,R5为循环次数计数器,控制循环的次数。计算机与通信工程学院例4-7测试字符串长度设有一串字符依次存放在从50H单元开始的连续单元中,该字符串以回车符(0DH)为结束标志,测得的字符串长度存入R2中。测字符串长度程序是将该字符串中的每一个字符依次与回车符相比,若比较不相等,则统计字符串长度的计数器加1。继续比较,若比较相等,则表示该字符串结束,计数器中的值就是字符串的长度。程序如下:ORG0000HCONT:MOVR2,#00H;初始长度设置MOVR0,#50H;数据指针R0置初值NEXT:CJNE@R0,#0DH,LOOP1RETLOOP1:INCR0INCR2SJMPNEXTEND待测字符以ASCII码形式存放在RAM中,回车符的ASCII码为0DH,程序中用一条CJNE@R0,#0DH,LOOP指令实现字符比较及控制循环的任务,当循环结束时,R2的内容为字符串长度计算机与通信工程学院例4-910秒延时程序延时程序与MCS-51执行指令的时间有关,如果使用6MHz晶振,一个机器周期为2μs,计算出执行一条指令以至一个循环所需要的时间,给出相应的循环次数,便能达到延时的目的。程序如下:DEL:MOVR5,#100DEL0:MOVR6,#200DEL1:MOVR7,#248DEL2:DJNZR7,DEL2;248*2+4DJNZR6,DEL1;(248*2+4)*200+4DJNZR5,DEL0;(248*2+4)*200+4)*100+4RET上例延时程序实际延时为10.000406秒。它是一个三重循环程序,利用程序嵌套的方法对时间实行延迟是程序设计中常用的方法。使用多重循环程序时,必须注意以下几点:(1)循环嵌套,必须层次分明,不允许产生内外层循环交叉。(2)外循环可以一层层向内循环进入,结束时由里往外一层层退出。(3)内循环体可以直接转入外循环体,实现一个循环由多个条件控制的循环结构方式。计算机与通信工程学院例4-10冒泡程序MOVR6,#CNTDECR6LOOPA:MOVR0,#30HMOVA,R6MOVR7,ACLR20H.0NEXT:MOVA,@R0INCR0CLRCSUBBA,@R0JCNXCHMOVA,@R0DECR0XCHA,@R0INCR0MOV@R0,ASETB20H.0CNTEQU07HORG0000HAJMPSTARTORG0030HSTART:MOVDPTR,#LISTMOVR0,#30HMOVR7,#CNTLOOPD:CLRAMOVCA,@A+DPTRMOV@R0,AINCDPTRINCR0DJNZR7,LOOPDNXCH:DJNZR7,NEXTJNB20H.0,OVERDJNZR6,LOOPAOVER:AJMP$LIST:DB70H,13H,3H,90H,27H,32H,11Hend计算机与通信工程学院例4-13无符号数双字节乘法R2R3×R6R7--------------------------------R3×R7R2×

1 / 44
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功