15.1MCS-51系列单片机汇编语言语句格式汇编语言的语句由四部分构成:名字项,操作码项,操作数项,注释项。1.名字项名字项就是我们常说的标号,标号是该指令的符号地址,可根据需要设定。标号必须以字母开始,以冒号结束,所用字符一般不超过8个(视汇编语言版本不同而异)。系统中保留使用的字符或字符组不能用作标号。标号在每条语句中是任选项,即需要时才设定。2.操作码项这一项对于汇编指令语句而言是指令的助记符,如MOV。对伪指令语句而言是指令的定义符,如DB。操作码是汇编语言程序每一句所必须的部分,它决定语句的操作性质。操作码与操作数之间用空格分开。第五章MCS-51系列单片机汇编语言程序设计23.操作数项操作数可以是数字,可以是地址,。操作数又可分为目的操作数和源操作数两种,二者之间用逗号分开。另外,汇编语言语句中,有的有一个操作数,有的有两个操作数,有的有三个操作数,有的有多个操作数,有的没有操作数,而有的操作数是隐含的。4.注释以分号开头,计算机在汇编时对这部分不予处理,是程序员对指令操作的解释,可有可无。35.2常用伪指令1.定位伪指令格式:ORGnn为十进制或十六进制常数,代表地址。该伪指令规定了后面指令的存放地址。例如:ORG0100HAJMPPRG1AJMP为双字节指令,其首字节放在0100H单元,第二个字节放在0101H单元。2.汇编结束伪指令格式:END当汇编程序遇到该指令后,结束汇编过程,其后的指令将不加处理。43.定义字节伪指令格式:标号:DBX1,X2,…,Xi,…Xn其中标号为可选项,Xi为8位数据或ASCⅡ码。例如:ORG1000HTAB:DB01H,02H则(1000H)=01H,(1001H)=02H4.定义双字节伪指令格式:标号:DWX1,X2,…,Xi,…Xn其中称号为可选项,Xi为双字节数据。例如:ORG2000HHETAB:DW2546H,0178H则(2000H)=25H,(2001H)=46H(2002H)=01H,(2003H)=78H55.定义空间伪指令格式:标号:DS数据或字符表达式其中标号为可选项。从指定单元开始,由数据或表达式确定保留若干个字节内存空间备用。例如:ORG8000HBUF:DS08HDB50H,8FH即:8000H~8007H单元保留备用(8008H)=50H(8009H)=8FH以上DB、DW、DS伪指令只对程序存储器起作用。66.单字节数据赋值伪指令格式:XEQUnX为用户定义的符号名,n为常数、工作寄存器或特殊功能寄存器,为单字节数据。该伪指令将n的值赋给符号名X。X可用于指令中,作为单字节操作数,包括立即数和直接地址direct。7.双字节数据赋值伪指令格式:yEQUny为用户定义的符号名,n为双字节常数。该伪指令将n的值赋给符号名y。y可作为指令中双单字节操作数,或转移指令中的目的地址。用EQU定义的符号名必须先定义后使用。78.数据地址赋值伪指令格式:字符名称DATA数据或表达式此命令把一个数据地址或代码地址赋予标号段规定的字符名称。例如:INDEXJDATA6369H定义了INDEXJ这个字符名称的地址为6369H,主要用于程序的模块式调试。9.位地址符号命令格式:字符名称BIT位地址该命令把位地址赋予标号段的字符名称。例如:A1BITP1.0A2BITP1.185.3MCS-51单片机汇编语言源程序格式及上机过程5.3.1源程序格式ORG××××SJMP(或AJMP或LJMP)主程序名ORG××××主程序名:主程序……子程序名:子程序……RET中断服务程序名:中断服务程序……RETIEND95.3.2MCS-51单片机汇编语言上机过程机器语言目标程序汇编语言源程序汇编反汇编105.4MCS-51单片机汇编语言程序设计实例5.4.1汇编语言程序设计步骤及程序质量评价标准1.汇编语言程序设计步骤用汇编语言编写程序,一般可按如下步骤进行:(1)建立数学模型(2)确定算法(3)制订程序流程图(4)确定数据结构(5)写出源程序(6)上机调试程序112.评价程序质量的标准(1)程序的执行时间;(2)程序所占用的内存字节数目;(3)程序的逻辑性,可读性;(4)程序的兼容性,可扩展性;(5)程序的可靠性。125.4.2程序设计实例1.顺序结构程序设计顺序结构的程序是指既无循环又无分支(不产生跳转),按程序中指令书写的顺序执行的程序,又称直线程序。这种结构的程序虽然简单,但它是构成任何结构程序的基础。13【例1】两个1位十进制数相加,结果存于工作寄存器R6、R4中。设两个加数分别在工作寄存器R0和R2中。初始化指定工作寄存器区取第一个加数加第二个加数十进制调整保存结果图5-1例1的程序流程图源程序清单:ORG1000HMAIN:CLRPSW.4CLRPSW.3MOVA,R0CLRR6CLRCADDA,R2DAAMOVR4,ACLRAADDCA,#0MOVR6,AEND142.分支结构程序设计在实际应用中,不可能所有程序都是直线运行的,相反,多数情况都需要根据不同的条件进行不同的处理,这就会使程序跳转到不同位置去执行,这种结构的程序称为分支结构程序。MCS-51单片机中条件转移指令、比较转移指令、位转移指令等都可实现程序分支。15【例4】求单字节带符号数的补码。设该单字节数在累加器A中,求出的补码存于寄存器B中。源程序清单:ORG0200HBEGIN:JNBACC.7,L1MOVC,ACC.7MOV00H,CCPLAADDA,#1MOVC,00HMOVACC.7,CL1:MOVB,AEND【例5】单字节十六进制数转换为ASCⅡ码。设被转换的数在B中,转换后的ASCⅡ码放在R7R6中。17ORG2000HMAIN:MOVA,B;取被转换数据SWAPA;取高4位ANLA,#OFHSUBBA,#0AH;高4位〈0AH吗?JCL1;是,转L1ADDA,#7;否,加7L1:ADDA,#30H;加30HADDA,#0AH;原来减掉0AH,再加回来MOVR7,A;保存高4位对应的MOVA,B;转换低4位ANLA,#OFHSUBBA,#0AHJCL2ADDA,#7L2:ADDA,#30HADDA,#0AHMOVR6,A;保存低4位对应的ASCⅡ码END源程序清单:设程序起始地址为2000H183.循环结构程序设计循环程序是指一段反复执行的程序。在许多问题中,需多次执行一段完全相同的程序,只是参加运算(或处理过程)的操作数不同。这时就可以采用循环程序结构。循环程序可以缩短程序,减少程序所占的内存空间。一般情况下,循环程序包括下面几部分:(1)循环体:需要多次执行的程序的主体。(2)循环控制:对循环次数进行计数,判断循环结束的条件。(3)循环初值:包括循环次数、循环体中工作单元的初值等。图5-7循环程序结构图20【例7】延时程序是一种典型的循环程序。本例中,设MCS-51系列单片机系统的主频率为12MHz,要求编写一个延时50ms的程序。下面的程序段为两重循环,其延时时间为:t=[(125×2+1+2)×200+1]×1μs=50601μs=50.601msMOVR7,#200;指令执行时间为1个机器周期DEL1:MOVR6,#125;指令执行时间为1个机器周期DEL2:DJNZR6,#DEL2;指令执行时间为两个机器周期DJNZR7,#DEL1;指令执行时间为两个机器周期这里外循环初值为R7=200,外循环体为第2、3、4句,外循环结束条件为R7=0;内循环初值为R6=125,内循环体为第3句,内循环结束条件为R6=0。214.查表程序设计所谓查表就是把用某种方式获得的结果数据编制成数据表,存放于存储器的某个区域,在程序中用MOVCA,@A+PC或MOVCA,@A+DPTR指令从数据表中取出需要的数据,这样一种类型的程序,称为查表程序。【例10】代码转换是查表程序的典型应用之一。本例要求将一位十六进制数转换成ASCⅡ码。设被转换的十六进制数在R0中,转换以后的ASCⅡ码存放在R1中。程序清单:设程序起始地址为0000H。ORG0000HLJMPMAINORG0060HMAIN:MOVA,R0ANLA,#OFHMOVDPTR,#TABMOVCA,@A+DPTRMOVR1,AORG0100HTAB:DB‘123456789ABCDEF’END23散转程序是一种并行多分支程序,它根据系统的某种输入或运算结果,分别转向各个处理程序。与分支程序不同的是,散转程序多采用指令:JMP@A+DPTR,根据输入或运算结果,确定A或DPTR的内容,直接跳转到相应的分支程序中去。而分支程序一般是采用条件转移指令或比较转移指令实现程序的跳转。散转程序的基本结构如图所示。5.散转程序设计246.子程序设计在实际应用中,有时一段相同功能的程序可能在多处用到,这时可将这段程序编写成子程序,用到它的地方写一条子程序调用指令,即可插入该段程序的执行。编得好的子程序可供不同的人在许多程序中调用,即具有通用性,这样的子程序越多,我们编程越方便,有利于缩短应用系统的研制周期。通用的子程序要求有子程序文件,它包含的主要内容有:子程序名,子程序功能,入口参数,出口参数。子程序与主程序的接口是:在主程序中执行程序调用指令“LCALL子程序名”或“ACALL子程序名”,在子程序最后执行返回指令RET。25子程序的执行过程:保护断点(PC值入栈,由调用指令自动完成);保护现场(可放在主程序中,也可放在子程序中。若放在主程序中,则应安排在调用指令之前);传递参数(需要传递参数时,就有这一步骤,不需传递参数时就没有这一步骤);具体处理(这是子程序的主体,即实现子程序功能的程序段);返回参数(需要返回参数时,就有这一步骤,不需返回参数时就没有这一步骤);恢复现场(若保护现场是在主程序中,则恢复现场也在主程序中,且安排在调用指令之后。若保护现场是在子程序中,则恢复现场也应在子程序中);恢复断点(PC值出栈,由返回指令自动完成)。26【例17】使P1口所接8个发光二极管循环点亮,每点亮一个发光二极管,调用一次延时子程序。设主频fosc=12MHz,延时时间为20ms主程序流程图子程序流程图28源程序清单:ORG0000HAJMPSTARTORG0040HSTART:MOVA,#1START1:MOVP1,AACALLDELAYCJNEA,#80H,START2AJMPSTARTSTART2:RLAAJMPSTART1DELAY:PUSHR2PUSHR3CLRPSW.4CLRPSW.3MOVR2,#100DELAY1:MOVR3,#7DJNZR3,$DJNZR2,DELAY1POPR3POPR2RETEND