单片机原理与接口技术-第4章_第1页
单片机原理与接口技术-第4章_第2页
单片机原理与接口技术-第4章_第3页
单片机原理与接口技术-第4章_第4页
单片机原理与接口技术-第4章_第5页
已阅读5页,还剩89页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第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顺序程序结构

顺序结构程序是最简单的程序结构。程序既无分支、循环,也不调用子程序,程序执行时一条接一条地按顺序执行指令。

0000H011101000001H000000110002H001001000003H000001010004H11111111

FFFFH111111111、循序结构程序的执行过程汇编语言源程序机器语言目标程序

MOVA,#374H03HADDA,#524H05H演示

ABCBDB

ALUFRARPLADR0000H

PCID

A

IR

内部数据线

0000H

01110100输

址0001H

00000011入译0002H

00100100输码0003H

00000101出

器电

FFFFH

11111111路

读写控制0001H返回请单击鼠标!返回请单击鼠标!

ABCBDB

ALUFRARPLADR0000H

0001HPCID

A

IR

内部数据线

0000H

01110100输

址0001H

00000011入译0002H

00100100输码0003H

00000101出

器电

FFFFH

11111111路

读写控制RD返回请单击鼠标!

ABCBDB

ALUFRARPLADR

0001HPCID

A

IR

内部数据线

0000H

01110100输

址0001H

00000011入

0000H译0002H

00100100输码0003H

00000101出

器电

FFFFH

11111111路

读写控制

ABCBDB

ALUFRARPLADR

0001HPCID

A

IR

内部数据线

0000H

01110100输

址0001H

00000011入

0000H译0002H

00100100输码0003H

00000101出

器电

FFFFH

11111111路

RD

读写控制74H返回取第一条指令结束!

ABCBDB

ALUFRARPLADR0001H

PCID

A

IR

内部数据线

0000H

01110100输

址0001H

00000011入译0002H

00100100输码0003H

00000101出

器电

FFFFH

11111111路

读写控制0002H返回请单击鼠标!返回请单击鼠标!

ABCBDB

ALUFRARPLADR0001H

0002HPCID

A

IR

内部数据线

0000H

01110100输

址0001H

00000011入译0002H

00100100输码0003H

00000101出

器电

FFFFH

11111111路

读写控制RD请单击鼠标!返回

ABCBDB

ALUFRARPLADR

0002HPCID

A

IR

内部数据线

0000H

01110100输

址0001H

00000011入

0001H译0002H

00100100输码0003H

00000101出

器电

FFFFH

11111111路

读写控制

ABCBDB

ALUFRARPLADR

0002HPCID

A

IR

内部数据线

0000H

01110100输

址0001H

00000011入

0001H译0002H

00100100输码0003H

00000101出

器电

FFFFH

11111111路

RD读写控制03H返回第一条指令执行完!(1)分析任务(2)确定算法(3)画流程图(4)编写程序(5)上机调试

2、程序设计的一般步骤

当接到程序设计的任务后,首先对任务进行详尽的分析,搞清楚已知的数据和想要得到的结果,程序应该完成何种的功能。明确在程序设计时应该

“做什么”。根据实际问题的要求和指令系统的特点,确定解决问题的具体步骤。根据任务要求,对不同的计算方法进行比较,选择最适宜的算法。解决“怎样做”的问题。将解决问题的具体步骤用一种约定的几何图形、指向线和必要的文字说明描述出来,用图形的方法描绘解决问题的思路。用指令的形式将程序流程图实现出来。查错、改错,对程序进行优化。

50H

51H

52H53H54H55HN1高字节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单元中存放着两个无符号二进制数,要求找出其中的大数并存入ST3单元中。解:(1)分析任务:比较两个数的大小(2)算法:算术运算、控制转移(3)程序结构:单分支(4)数据类型:单字节、二进制、无符号数(5)数据结构:单元地址升序排列

(6)RAM单元安排:外部RAM单元(7)采用寄存器间接寻址方式(R0、R1或DPTR)(8)程序设计流程框图;(9)程序清单;START:CLRC ;进位位清0 MOVDPTR,#ST1 ;设置数据指针

MOVXA,@DPTR ;取第1个数

MOVR2,A ;第1个数存于R2 INCDPTR ;数据指针加1 MOVXA,@DPTR ;取第2个数

SUBBA,R2 ;两数比较

JNCBIG1 ;若第2个数大,则转向BIG1 XCHA,R2 ;若第1个数大,则整字节交换BIG0: INCDPTR MOVX@DPTR,A ;存大数

RETBIG1: MOVXA,@DPTR SJMPBIG0上例中,如果采用CJNEA,direct,rel指令,应如何修改程序?(2)多重单分支结构举例

多重单分支结构中,通过一系列条件判断,进

行逐级分支。为此可使用比较转移指令CJNE实现。

CJNEA,55H,LOOP1 ;若Ta≠T55,则转向LOOP1 AJMPFH ;若Ta=T55,则返回LOOP1: JNCJW;若(CY)=0,表明Ta>T55,转降温处理程序

CJNEA,54H,LOOP2;若Ta≠T54,则转向LOOP2 AJMPFH ;若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)程序清单;

例:已知:127≥X≥-128,求Y。设X,Y分别存放在外部RAM1000H和2000H单元中。返回

XADEQU1000H;

BUFEQU2000H;

ORG1000HSTART:MOVDPTR,#XAD;数据X的地址送数据指针DPTRMOVXA,@DPTR;A←取数据X

JZSAV;

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;

ORG1000HSTART:MOVDPTR,#XAD;数据X的地址送数据指针DPTRMOVXA,@DPTR;A←取数据X

CJNEA,#0,ANZ;

X≠0转ANZSJMPSAV;

ANZ:JC

NEG

;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 ;分支序号送A MOVDPTR,#BRTAB ;地址表首址

MOVCA,@A+DPTR ;查表

JMP@A+DPTR ;转移BRTAB:DBBR0-BRTAB ;地址表

DBBR1-BRTAB

DBBRn-BRTABBR0: … 分支程序BR1: …

BRn: …(2)通过转移指令表实现程序多分支

MOVA,n RLA;分支序号值乘以2 MOVDPTR,#BRTAB;转移指令表首址

JMP@A+DPTRBRTAB: AJMPBR0;转分支程序0 AJMPBR1;转分支程序1

AJMPBR127;转分支程序127BR0: … ;分支程序BR1: …

BRn: …(3)其他实现程序多分支的方法

MOVDPTR,#BRTAB ;分支入口地址表首址

MOVA,R0 RLA ;分支转移值乘以2 MOVR1,A ;暂存A值

INCA MOVCA,@A+DPTR ;取低位地址

PUSHACC ;低位地址入栈

MOVA,R1 ;恢复A值

MOVCA,@A+DPTR ;取高位地址

PUSHACC ;高位地址入栈

RET ;分支入口地址装入PCBRTAB:DWBR0 ;分支程序入口地址表

DWBR1

DWBR127例:假设键盘上有4个按键,功能说明如下表:分析任务确定算法

程序流程框图键功能键值(分支程序序号)键处理程序(分支程序)删除00HER读数据01HDS写数据02HXS插入03HCR

假设转移指令表名称为BRTAB,分支程序序号已在A中。

MOVDPTR,#BRTABCLRCRLCAJMP@A+DPTR;

ORG3000H3000HBRTAB:AJMPER;转删除分支程序3001H3002HAJMPDS;转读数据分支程序3003H3004HAJMPXS;转写数据分支程序3005H3006HAJMPCR;转插入分支程序

ORG3100H3100HER:………………;删除分支程序

ORG3200H3200HDS:………………;读数据分支程序

ORG3300H3300HXS:………………;写数据分支程序

ORG3400H3400HCR:………………;插入分支程序

END(4)使用比较转移指令CJNE实现。4.2.3循环程序结构循环结构是重复执行某个程序段。使用条件转移指令通过条件判断来实现和控制循环。循环程序一般由四个主要部分组成:

(1)初始化部分:为循环程序做准备,如规定循环次数、给各变量和地址指针预置初值。(2)处理部分:为反复执行的程序段,是循环程序的实体,也是循环程序的主体。(3)循环控制部分:其作用是修改循环变量和控制变量,并判断循环是否结束,直到符合结束条件时,跳出循环为止。(4)结束部分:这部分主要是对循环程序的结果进行分析、处理和存放。

MOVR2,#0FFH;设置长度计数器初值

MOVR0,#3FH;设置字符串指针初值LOOP: INCR2 INCR0 CJNE@R0,#0DH,LOOP RET举例:通过查找结束标志(回车符)以统计字符串长度的循环程序。假定字符串存放在内部RAM从40H单元开始的连续存储单元中。为找到结束标志,应采用逐个字符依次与回车符(ASCII码0DH)比较的方法。同时在程序中还应设置一个字符串指针以顺序定位字符,设置一个字符长度计数器以累计字符个数。单循环程序一般有以下两种典型结构:双重循环程序的结构:解:(1)分析任务:数据传送;(2)算法:比较、控制转移(3)程序结构:分支、循环(4)数据类型:多字节字符串

(5)RAM单元安排:内部RAM单元、外部RAM单元(6)采用寄存器间接寻址方式(R0、R1或DPTR)例:把内部RAM中起始地址为DATA的数据串传送到外部

RAM以BUFFER为首地址的区域,直到发现“$”字符的ASCⅡ码为止,同时规定数据串最大长度为32个字节。(7)程序流程框图;

ORG0030HDATACS:MOVR0,#DATA;DATA数据区首地址

MOVDPTR,#BUFFER;BUFFER数据区首地址

MOVR1,#20H;最大数据串长

LOOP:MOVA,@R0;取数据

SUBBA,#24H;判是否为“$”字符

JZLOOP1;是“$”字符,转结束

MOVXA,@R0;

MOVX@DPTR,A;数据传送

INCR0;

INCDPTR;

DJNZR1,LOOP;循环控制

LOOP1:RET;

结束

END【补充程序】存储器清零程序。假设在内部RAM区,开辟96个工作单元,工作单元首地址为20H,则工作单元清零程序子程序如下:思考题:如采用CJNE指令,应如何修改程序?解:

ORG1000HCLR0:MOVR0,#20H;循环初始化部分

MOVR7,#96;

CLRALOOP:MOV@R0,A;循环体部分

INCR0;修改变量

DJNZR7,LOOP;循环控制部分

RETENDDECR7CJNER7,#00H,LOOP;例:两个三字节二进制无符号数相加,被加数放在内部RAM50H~52H单元(低字节存放在高地址单元,高字节存放在低地址单元,即低位在前,高位在后),加数放在53H~55H单元,和放在50H~52H单元,最高位如有进位,则放在23H单元中。被加数(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位)返回程序流程框图

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

LOOP:MOVR4,#TEME2;

LOOP1:NOP;

NOP;

DJNZR4,LOOP1;

DJNZR5,

LOOP2;

RET;

这个定时子程序的最长定时时间为:

[256(28)×4+2+1]×256(28)×2+4=525828(μs)(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;

DJNZR0,

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

MOVR0,#05H;5S定时LOOP:LCALLDELAY;

DJNZR0,LOOP1;┋

MOVR0,#0AH;10S定时LOOP2:LCALLDELAY;

DJNZR0,LOOP2;┋

MOVR0,#14H;20S定时LOOP3: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和DPTR的状态下,只根据A的内容就可以取出表格中的数据。注意:A的内容均为8位无符号数。适用于64KBROM范围内查表,一个数据表格可以被多个程序块使用。编写查表程序时,首先把表的首地址送入DPTR中,再将要查表的数据序号(或下标值)送入A中,然后就可以使用该指令进行查表操作,并把结果送A中。常用于“本地”范围查表(数据表格只能放在该指令后面256个地址单元之内,而且表格只能被本程序使用)。编写查表程序时,首先把查表数据的序号送入A中,再把从查表指令的下一条指令的首地址到表的首地址间的偏移量与A值相加,然后再使用该指令进行查表操作,并把结果送入A中。

ORG1000H1000HSQR: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,0F9H,0A4H,0B0H;0,1,2,3DB99H,92H,82H,0F8H;4,5,6,7

DB80H,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)的十六进制数的字形代码从8101H地址单元开始存放。

b)使用0RG命令专门规定。例:ORG8100HTAB:DB0COH,0F9H,0A4H,0B0H;┋

定义的7段数码管(共阳极)显示的十六进制基数(0~F)的十六进制数的字形代码从8100H地址单元开始存放。5.定义数据字命令DW(DefineWord)本命令用于从指定地址开始,在程序存储器单元中定义16位的数据字。

命令格式:[〈标号:〉]DW〈16位数表〉

存放时,数据字的高8位在前(低地址),低8位在后(高地址)。

例如,DW“AA” ;存入41H,41H DW“A” ;存入00H,41H DW“ABC” ;不合法,因超过两字节

DW100H,1ACH,-804;按顺序存入01H、00H、01H、

0ACH、0FCH、0DCH

DB和DW定义的数表,数的个数不得超过80个。如数据的数目较多时,可使用多个定义命令。在MCS-51程序设计应用中,常以DB来定义数据,以DW来定义地址。6.定义存储区命令DS(DefineStonage)该命令用于从指定地址开始,在程序存储器中保留指定数目的单元作为预留存储区,供程序运行使用。源程序汇编时,对预留单元不赋值。命令格式为:[<标号:>]DS<16位数表>例如:ADDRTABL:DS20 ;从标号ADDRTABL代表的地址开始,预留20个连续的地址单元

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

子程序结构是一种非常重要的程序结构。在一个程序中经常遇到反复多次使用某程序段的情况,如果重复书写这个程序段,会使程序变得冗长而杂乱。对此,可采用子程序结构,即把重复的程序段编写为一个子程序,通过主程序调用而使用它。这样不但减少了编程工作量,而且也缩短了程序的长度。

调用和返回构成了子程序调用的完整过程。为了实现这一过程,必须有子程序调用指令和返回指令。调用指令在主程序中使用,而返回指令则应该是子程序的最后一条指令。执行完这条指令后,程序返回主程序断点处继续执行。(1)子程序的编程原则在实际的单片机应用系统软件设计中,为了程序结构更加清晰,易于设计,易于修改,增强程序可读性,基本上都要使用子程序结构。子程序作为一个具有独立功能的程序段,编程时需遵循以下原则:

a)子程序的第一条指令必须有标号,明确子程序入口地址;

b)以返回指令RET结束子程序;

c)子程序说明部分;

子程序名称:提供给主程序调用的名字,通常用符号或子程序第一条语句的标号来表

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论