资源描述
,Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,单片机基础(第3版),李广弟等编著,北京航空航天大学出版社,2007年6 月,第4章 80C51单片机汇编语言程序设计,4.1 单片机程序设计语言概述,4.2 汇编语言程序的基本结构形式,4.3 80C51 单片机汇编语言程序设计举例,4.4 单片机汇编语言源程序的编辑和汇编,4.5 80C51 单片机汇编语言伪指令,4.1 单片机程序设计语言概述,4.1.1 机器语言和汇编语言,机器语言,:,用二进制编码表示的指令,是计算机能直接识别并执行的指令,。,汇编语言,:用助记符和专门的语言规则表示指令的功能和特征。,汇编语言是对机器语言的改进,比机器语言高级。汇编语言的最大优点是助记符与机器指令一一对应。用汇编语言编写的程序占用存储空间小,运行速度快,程序效率高。,缺点:难以记忆和使用,程序设计的技巧性较高,编程难度较大。要求使用者必须精通单片机的硬件系统和指令系统。缺乏通用性,程序不易移植。,4.1.2 单片机使用的高级语言,对于,8051,单片机,现有,4,种语言支持,即汇编、,PL/M,、,C,和,BASIC,。,C语言最终得到广泛应用。,可以大大提高单片机应用系统研制的开发效率。移植性好。,高级语言的不足:生成的目标代码较长,导致应用程序运行速度较慢。,4.1.3 80C51 单片机汇编语言的语句格式,80C51汇编语言的语句格式如下:,:;,1.标号,是语句地址的标志符号,标号的几点规定:,18个ASCII字符组成,第一个字符必须是字母。,不能使用本汇编语言已经定义的符号作为标号。,标号后面必须跟以冒号“:”。,同一标号在一个程序中只能定义一次。,标号可有可无。,2.操作码,用于规定语句执行的操作内容,用指令助记符表示。不能空缺。,3.操作数,操作数用于为指令操作提供数据。可以是空白,也可能有13个操作数,各操作数之间以逗号分隔。,4.注释,不属于语句的功能部分,只是对语句的解释说明,以“;”开头。,5.分界符(分隔符),用于把语句中的各部分隔开,以便于区分。分界符包括空格、冒号、分号或逗号等符号。,4.2 汇编语言程序的基本结构形式,三种基本结构形式:顺序程序结构,分支程序结构,循环程序结构。,4.2.1 顺序程序结构,顺序结构程序是最简单的程序结构。程序既无分支、循环,也不调用子程序,程序执行时一条接一条地按顺序执行指令。,3字节无符号数相加:其中被加数在内部RAM的50H、51H和52H单元中;加数在内部RAM的53H、54H和55H单元中;要求把相加之和存放在50H、51H和52H单元中,进位存放在位寻址区的20H位中。,MOV R0,#52H;被加数的低字节地址,MOV R1,#55H;加数的低字节地址,MOV A,R0,ADD A,R1 ;低字节相加,MOV R0,A ;存低字节相加结果,DEC R0,DEC R1,MOV A,R0,ADDC A,R1;中间字节带进位相加,MOV R0,A ;存中间字节相加结果,DEC R0,DEC R1,MOV A,R0,ADDC A,R1;高字节带进位相加,MOV R0,A ;存高字节相加结果,CLR A,ADDC A,#00H;进位送00H位保存,MOV R0,#20H;存放进位的单元地址,MOV R0,A,分支结构也称为选择结构。为分支需要,程序设计时应给程序段的起始地址赋予一个地址标号,以供选择分支使用。分支结构又可分为单分支结构和多分支结构。,1.单分支程序结构,单分支程序结构即二中选一,是通过条件判断实现的。一般都使用条件转移指令对程序的执行结果进行判断,(1)单分支结构举例,假定在外部RAM中有ST1、ST2和ST3共3个连续单元,其中ST1和ST2单元中存放着两个无符号二进制数,要求找出其中的大数并存入ST3单元中。,4.2.2 分支程序结构,START:CLR C;进位位清0,MOV DPTR,#ST1;设置数据指针,MOVX A,DPTR;取第1个数,MOV R2,A;第1个数存于R2,INC DPTR;数据指针加1,MOVX A,DPTR;取第2个数,SUBB A,R2;两数比较,JNC BIG1;若第2个数大,则转向BIG1,XCH A,R2;若第1个数大,则整字节交换,BIG0:INC DPTR,MOVX DPTR,A;存大数,RET,BIG1:MOVX A,DPTR,SJMP BIG0,(2)多重单分支结构举例,多重单分支结构中,通过一系列条件判断,进行逐级分支。为此可使用比较转移指令CJNE实现。,例:假定采集的温度值Ta放在累加器A中。此外,在内部RAM 54H单元存放温度下限值T54,在55H单元存放温度上限值T55。若TaT55,程序转向JW(降温处理程序);若TaT54,则程序转向SW(升温处理程序);若T55TaT54,则程序转向FH(返回主程序)。,CJNE A,55H,LOOP1,;若TaT55,则转向LOOP1,AJMP FH;若TaT55,则返回,LOOP1:JNC JW,;若(CY)0,表明TaT55,转降温处理程序,CJNE A,54H,LOOP2,;若TaT54,则转向LOOP2,AJMP FH;若TaT54,则返回,LOOP2:JC SW,;若(CY)1,表明TaT54,转升温处理程序,FH:RET;若T55TaT54,则返回主程序,2.多分支程序结构,多分支程序结构流程中具有两个以上条件可供选择。可供使用的是变址寻址转移指令“JMP A+DPTR”,但使用该指令实现多分支转移时,需要有数据表格配合。,多分支程序结构,(1)通过数据表实现程序多分支,MOV A,n;分支序号送A,MOV DPTR,#BRTAB;地址表首址,MOVC A,A+DPTR;查表,JMP A+DPTR;转移,BRTAB:DB BR0-BRTAB;地址表,DB BR1-BRTAB,DB BRn-BRTAB,BR0:分支程序,BR1:,BRn:,(2)通过转移指令表实现程序多分支,MOV A,n,RL A;分支序号值乘以2,MOV DPTR,#BRTAB;转移指令表首址,JMP A+DPTR,BRTAB:AJMP BR0;转分支程序0,AJMP BR1;转分支程序1,AJMP BR127;转分支程序127,(3)其他实现程序多分支的方法,MOV DPTR,#BRTAB;分支入口地址表首址,MOV A,R0,RL A;分支转移值乘以2,MOV R1,A;暂存A值,INC A,MOVC A,A+DPTR;取低位地址,PUSH ACC;低位地址入栈,MOV A,R1;恢复A值,MOVC A,A+DPTR;取高位地址,PUSH ACC;高位地址入栈,RET;分支入口地址装入PC,BRTAB:DW BR0;分支程序入口地址表,DW BR1,DW BR127,4.2.3 循环程序结构,循环结构是重复执行某个程序段。使用条件转移指令通过条件判断来实现和控制循环。,举例:通过查找结束标志(回车符)以统计字符串长度的循环程序。,设计方法:假定字符串存放在内部RAM从40H单元开始的连续存储单元中。为找到结束标志,应采用逐个字符依次与回车符(ASCII码0DH)比较的方法。同时在程序中还应设置一个字符串指针以顺序定位字符,设置一个字符长度计数器以累计字符个数。,MOV R2,#0FFH;设置长度计数器初值,MOV R0,#3FH;设置字符串指针初值,LOOP:INC R2,INC R0,CJNE R0,#0DH,LOOP,RET,4.3 80C51 单片机汇编语言程序设计举例,4.3.1 算术运算程序,1.加减法运算,(1)多个不带符号的单字节数相加,举例:假设有多个单字节数,依次存放在外部RAM 21H开始的连续单元中,要求把计算结果存放在R1和R2中(假定相加的和为2字节数)。其中R1为高位字节。,MOV R0,#21H;设置数据指针,MOV R3,#N;字节个数,MOV R1,#00H;和的高位字节清0,MOV R2,#00H;和的低位字节清0,LOOP:MOVX A,R0;取一个加数,ADD A,R2;单字节数相加,MOV R2,A;和的低8位送R2,JNC LOOP1,INC R1;有进位,则和的高8位加1,LOOP1:INC R0;指向下一个单元,DJNZ R3,LOOP,(2)两个不带符号的多字节数相减,举例:设有两个N字节数分别存放在内部RAM单元中,低字节在前,高字节在后,分别由R0指定被减数单元地址,由R1指定减数单元地址,其差存放在原被减数单元中。,CLR C;清进位位,MOV R2,#N;设定字节数,LOOP:MOV A,R0;从低字节开始逐个取被减数字节,SUBB A,R1;两数相减,MOV R0,A;存字节相减的差,INC R0,INC R1,DJNZ R2,LOOP;减法是否完成,JC QAZ;若最高字节有借位,则转溢出处理,RET,2.乘法运算,由于乘法指令“MUL AB”是对单字节的,即单字节数的乘法运算使用一条指令就可以完成;但对多字节数的乘法运算,则必须通过程序实现。,举例:假定要进行两个双字节无符号数乘法运算,被乘数和乘数分别存放于内部RAM的R2、R3单元和R6、R7单元中(其中R2和R6分别为高位字节),相乘的结果(积)依次存放在R4、R5、R6、R7单元中。因为乘数和被乘数各为2字节,因此,须进行4次乘法运算,得到4次部分乘积。部分积高字节用H标志,部分积低字节用L标志。此外,还要处理部分积相加产生的进位。,为了进一步了解程序,可以把乘法运算的实现过程用示意方法表示出来,如下图所示。,两个双字节无符号数乘法示意图,DBMUL:,MOV A,R3,MOV B,R7,MUL AB;R3R7(得第1次部分积),XCH A,R7;原R7内容送A,R7R3R7L(在R7中得到乘积的第4字节),MOV R5,B;R5R3R7H,MOV B,R2,MUL AB;R2R7(得第2次部分积),ADD A,R5;R2R7L+R3R7H,MOV R4,A;R4和,CLR A,ADDC A,B;R2R7H+(R2R7L+R5时产生的进位),MOV R5,A;R5和,MOV A,R6,MOV B,R3,MUL AB;R3R6(得第3次部分积),ADD A,R4;R3R6L+R4,XCH A,R6,;AR6,R6R3R6L+R4(在R6中得到乘积的第3字节),XCH A,B;AR3R6H,BR6,ADDC A,R5,;R3R6H+R5+(R3R6L+R4时产生的进位),MOV R5,A;R5和,MOV F0,C;F0进位,MOV A,R2,MUL AB;R2R6(得第4次部分积),ADD A,R5;R2R6L+(R3R6H+R5时产生的进位),MOV R5,A;在R5中得到乘积的第2字节,CLR A,MOV ACC.0,C;累加器最高位进位,MOV C,F0,ADDC A,B;R2R6H+F0+ACC.0,MOV R4,A;在R4中得到乘积的第1字节,RET,3.除法运算,除法指令“DIV AB”也是对单字节的,单字节数的除法运算可以直接使用该指令完成。而多字节数据的除法运算需要编程实现,通常采用“移位相减”的方法。,举例:实现双字节无符号数除法运算的程序。,为编写程序,首先要定义一些数据单元。,R7R6 执行前存被除数,执行后存商(其中R7为高位字节);,R5R4 存除数(其中R5为高位字节);,R3R2 存放每次相除的余数,执行后即为最终余数;,3AH 溢出标志单元;,R1 循环次数计数器(16次),除法运算程序比较复杂,对“移位相减”法有如下几点说明:,除法运算需要对被除数和除数进行判定:若被除数为0,除数不为0,则商为0;若除数为0,则除法无法进行,置标志单元3AH为0。,除法运算是按位进行
展开阅读全文