【大学课件】80C51单片机汇编语言程序设计

PPT
  • 阅读 47 次
  • 下载 0 次
  • 页数 74 页
  • 大小 924.012 KB
  • 2022-11-24 上传
  • 收藏
  • 违规举报
  • © 版权认领
下载文档30.00 元 加入VIP免费下载
此文档由【小橙橙】提供上传,收益归文档提供者,本网站只提供存储服务。若此文档侵犯了您的版权,欢迎进行违规举报版权认领
【大学课件】80C51单片机汇编语言程序设计
可在后台配置第一页与第二页中间广告代码
【大学课件】80C51单片机汇编语言程序设计
可在后台配置第二页与第三页中间广告代码
【大学课件】80C51单片机汇编语言程序设计
可在后台配置第三页与第四页中间广告代码
【大学课件】80C51单片机汇编语言程序设计
【大学课件】80C51单片机汇编语言程序设计
还剩10页未读,继续阅读
【这是免费文档,您可以免费阅读】
/ 74
  • 收藏
  • 违规举报
  • © 版权认领
下载文档30.00 元 加入VIP免费下载
文本内容

【文档说明】【大学课件】80C51单片机汇编语言程序设计.ppt,共(74)页,924.012 KB,由小橙橙上传

转载请保留链接:https://www.ichengzhen.cn/view-44732.html

以下为本文档部分文字说明:

第4章80C51单片机汇编语言程序设计4.1单片机程序设计语言概述4.2汇编语言程序的基本结构形式4.380C51单片机汇编语言程序设计举例4.4单片机汇编语言源程序的编辑和汇编4.580C51单片机汇编语言伪指令4.1单片机程序设计语言概述4.1.1机器

语言和汇编语言1、机器语言用二进制代码“0”和“1”表示指令和数据的程序设计语言,是计算机能直接识别并执行的指令。优点:执行速度快、占用内存少。缺点:识别难、记忆难。2、汇编语言用助记符和专门的语言规则表示指令的功能和特征。优点:助记符与机器指令一一对应。比机器语言直观、易懂、易记。非常适

合于实时控制的需要。缺点:难以记忆和使用,程序设计的技巧性较高,编程难度较大。要求使用者必须精通单片机的硬件系统和指令系统。缺乏通用性,程序不易移植。4.1.2单片机使用的高级语言对于8051单片机,现有4种语言支持,即汇

编、PL/M、C和BASIC。C语言最终得到广泛应用。可以大大提高单片机应用系统研制的开发效率。移植性好。高级语言的不足:生成的目标代码较长,导致应用程序运行速度较慢。4.1.380C51单片机汇编语言的语句格式80C51汇编

语言的语句格式如下:[<标号>]:<操作码>[<操作数>];[<注释>]1.标号是语句地址的标志符号,标号的几点规定:1~8个ASCII字符组成,第一个字符必须是字母。不能使用本汇编语言已经定义的符号作为标号。标号后面必须跟以冒号“:”。同一标号在一个程序中只能定义一次。标号可有可无。

错误的标号正确的标号1BT:BT1BEGINBEGIN:TA+TB:TATB:ADD:ADD1:2.操作码用于规定语句执行的操作内容,用指令助记符表示。不能空缺。3.操作数操作数用于为指令操作提供数据。可以是空白,也可能有1~3个操作数,各操作数之间以逗号分隔。4

.注释不属于语句的功能部分,只是对语句的解释说明,以“;”开头。5.分界符(分隔符)用于把语句中的各部分隔开,以便于区分。分界符包括空格、冒号、分号或逗号等符号。4.2汇编语言程序的基本结构形式三种基本结构形式:顺序程序结构,分

支程序结构,循环程序结构。4.2.1顺序程序结构顺序结构程序是最简单的程序结构。程序既无分支、循环,也不调用子程序,程序执行时一条接一条地按顺序执行指令。(1)分析任务(2)确定算法(3)画流程图(4)编写程序(5)上机调试2、程序设计的一般步骤当接到程序设计的任务后,首先对任务进行详尽的分析

,搞清楚已知的数据和想要得到的结果,程序应该完成何种的功能。明确在程序设计时应该“做什么”。根据实际问题的要求和指令系统的特点,确定解决问题的具体步骤。根据任务要求,对不同的计算方法进行比较,选择最适宜的算法。解决

“怎样做”的问题。将解决问题的具体步骤用一种约定的几何图形、指向线和必要的文字说明描述出来,用图形的方法描绘解决问题的思路。用指令的形式将程序流程图实现出来。查错、改错,对程序进行优化。50H51H52H53H54H55HN1高字节N1中字节N1低字节N2高字节N2中字节N2低字节(1)分析任

务(2)确定算法(3)画流程图(4)编写程序(5)上机调试例:3字节无符号数相加:其中被加数在内部RAM的50H、51H和52H单元中;加数在内部RAM的53H、54H和55H单元中;要求把相加之和存放在50H、51H和52H单元中,进位存放在位寻址区的20H位中

。MOVR0,#52H;被加数的低字节地址MOVR1,#55H;加数的低字节地址MOVA,@R0ADDA,@R1;低字节相加MOV@R0,A;存低字节相加结果DECR0DECR1MOVA,@R0ADDCA,@R1;中间字节带进位相加MOV@R0,A;存中间字节相加结果DECR0DECR1MOVA,

@R0ADDCA,@R1;高字节带进位相加MOV@R0,A;存高字节相加结果CLRAADDCA,#00H;进位送00H位保存MOVR0,#20H;存放进位的单元地址MOV@R0,A分支结构也称为选择结构。为分支需要,程序设计时应给程序段的起始地址赋予

一个地址标号,以供选择分支使用。分支结构又可分为单分支结构和多分支结构。1.单分支程序结构单分支程序结构即二中选一,是通过条件判断实现的。一般都使用条件转移指令对程序的执行结果进行判断。可实现单分支转

移的指令有:JZ、JNZ、CJNE和DJNZ。位状态转移指令:JC、JNC、JB、JNB和JBC等。4.2.2分支程序结构(1)单分支结构举例假定在外部RAM中有ST1、ST2和ST3共3个连续单元,其中ST1和ST2单元中存放着两个无符号二进制数,要求找出其中的大数并存入S

T3单元中。解:(1)分析任务:比较两个数的大小(2)算法:算术运算、控制转移(3)程序结构:单分支(4)数据类型:单字节、二进制、无符号数(5)数据结构:单元地址升序排列(6)RAM单元安排:外部RAM单元(7)采用寄存器间接寻

址方式(R0、R1或DPTR)(8)程序设计流程框图;(9)程序清单;开始设置数据指针取数据N2取数据N1并暂存结束N1保存于A中N2≥N1修改数据指针保存大数N2保存于A中YNSTART:CLRC;进位位清0MOVDPTR,#ST1;设置数据指针MOVXA,@DPTR;取第

1个数MOVR2,A;第1个数存于R2INCDPTR;数据指针加1MOVXA,@DPTR;取第2个数SUBBA,R2;两数比较JNCBIG1;若第2个数大,则转向BIG1XCHA,R2;若第1个数大,则整字节交换BIG0:INCDPTRMOVX@DPTR,A;

存大数RETBIG1:MOVXA,@DPTRSJMPBIG0上例中,如果采用CJNEA,direct,rel指令,应如何修改程序?(2)多重单分支结构举例多重单分支结构中,通过一系列条件判断,进行逐级分支。为此可使用比较转移指令CJNE实现。CJNEA,5

5H,LOOP1;若Ta≠T55,则转向LOOP1AJMPFH;若Ta=T55,则返回LOOP1:JNCJW;若(CY)=0,表明Ta>T55,转降温处理程序CJNEA,54H,LOOP2;若Ta≠T54,则转向LOOP2AJMPFH;若Ta=T54,则

返回LOOP2:JCSW;若(CY)=1,表明Ta<T54,转升温处理程序FH:RET;若T55≥Ta≥T54,则返回主程序例:假定采集的温度值Ta放在累加器A中。此外,在内部RAM54H单元存放温度下限值T54,在55H单元存放温度上限值T55。若Ta>T55,程序转向

JW(降温处理程序);若Ta<T54,则程序转向SW(升温处理程序);若T55≥Ta≥T54,则程序转向FH(返回主程序)。解:(1)分析任务:解方程(2)算法:控制转移(3)程序结构:多分支(4)数据类型:单字节、二进制、有

符号数(5)RAM单元安排:外部RAM单元(6)采用寄存器间接寻址方式(R0、R1或DPTR)(7)程序设计流程框图(8)程序清单;011y000xxx例:已知:127≥X≥-128,求

Y。设X,Y分别存放在外部RAM1000H和2000H单元中。开始取数据X结束X=0Y=0YNX<0Y=-1Y=1NY保存数据Y返回XADEQU1000H;BUFEQU2000H;ORG1000HSTART:MOVDPTR,#XAD;数据X

的地址送数据指针DPTRMOVXA,@DPTR;A←取数据XJZSAV;X=0转SAVJBACC.7,NEG;X<0转NEG,否则,X>0MOVA,#01H;SJMPSAV;NEG:MOVA,#0FFH;(0FFH为-1补

码)SAV:MOVDPTR,#BUF;数据Y的地址送数据指针DPTRMOVX@DPTR,A;保存Y值END上例中,如果采用CJNE指令,应如何修改程序?XADEQU1000H;BUFEQU2000H;ORG

1000HSTART:MOVDPTR,#XAD;数据X的地址送数据指针DPTRMOVXA,@DPTR;A←取数据XCJNEA,#0,ANZ;X≠0转ANZSJMPSAV;ANZ:JCNEG;X<0转NEG,否则,X>0MOVA,#01H;SJMPSAV;NEG:MOVA,#0FFH;(0FFH为

-1补码)SAV:MOVDPTR,#BUF;数据Y的地址送数据指针DPTRMOVX@DPTR,A;保存Y值END2.多分支程序结构多分支程序结构流程中具有两个以上条件可供选择。可供使用的是变址寻址转移指令“JMP@A+DPTR”,但使用该指令实现多分支转移时,需要有数据表格配合。多分支程序结构(1

)通过数据表实现程序多分支MOVA,n;分支序号送AMOVDPTR,#BRTAB;地址表首址MOVCA,@A+DPTR;查表JMP@A+DPTR;转移BRTAB:DBBR0-BRTAB;地址表DBBR1-BRTABDBBRn-BRTABBR0:…分支程序BR1:…BRn

:…(2)通过转移指令表实现程序多分支MOVA,nRLA;分支序号值乘以2MOVDPTR,#BRTAB;转移指令表首址JMP@A+DPTRBRTAB:AJMPBR0;转分支程序0AJMPBR1;转分支程序1AJMPBR127;转

分支程序127BR0:…;分支程序BR1:…BRn:…(3)其他实现程序多分支的方法MOVDPTR,#BRTAB;分支入口地址表首址MOVA,R0RLA;分支转移值乘以2MOVR1,A;暂存A值INCAMOVCA,@A+DPTR;取低位地址PUSHACC;低位地址入栈

MOVA,R1;恢复A值MOVCA,@A+DPTR;取高位地址PUSHACC;高位地址入栈RET;分支入口地址装入PCBRTAB:DWBR0;分支程序入口地址表DWBR1DWBR127例:假设键盘上有4个按键,功能说明

如下表:分析任务确定算法程序流程框图键功能键值(分支程序序号)键处理程序(分支程序)删除00HER读数据01HDS写数据02HXS插入03HCRJMP@A+DPTRER分支程序CR分支程序XS分支程序DS分支程序序号=00HDPTR←表首地址A←分支序号×2序号

=03H序号=02H序号=01H假设转移指令表名称为BRTAB,分支程序序号已在A中。MOVDPTR,#BRTABCLRCRLCAJMP@A+DPTR;ORG3000H3000HBRTAB:AJMPER;转删除分支程序3001H3002

HAJMPDS;转读数据分支程序3003H3004HAJMPXS;转写数据分支程序3005H3006HAJMPCR;转插入分支程序ORG3100H3100HER:………………;删除分支程序ORG3200H3200HDS:………………;读数据分支程序ORG3300H

3300HXS:………………;写数据分支程序ORG3400H3400HCR:………………;插入分支程序END(4)使用比较转移指令CJNE实现。(A)=0?转向0分支(A)=1?(A)=2?转向2分支转向1分支

YYYNNN4.2.3循环程序结构循环结构是重复执行某个程序段。使用条件转移指令通过条件判断来实现和控制循环。循环程序一般由四个主要部分组成:(1)初始化部分:为循环程序做准备,如规定循环次数、给各变量和地址指针预置初值。(2)处理

部分:为反复执行的程序段,是循环程序的实体,也是循环程序的主体。(3)循环控制部分:其作用是修改循环变量和控制变量,并判断循环是否结束,直到符合结束条件时,跳出循环为止。(4)结束部分:这部分主要是对循环程序的结果进行分析、

处理和存放。MOVR2,#0FFH;设置长度计数器初值MOVR0,#3FH;设置字符串指针初值LOOP:INCR2INCR0CJNE@R0,#0DH,LOOPRET举例:通过查找结束标志(回车符)以统计字符串长度的循环程序。假定字符串存放在内部RAM从40H单元开始的连续存

储单元中。为找到结束标志,应采用逐个字符依次与回车符(ASCII码0DH)比较的方法。同时在程序中还应设置一个字符串指针以顺序定位字符,设置一个字符长度计数器以累计字符个数。单循环程序一般有以下两种典型结构:双重循环程序的结构:开始外循环初始化结束外循环结束否NY内循环

初始化内循环处理内循环变量修改外循环处理外循环变量修改结束处理内循环结束否NY解:(1)分析任务:数据传送;(2)算法:比较、控制转移(3)程序结构:分支、循环(4)数据类型:多字节字符串(5)RAM单元安排:内部RAM单元、外部RA

M单元(6)采用寄存器间接寻址方式(R0、R1或DPTR)外部RAMXX内部RAMDATA单元ABUFFER单元YY(A)≠$(A)=$结束例:把内部RAM中起始地址为DATA的数据串传送到外部RAM以BUFFER为首地址的区域,直到发现“$”字符的ASCⅡ码为止,同时规定数据串最

大长度为32个字节。(7)程序流程框图;开始初始化数据指针结束数传送完否NY初始化控制变量取数数据传送修改指针变量是$吗?YNORG0030HDATACS:MOVR0,#DATA;DATA数据区首地址MOVDPTR,#B

UFFER;BUFFER数据区首地址MOVR1,#20H;最大数据串长LOOP:MOVA,@R0;取数据SUBBA,#24H;判是否为“$”字符JZLOOP1;是“$”字符,转结束MOVXA,@R0;MOVX@D

PTR,A;数据传送INCR0;INCDPTR;DJNZR1,LOOP;循环控制LOOP1:RET;结束END【补充程序】存储器清零程序。假设在内部RAM区,开辟96个工作单元,工作单元首地址为20H,则工作单元清零程序子程序如下:思考题:如采用CJNE指令,应如何

修改程序?解:ORG1000HCLR0:MOVR0,#20H;循环初始化部分MOVR7,#96;CLRALOOP:MOV@R0,A;循环体部分INCR0;修改变量DJNZR7,LOOP;循环控制部分RETEN

DDECR7CJNER7,#00H,LOOP;例:两个三字节二进制无符号数相加,被加数放在内部RAM50H~52H单元(低字节存放在高地址单元,高字节存放在低地址单元,即低位在前,高位在后),加数放在53H~55H单元,和放在50H~52H单元,最高位如有进位,则放在2

3H单元中。被加数(N1)加数(N2)和(N3)50H单元高字节53H单元高字节50H单元高字节51H单元中字节54H单元中字节51H单元中字节52H单元低字节55H单元低字节52H单元低字节23H单元进位位被加数N1高字节(8位)中字节(8位)低字

节(8位)加数N2高字节(8位)中字节(8位)低字节(8位)+)进位位(CY)进位位(CY)进位位(CY)和N3进位高字节(8位)中字节(8位)低字节(8位)开始初始化数据指针结束两数加完否NY初始化控制变量取加数N1取加数N2两数相加并保存修改指针变量数据

处理返回程序流程框图ORG0030HADDUDO:MOVR0,#52H;循环初始化部分MOVR1,#55H;MOVR7,#03H;循环次数CLRC;LOOP:MOVA,@R0;循环体部分ADDCA,@R1;MOV@R0,A;DECR0

;修改指针变量DECR1;DJNZR7,LOOP;循环控制部分CLRA;循环结束处理部分ADDCA,#00H;MOVR0,#23H;MOV@R0,A;RET;END程序清单4.380C51单片机汇编语言程

序设计举例4.3.2定时程序在单片机的控制应用中,常有定时的需要,如定时中断、定时检测和定时扫描等。定时功能除可以使用纯硬件电路、可编程定时/计数器实现外,还可以使用软件程序(定时程序)完成。定时程序是典型的循环程序,它是通过执行一个具有固定延迟时间的循环体来实现定时的。

开始初始化部分结束循环控制部分NY循环体(1)单循环定时程序MOVR5,#TIME;LOOP:NOP;NOP;DJNZR5,LOOP;假设单片机晶振频率fosc=6MHz,则一个机器周期为2μs,NOP、DJNZ指令分别是单、双机器周期指令。定时程序的总延迟时

间是循环程序段延时时间的整数倍,由于R5是8位寄存器,因此,这个定时程序的最长定时时间为:256(28)×8=2048(μs)(2)较长时间的定时程序(多重循环定时子程序)TIME:MOVR5,#TTME1;LOOP2:MOVR4,#TEME2;L

OOP1:NOP;NOP;DJNZR4,LOOP1;DJNZR5,LOOP2;RET;这个定时子程序的最长定时时间为:[256(28)×4+2+1]×256(28)×2+4=525828(μs)开始外循环初始化结束内循环控制NY内循环

初始化外循环控制内循环体NY(3)调整定时时间在定时程序中可通过在循环程序段中增减指令的方法对定时时间进行微调。例:MOVR0,#TTME;LOOP:ADDA,R1;INCDPTR;DJNZR0,LOOP;由于ADD、INC、DJNZ指令的机器周期分别

为1、2、2,所以,该程序定时时间为=(1+2+2)×2μs×Time(μs)。假定要求定时时间为24us。对于这个定时程序,只须增加一条NOP指令即可实现。MOVR0,#TIME;LOOP:ADDA,R1;INCDPTR;NOP;DJN

ZR0,LOOP;只须TIME取2,即可得到精确的24μs定时。(4)以一个基本的延时程序满足不同的定时要求如果一个系统有多个定时需要,我们就可以设计一个基本延时程序,使其延时时间为各定时时间的最大公约数,然后可以以此基本程序作为子程序,通过调用的方法实现所需不同定时。MOV

R0,#05H;5S定时LOOP:LCALLDELAY;DJNZR0,LOOP1;┋MOVR0,#0AH;10S定时LOOP2:LCALLDELAY;DJNZR0,LOOP2;┋MOVR0,#14H;20S定时LOO

P3:LCALLDELAY;DJNZR0,LOOP3;┋例:在单片机应用系统中,假设需要的定时时间分别为5S、10S、20S,可设计一个1S延时子程序DELAY,则5S、10S、20S的定时时间可通过调用DELAY实现。4.3

.3查表程序所谓查表程序,就是指预先把数据以表格形式存放在程序存储器中,然后使用程序读出,这种能读出表格数据的程序就称之为查表程序。查表操作对单片机的控制应用十分重要,查表程序常用于实现非线性修正,非线性函数

转换以及代码转换等场合。MCS-51单片机指令系统中有两条专用查表指令:(1)MOVCA,@A+DPTR;A←((A)+(DPTR))(2)MOVCA,@A+PC;A←((A)+(PC))这两条查表指令的功能是完全相同的,其共同优点是:能在不改变PC和DP

TR的状态下,只根据A的内容就可以取出表格中的数据。注意:A的内容均为8位无符号数。适用于64KBROM范围内查表,一个数据表格可以被多个程序块使用。编写查表程序时,首先把表的首地址送入DPTR中,再将要查表的数据序号(或下标值)送入A中,然后就可以使用该指令进行查表操作,并把

结果送A中。常用于“本地”范围查表(数据表格只能放在该指令后面256个地址单元之内,而且表格只能被本程序使用)。编写查表程序时,首先把查表数据的序号送入A中,再把从查表指令的下一条指令的首地址到表的首地址间的偏移量与A值相加,然后再使用该指令进行查表操作,并把结果送入A中。ORG1000H1000

HSQR:MOVA,30H;A←x1002HPUSHDPH;现场保护1004HPUSHDPL;1006HMOVDPTR,#TAB1;DPTR←表首地址TAB11009HMOVCA,@A+DPTR;查表得y100AHMOV40H,A;40H←y100CHPOPDPL;现场恢

复100EHPOPDPH;1010HRET1011HTAB1:DB00H,01H,04H,09H,10H,19HDB24H,31H,40H,51H例:设计一个子程序,其功能为根据x的内容(0~9之间)查平方表,求出相应的结果y(y=x2)。假设x的内容已存放在内部RAM30H单

元中,求出y的内容存放在内部RAM40H单元中。上例中,如果使用MOVCA,@A+PC指令,则编程如下:ORG1000H1000HSQR:MOVA,30H;A←x1002HPUSHDPH;现场保护1004HPUSHDPL;1006HADDA,#07H;加偏移量

1008HMOVCA,@A+PC;查表得y1009HMOV40H,A;40H←y100BHPOPDPL;现场恢复100DHPOPDPH;100FHRET1010HTAB1:DB00H,01H,04H,09H,10H,19HDB24H,31H,40H,51H此题中,偏移量=

1010H-1009H=07H编辑:编写程序的过程。汇编语言源程序:用汇编语言编写的程序称为汇编语言源程序。汇编:汇编语言源程序不能在单片机中直接执行,必须将其“翻译”为用二进制代码(机器语言)表示的目标程序才能执行。这个“翻译”过程称为汇编。4.4单片机汇编

语言源程序的编辑和汇编4.4.1手工编程与汇编手工汇编:先把程序用助记符指令写出,然后通过查指令代码表,逐个把助记符指令“翻译”成机器码,最后再把机器码的程序输入单片机,进行调试和运行。通常把这种查表翻译指

令的方法称为手工汇编。由于手工编程是按绝对地址进行定位的,所以手工汇编时要根据转移的目标地址计算转移指令的偏移量,不但麻烦而且容易出错。4.4.2机器编辑与交叉汇编机器编辑:是指借助于微型机或开发系统进行单片机的程序设计,通常都是使用编辑软件进行源程序的编辑。编辑完成后,生成一个由

汇编指令和伪指令构成的扩展名为“.ASM”的ASCII码文件。机器汇编:由计算机完成从汇编语言源程序到机器语言目标程序的“翻译”工作。交叉汇编:是指使用一种计算机的汇编程序为另一种计算机的源程序进行汇编

,即运行汇编程序进行汇编的是一种计算机,而汇编得到的目标程序是另一种计算机的。单片机只能采用机器交叉汇编的方法对汇编语言程序进行汇编在微型机或开发系统上采用交叉汇编方法对源程序进行汇编。交叉汇编后,再使用串行通信,把汇编得到的目标程序传送到单片机,进行程序调试和运行。可见,“机器编辑→交

叉汇编→串行传送”的过程构成了单片机软件设计的“三步曲”,全过程如图所示。单片机汇编语言程序生成过程对汇编语言程序进行机器交叉汇编时,必须告诉计算机的汇编程序应该如何完成汇编工作,这一任务就是通过使用伪指令来实现的。伪指令是程序设计人员发给汇编程序的指令,也称汇编

命令或汇编程序控制指令。它具有控制汇编程序的输入输出、定义数据和符号、条件汇编、分配存储空间等功能。伪指令没有与之相对应的二进制机器代码,不同汇编语言的伪指令也有所不同。手工汇编不需要伪指令,但机器交叉汇编必须使用伪指令。在对汇编语言程序进行机器交叉汇编前,伪指令存

在于汇编语言程序中,但汇编后得到的机器代码程序中不存在伪指令相对应的二进制机器代码,这一点请特别注意。4.580C51单片机汇编语言伪指令1.汇编起始地址命令ORG(ORiGin)本命令总出现在汇编语言源程序的开头位置,用于规定目标程序的起始地址,即此命

令后面的程序或数据块的起始地址。命令格式:[〈标号:〉]ORG〈地址〉在汇编语言程序的开始,通常都用一条ORG伪指令来规定程序的起始地址,如果不用ORG规定,则汇编得到的目标程序将从0000H开始。选择项通常为16位绝对地址,但也可以使用标号或

表达式表示例:ORG8000HSTART:MOVA,#00H;┇即规定标号START代表地址8000H,目标程序的第一条指令从8000H开始。2.汇编终止命令END(ENDofassembly)该命令用于终止源程序的汇编工作。END是汇编语言源程序的结束标志,因此,在整个

汇编语言源程序中只能有一个END指令,且位于程序的最后。如果END命令出现在程序中间,则在END之后的指令,汇编程序将不予处理。命令格式为:[<标号:>]END[<表达式>][<表达式>]是选择项,只有主程序模块才有;[<标号:>]也是选择项,当源程序为主程序时才具有,其值为主程序第一

条指令的符号地址3.赋值命令EQU(EQUate)该命令用于给字符名称赋值。赋值后,其值在整个程序中有效。命令格式为:<字符名称>EQU<赋值项>其中<赋值项>可以是常数、地址、标号或表达式。其值为8位或16位二进

制数。赋值以后的字符名称既可以作地址使用,也可以作立即数使用。例:HOUREQU30HORG1000HSTART:MOVHOUR,#40H;等同于START:MOV30H,#40H;4.DB(DefineByte)定义数据字节命令本命令用于从指定的地址单元开始,在程序存储器的连续单元中定义字节

数据。常使用本命令存放数据表格。命令格式:[〈标号:〉]DB〈8位数表〉例如:DB“howareyou?”DB-2,-4,-6,10,11,17例:存放7段数码管(共阳极)显示的十六进制基数(0~F)的十六进制数的字形代码,可使用多条DB命令定义。DB0C0H,0

F9H,0A4H,0B0H;0,1,2,3DB99H,92H,82H,0F8H;4,5,6,7DB80H,90H,88H,83H;8,9,A,BDB0C6H,0A1H,86H,84H;C,D,E,F查表时,为确定数据区的起始地址,可采用两种方法:a)根据DB命令前一条指令的地址确定。把该地址加上它

的字节数就是DB的定义的数据字节的起始地址。例:8100:MOVA,#49H;一字节指令TAB:DB0COH,0F9H,0A4H,0B0H;┋定义的7段数码管(共阳极)显示的十六进制基数(0~F)的十六进制数的字形代码从8101

H地址单元开始存放。b)使用0RG命令专门规定。例:ORG8100HTAB:DB0COH,0F9H,0A4H,0B0H;┋定义的7段数码管(共阳极)显示的十六进制基数(0~F)的十六进制数的字形代码从8101H地址单元开始存放。5.定义数据字命令DW(Defi

neWord)本命令用于从指定地址开始,在程序存储器单元中定义16位的数据字。命令格式:[〈标号:〉]DW〈16位数表〉存放时,数据字的高8位在前(低地址),低8位在后(高地址)。例如,DW“AA”;存入41H,41HDW“A”;存入0

0H,41HDW“ABC”;不合法,因超过两字节DW100H,1ACH,-804;按顺序存入01H、00H、01H、0ACH、0FCH、0DCHDB和DW定义的数表,数的个数不得超过80个。如数据的数目较多时,可使用多

个定义命令。在MCS-51程序设计应用中,常以DB来定义数据,以DW来定义地址。6.定义存储区命令DS(DefineStonage)该命令用于从指定地址开始,在程序存储器中保留指定数目的单元作为预留存储区,供

程序运行使用。源程序汇编时,对预留单元不赋值。命令格式为:[<标号:>]DS<16位数表>例如:ADDRTABL:DS20;从标号ADDRTABL代表的地址开始,预留20个连续的地址单元ORG8100HDS08H

;从8100H地址开始,保留8个连续的地址单元7.位定义命令BIT该命令用于给字符名称赋以位地址。命令格式为:<字符名称>BIT<位地址>其中:<位地址>可以是绝对地址,也可以是符号地址(即位符号名称)。例:AQBITP1.0功能是把P1.0的位地址赋给变量AQ,在其后的编程中AQ就可以作为位地

址使用补充内容:子程序结构子程序结构是一种非常重要的程序结构。在一个程序中经常遇到反复多次使用某程序段的情况,如果重复书写这个程序段,会使程序变得冗长而杂乱。对此,可采用子程序结构,即把重复的程序段编写为一个子程序,通过主程序调用而

使用它。这样不但减少了编程工作量,而且也缩短了程序的长度。调用和返回构成了子程序调用的完整过程。为了实现这一过程,必须有子程序调用指令和返回指令。调用指令在主程序中使用,而返回指令则应该是子程序的最后一条指令。执行完这条指令

后,程序返回主程序断点处继续执行。(1)子程序的编程原则在实际的单片机应用系统软件设计中,为了程序结构更加清晰,易于设计,易于修改,增强程序可读性,基本上都要使用子程序结构。子程序作为一个具有独立功能的程序段,编程时需遵循以下原则:a)子程序的第一条指令必须有标号,明确子程序入口地址;b)以返

回指令RET结束子程序;c)子程序说明部分;子程序名称:提供给主程序调用的名字,通常用符号或子程序第一条语句的标号来表示。子程序功能:简要说明子程序能完成的主要功能。子程序入口参数:主程序需要向子程序提供的参数。子程序出口参数:子程序执行完之后向主程序返回的参数。子程序占用资源:子程序中使

用了哪些存储单元、寄存器等子程序堆栈深度:子程序占用堆栈区的最大字节数。子程序嵌套情况:子程序中继续调用子程序的情况。子程序的字节数:子程序中所有指令字节数的总和。子程序执行时间:子程序中所有指令的机器周期数总和。这些说明是写给程序员看

的,供以后使用子程序时参考。d)较强的通用性和可浮动性,尽可能避免使用具体的内存单元和绝对转移地址等。e)注意保护现场和恢复现场。子程序在编制过程中经常会用到一些通用单元,如工作寄存器、累加器、数据指针DPTR以及PSW等。而这些工作单元在调用它的

主程序中也会用到,为此,需要将子程序用到的这些通用编程资源加以保护,称为保护现场。在子程序执行完后需恢复这些单元的内容,称为恢复现场。通常保护和恢复现场是在子程序中利用堆栈操作实现的,在子程序的开始部分把子程序中要用到的编程资源都保护起来,在执行返回指令之前

恢复现场,这是一种比较规范的方法。另外,保护现场和恢复现场也可以在主程序中实现。在调用子程序前保护现场,子程序返回后恢复现场,这种方式比较灵活,可以根据当时的需要确定要保护的内容。(2)参数传递的方法主程

序调用子程序时,主程序和子程序之间存在着参数互相传递的问题。参数传递一般有以下几种方法:1)寄存器传递参数通过寄存器A传递入口参数和出口参数。例:假设a、b均小于10,计算c=a2+b2,其中a事先存在内部RAM的31H单元,b事先存在32H

单元,请把c存入33H单元。SQR:y=x2子程序ORG0000H;主程序MAIN:MOVSP,#3FH;设置栈底MOVA,31H;取数a存放到A中作为入口参数LCALLSQR;MOVR1,A;出口参数:a的平方值存放在A中MOVA,32H;

取数b存放到A中作为入口参数LCALLSQR;ADDA,R1;MOV33H,A;SJMP$;子程序名称:SQR功能:通过查表求出平方值y=x2入口参数:x存放在累加器A中出口参数:求得的平方值y存放在A中占用资源:累加器A,数据指针DPTRSQR:PUSHDPH;保护现场,将主程序中DPTR的高

8位入栈PUSHDPL;保护现场,将主程序中DPTR的低8位入栈MOVDPTR,#TABLE;DPTR←表首地址MOVCA,@A+DPTR;查表POPDPL;恢复现场,将主程序中DPTR的低8位从堆栈中弹出POPDPH;恢复现场,将主程序中DPTR的高8位从堆栈中弹出RETTABLE:

DB0,1,4,9,16,25,36,49,64,81END2)利用堆栈传递参数*ORG0000H;主程序MAIN:MOVSP,#3FH;设置栈底PUSH31H;将数a存放到堆栈中,作为入口参数LCALLSQ

R;POPACC;MOVR1,A;出口参数:a的平方值存放在A中PUSH32H;LCALLSQR;POPACC;ADDA,R1;MOV33H,A;SJMP$;子程序名称:SQR功能:通过查表求出平方值y=x2入口参数:x存放在堆栈中出口参数:求得的平方值y存

放在堆栈中占用资源:累加器A,数据指针DPTRSQR:MOVR0,SP;R0作为参数指针DECR0;堆栈指针退回子程序调用前的地址DECR0;XCHA,@R0;保护ACC,取出参数MOVDPTR,#TABLE;DPTR←表首地址MOVCA,@A

+DPTR;查表XCHA,@R0;查表结果放回堆栈中RETTABLE:DB0,1,4,9,16,25,36,49,64,81(3)子程序调用中应注意的问题由于子程序调用过程中,CPU自动使用了堆栈,因此,

容易出现以下几种错误:a)忘记给堆栈指针SP赋栈底初值,堆栈初始化位置与第1组工作寄存器重合,如果以不同的方式使用了同一个内存区域,会导致程序乱套。b)程序中的PUSH和POP没有配对使用,使RET指令执行时不能弹出

正确的断点地址,造成返回错误。c)堆栈设置太小,堆栈操作增长太大,使栈区与其它内存单元重合。思考题:统计正数、负数、零的个数。(一)2.5.(二)1.2.

小橙橙
小橙橙
文档分享,欢迎浏览!
  • 文档 25747
  • 被下载 7
  • 被收藏 0
相关资源
广告代码123
若发现您的权益受到侵害,请立即联系客服,我们会尽快为您处理。侵权客服QQ:395972555 (支持时间:9:00-21:00) 公众号
Powered by 太赞文库
×
确认删除?