资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,计算机与通信工程学院,第四章:MCS-51程序设计,计算机与通信工程学院,李耀明,一、汇编语言概述,1、指令系统,语句格式,:;,指令编码长短:单字节,双字节,三字节,执行周期:一个机器周期占12个振荡周期,单周期指令,双周期,4周期,寻址方式:,指令中所规定的寻找操作地址的方式,立即、直接、寄存器、寄存器间接寻址、基址加变址、相对寻址、位寻址,指令分类:,数据传送、算术、逻辑、位操作、控制转移,2、程序设计的步骤,(1)分析问题,编制说明要解决问题的程序框图。,(2)确定数据结构、算法、工作单元、变量设定(与高级语言不同),(3)根据所用的指令系统,按照已编制的程序框图用汇编语言编制出源程序。,(4)将编制出的程序在计算机上调试,直至实现预定的功能。,计算机与通信工程学院,二、程序设计分类,1、顺序程序:,执行时按顺序一条条地执行指令,2、分支程序:,当程序不再顺序执行,而向一个方向或多个方向转移时,叫分支程序。,3、循环程序:,对于需要反复的程序段,常采用循环办法,以缩短程序。,4、子程序及其调用程序,主程序使用子程序时,用调用指令(ACALL),子程序最后放一条RET指令。,计算机与通信工程学院,三、程序设计准则,结构清晰:便于分析,层次分明:便于阅读,语言简洁:便于分析,易于理解:便于阅读,计算机与通信工程学院,4.1 简单程序设计,简单程序又称顺序程序。计算机是按指令在存储器中存放的先后次序来顺序执行程序的。除非用特殊指令让它跳转,不然它会在PC控制下执行。,计算机与通信工程学院,例4-1两个8位无符号数相加,ORG 0000H,AJMP BEGIN,ORG 0030H,BEGIN:,MOV 40H,#01H,MOV 41H,#02H,LOOP:,MOV R0,#40H,MOV A,R0,INC R0,ADD A,R0,INC R0,MOV R0,A,JMP LOOP,END,开始,R040H,A(R0),A送(42H),(40H)+(41H)和送A,返回,图4-1 例1流程图,例:将加数和被加数分别送入40H、41H单元,加完后和送入42H单元,计算机与通信工程学院,例4-2将两个半字节数合并成一个单字节数,程序,ORG 0000H,AJMP start,ORG 0030H,START:,MOV sp,#60H,MOV 40h,#01h,MOV 41h,#02h,loop:,MOV R1,#40H,MOV A,R1,ANL A,#0FH ;取第一个半字节,SWAP A,INC R1,XCH A,R1 ;取第二字节,ANL A,#0FH ;取第二个半字节,ORL A,R1 ;拼字,INC R1,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单元中。,ST1 EQU 8040H,ORG 0000H,JMP START,ORG 0030H,START:,MOV DPTR,#ST1,MOV A,#12H,MOVX DPTR,A,INC DPTR,MOV A,#34H,MOVX DPTR,A,LOOP:,CLR C ;进位位清零,MOV DPTR,#ST1 ;设数据指针,MOVX A,DPTR ;取第一数,MOV R2,A ;暂存R2,INC DPTR,MOVX A,DPTR ;取第二个数,SUBB A,R2 ;两数比较,JNC BIG1,XCH A,R2 ;第一数大,BIG0:,INC DPTR,MOVX DPTR,A ;存大数,SJMP$,BIG1:,MOVX A,DPTR;第二数大,SJMP BIG0,END,开始,设置指针DPTR初始值,取第一个数存入R2,取第二个数,后者减前者,进位标志是否为0?,存后者,结束,存前者,图5-3 例4流程,计算机与通信工程学院,例4-4:,编制计算符号函数y=SGN(x)的程序,ARE EQU 8040H,BUF EQU 8060H,ORG 0000H,JMP START,ORG 0030H,START:,MOV DPTR,#ARE,MOV A,#0F0H,MOVX DPTR,A,LOOP:,MOV DPTR,#ARE ;进位位清零,MOVX A,DPTR ;取第一数,JZ SUL,JB ACC.7,NEG,MOV A,#01H,SUL:,MOV DPTR,#BUF,MOVX DPTR,A,JMP LOOP,NEG:,MOV A,#0FFH,SJMP SUL,END,计算机与通信工程学院,4.3 循环程序设计,简单程序,每条指令只执行一次,分支程序则根据条件的不同,会跳过一些指令,执行另一些指令。,它们的特点是,每一条指令至多执行一次。,在处理实际事务时,有时会遇到多次重复处理的问题,用循环程序的方法来解决就比较合适。循环程序中的某些指令可以反复执行多次。,采用循环程序,使程序缩短,节省存储单元。重复次数越多,循环程序的优越性就越明显。,程序的执行时间并不节省。由于要有循环准备、结束判断等指令,速度要比简单程序稍慢些。,计算机与通信工程学院,循环程序组成,循环程序一般由五部分组成:,1、初始化部分:,为循环程序做准备。,如:设置循环次数计数器的初值,地址指针置初值,为循环变量赋初值等。,2、处理部分:,为反复执行的程序段,是循环程序的实体。,3、修改部分:,每执行一次循环体后,对指针作一次修改,使指针指向下一数据所在位置,为进入下一轮处理作准备。,4、控制部分:,根据循环次数计数器的状态或循环条件,检查循环是否能继续进行,若循环次数到或循环条件不满足,应控制退出循环,否则继续循环。,通常2、3、4部分又称为循环体。,5、结束部分:,分析及存放执行结果。,计算机与通信工程学院,循环程序的结构,循环程序的结构一般有两种形式:,先进入处理部分,再控制循环。至少执行一次循环体。,先控制循环,后进入处理部分。即先根据判断结果,控制循环的执行与否,有时可以不进入循环体就退出循环程序。,计算机与通信工程学院,主要语句,寻址方式,寄存器间接寻址,MOV A,Ri,MOVX A,DPTR,MOVX A,Ri,基址寄存器+变址寄存器间接寻址,MOVC A,A+DPTR,MOVC A,A+PC,循环计数,DJNZ Rn,rel,DJNE A,direct,rel,JZ(JNZ,JC,JNC,JB,JNB)rel,计算机与通信工程学院,例4-5,工作单元清零,将40H为起点的8个单元清“0”,ORG 0000H,CLEAR:CLR A ;A清0,MOV R0,#40H ;确定清0单元起始地址,MOV R7,#08 ;确定要清除的单元个数,LOOP:MOV R0,A ;清单元,INC R0 ;指向下一个单元,DJNZ R7,LOOP;控制循环,END,计算机与通信工程学院,例4-5,工作单元清零,例如:设有50个外部RAM单元要清“0”,即为循环次数存放在R2寄存器中,其首址存放在DPTR中,设为2000H,ORG 0000H,MOV DPTR,#2000H,CLEAR:CLR A,MOV R2,#32H ;置计数值,LOOP:MOVX DPTR,A,INC DPTR ;修改地址指针,DJNZ R2,LOOP ;控制循环,END,计算机与通信工程学院,例4-5,工作单元清零,写成通用子程序形式:,CLEAR:CLR A,LOOP:MOVX DPTR,A,INC DPTR ;修改地址指针,DJNZ R2,LOOP ;控制循环,RET,完整调用,ORG 0000H,MOV DPTR,#2000H,MOV R2,#50,ACALL CLEAR,SJMP$,CLEAR:CLR A,LOOP:,MOVX DPTR,A,INC DPTR ;修改地址指针,DJNZ R2,LOOP ;控制循环,RET,END,计算机与通信工程学院,例4-6,多个单字节数据求和,已知有n个单字节数据,依次存放在内部RAM 40H单元开始的连续单元中。要求把计算结果存入R2,R3中(高位存R2,低位存R3)。,程序如下:,ORG 8000H,SAD:MOV R0,#40H ;设数据指针,MOV R5,#NUM ;计数值0AHR5,SAD1:MOV R2,#0 ;和的高8位清零,MOV R3,#0 ;和的低8位清零,LOOP:MOV A,R3 ;取加数,ADD A,R0,MOV R3,A ;存和的低8位,JNC LOP1 ;无进位,直接计算高8位,INC R2 ;有进位,和的高8位+1,LOP1:INC R0 ;指向下一数据地址,DJNZ R5,LOOP,RET,NUM EQU 0AH,END,上述程序中,用R0作间址寄存器,每作一次加法,R0加1,数据指针指向下一数据地址,R5为循环次数计数器,控制循环的次数。,计算机与通信工程学院,例4-7,测试字符串长度,设有一串字符依次存放在从50H单元开始的连续单元中,该字符串以回车符(0DH)为结束标志,测得的字符串长度存入R2中。,测字符串长度程序是将该字符串中的每一个字符依次与回车符相比,若比较不相等,则统计字符串长度的计数器加1。继续比较,若比较相等,则表示该字符串结束,计数器中的值就是字符串的长度。,程序如下:,ORG 0000H,CONT:MOV R2,#00H ;初始长度设置,MOV R0,#50H ;数据指针R0置初值,NEXT:CJNE R0,#0DH,LOOP1,RET,LOOP1:INC R0,INC R2,SJMP NEXT,END,待测字符以ASCII码形式存放在RAM中,回车符的ASCII码为0DH,程序中用一条CJNE R0,#0DH,LOOP指令实现字符比较及控制循环的任务,当循环结束时,R2的内容为字符串长度,计算机与通信工程学院,例4-9 10秒延时程序,延时程序与MCS-51执行指令的时间有关,如果使用6MHz晶振,一个机器周期为2s,计算出执行一条指令以至一个循环所需要的时间,给出相应的循环次数,便能达到延时的目的。,程序如下:,DEL:MOV R5,#100,DEL0:MOV R6,#200,DEL1:MOV R7,#248,DEL2:DJNZ R7,DEL2 ;248*2+4,DJNZ R6,DEL1 ;(248*2+4)*200+4,DJNZ R5,DEL0 ;(248*2+4)*200+4)*100+4,RET,上例延时程序实际延时为10.000406秒。它是一个三重循环程序,利用程序嵌套的方法对时间实行延迟是程序设计中常用的方法。使用多重循环程序时,必须注意以下几点:,(1)循环嵌套,必须层次分明,不允许产生内外层循环交叉。,(2)外循环可以一层层向内循环进入,结束时由里往外一层层退出。,(3)内循环体可以直接转入外循环体,实现一个循环由多个条件控制的循环结构方式。,计算机与通信工程学院,例4-10 冒泡程序,MOV R6,#CNT,DEC R6,LOOPA:,MOV R0,#30H,MOV A,R6,MOV R7,A,CLR 20H.0,NEXT:,MOV A,R0,INC R0,CLR C,SUBB A,R0,JC NXCH,MOV A,R0,DEC R0,XCH A,R0,INC R0,MOV R0,A,SETB 20H.0,CNT EQU 07H,ORG 0000H,AJMP START,ORG 0030H,START:,MOV DPTR,#L
展开阅读全文