51汇编基础Word文档格式.docx
《51汇编基础Word文档格式.docx》由会员分享,可在线阅读,更多相关《51汇编基础Word文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
将高级语言源程序转换成目标程序、可执行程序(文件)的过程。
例如C语言的工作方式。
■解释:
执行高级语言程序的另一种方式,逐条语句进行解释(生成该语句对应的机器码加以执行),但不生成目标程序。
例如BASIC语言的工作方式。
汇编语言程序具有运算效率高、目标程序小、占用内存少等特点,故在微处理器组成的测控系统中常采用汇编语言。
缺点:
各种微处理器有各自的指令系统,程序不能互换。
四、汇编语言的指令格式(已在第三章中讲解,在此做简要说明)
{[标号]:
操作码助记符[第一操作数][,第二操作数][,第三操作数][;
注释]
■标号是用符号表示的该指令在程序存储器中的地址,汇编源程序经汇编后标号将对应具有确定的数值(地址)。
标号一般是由字母打头的字母数字串(长度≤8)。
■操作码表示指令要实现的操作,用助记符表示。
例如:
MOV、ADD、等。
■操作数表明了操作的对象,根据不同的操作码(指令功能),指令中的操作数可以有一、二、三个,也可能没有操作数。
源操作数——操作时的操作对象。
目的操作数——操作的结果。
在单、双操作数指令中,通常指的是靠近操作码(左边)的那个操作数。
在MCS-51中,有时目的操作数与某个源操作数相同。
■注释部分是用户为了方便阅读程序所加的说明,可有可无。
}
第二节伪指令
伪指令:
不被计算机执行的指令。
它们仅对汇编过程其辅助作用,对汇编过程进行控制。
汇编时伪指令不生成机器码。
一、设置目标程序在程序存储器中起始位置伪指令ORG
格式:
ORGaddr16
功能:
指定此指令后的汇编程序所对应的目标程序代码在程序存储器中的存放地址。
例:
ORG2000H
MOVA,20H(机器码:
E520)
…
程序存储器中,(2000H)=E5H;
(2001H)=20H;
……。
说明:
■一个汇编程序中可以多次使用ORG指令,以按用户的意愿将不同模块的程序存放在程序存储器的不同区域中。
但一般应保证按程序的自然次序Add16从小到大,且应使汇编后各部分不发生重叠(举例说明)。
■程序的开始一般应设置一ORG指令,否则将默认为ORG0000H。
■注意:
在使用子程序或中断系统时,应通过ORG指令使主程序的存放区域避开中断向量区及子程序区。
二、汇编结束伪指令END
[标号:
]END
结束汇编过程。
遇到END指令后,汇编系统将不对其后的程序进行汇编。
特别注意:
END一定要放在程序(包括子程序等)的最后!
(这一点不同于C、BASIC语言中的END)
三、等(赋)值伪指令EQU
字符符号EQU常量或符号
给指令中的字符符号赋予由后面的常量或符号所对应的值(包括数值或字符串)。
一旦定义后,后面的程序中可以使用该字符符号代替对应的常量或符号。
因此,所有EQU指令一般均放在程序的最开始处。
TIMESEQU#10H
AAEQUR6
MOVAA,TIMES
DELAYEQU1234H
FLAGEQU0D0H(FLAG等同于PSW)
四、定义字节伪指令DB
]DB8位二进制数表
从标号指定的地址开始,连续定义若干个存储单元(字节)的内容(若无标号或ORG指令则表示从当前地址顺序存放)。
汇编后这些内容将在写EPROM时存放在指定的单元中。
该指令用来在程序存储器中存放一些必要的常量(如字形码等)。
ORG1000H
TAB:
DB23H,73,“6”,“B”
TAB1:
DB110B
若给出的内容为字符(”6”、”B”),则该指令将把该字符所对应的ASCII码存放到给定的单元。
五、定义字伪指令DW
]DW16位二进制数表
从标号指定的地址开始,连续定义若干个存储单元(字)的内容(若无标号或ORG指令则表示从当前地址顺序存放)。
该指令与DB功能相似。
1234H,0ABH,“MN”
注意:
存放数据时,低地址存放高8位,高地址存放低8位。
上面的结果为:
(2000H)=12H;
(2001H)=34H;
(2002H)=00H;
(2003H)=0ABH
(2004H)=4DH;
(2005H)=4EH(M、N的ASCII码)
六、预留存储区伪指令DS
]DS表达式
从给定的标号地址、或ORG定义的地址、或本条指令的顺序地址开始,预留出由表达式之值确定的数个单元,供程序后用。
BUFF:
DS06H
CNT:
MOVA,#30H
汇编后,从2000H开始,保留6个连续的存储单元,因此第三条指令的起始存放地址(标号CNT所对应的地址)为2006H。
注意:
伪指令DB、DW、DS都只对程序存储器起作用,不能用它们对数据存储器的内容进行赋值或其他初始化工作。
七、位地址定义伪指令BIT
字符符号BIT位地址
用指定的字符符号代替指令中的位地址,在后面的程序中可用该符号表示对应的位地址。
A1BITP1.0
A2BITAcc.7
A3BIT20H.7
CLRA1
SETBA3
第三节汇编方式与汇编过程
汇编的方式有两种:
人工汇编和机器汇编。
第四节单片机汇编语言程序设计步骤与方法
1.问题分析
2.程序总体结构设计,确定算法
一般采用模块化设计,即主程序加若干功能子程序的结构。
MCS-51的许多算法都已模块化了,可直接作为子程序使用。
注意算法对执行速度、所需存储单元数量、代码长度的影响。
3.画程序的流程图
根据任务及确定的程序结构、算法画流程图,是所有程序设计的基本步骤。
下图为流程图绘制过程中常用的图形符号(教材中的不标准)。
4.规划存储器
为提高存储器的使用效率及方便性,同时考虑今后二次开发的需要,必须在编写程序之前对存储器做合理的规划,必要时应列表说明。
对照下图对程序存储器(ROM)规划、数据存储器(RAM)规划加以简要说明。
5.编写程序,实现任务
用指令对流程图中的各部分加以具体实现。
注意实际应用程序中还要考虑增加可靠性程序(测试程序、软件陷阱、看门狗等)。
6.调试与汇编
一般按模块调试。
特别注意子程序的出、入口参数要求,主程序与子程序的参数冲突。
一般采用机器汇编。
7.程序固化
一般使用专门的EPROM写入器。
对EEPROM及FlashROM、片内固化的ROM请参阅有关资料。
第五节结构化程序模块设计
在单片机程序设计过程中,有一些典型程序结构是经常用到的,例如顺序结构、循环结构、分支结构、子程序结构等。
下面将对比较常用的几种结构模块设计做以简述。
一、顺序结构程序设计
顺序结构程序是一种无分支的直线结构程序,即程序的执行是按PC自动加1的顺序进行的。
有关情况及示例程序参阅教材。
二、循环结构程序设计
所谓循环,指的是多次重复执行一组相同的操作。
在MCS-51中,主要利用各种条件转移指令进行循环控制,如DJNZ、CJNZ、JZ、JNZ、JC、JNC等。
设计循环结构程序时,主要应注意以下几个问题:
■循环程序参数的初始化:
规划循环变量、设置循环次数、累加器清零等。
■循环体设计:
即重复执行的指令。
■循环控制:
确定循环条件,何种条件下循环进行、结束。
■循环嵌套。
举例:
例1.教材P108例7-9
设从片内数据存储器30H单元开始存有10H个无符号数据,试求出数据块中最大的数,并存人40H单元。
分析:
寻找最大值的方法是把第一个数据作为基准数,即最大数,依次取第二个数、第三个数…与之比较,若比较结果是基准数较小,则用较大的数代替原来的基准数,这样一直将数据块搜索完毕,找到最大值,程序如下:
MOVR7,#0FH;
比较次数
MOVR1,#30H;
地址指针置初值
MOVA,@R1;
用第一个数作为最大数
LOOP:
CLRC;
清C准备相减
INCR1;
指向下一个数据
SUBBA,@R1;
用减法进行比较
JNCNEXT;
A>
((R))则转移
A<
(((R1))则用当前数据替换前最大数
SJMPNEXTl
NEXT:
ADDA,@R1;
恢复A
NEXTl:
DJNZR7,LOOP;
循环结束条件
MOV40H,A
例2.有一数据块从片内RAM的30H单元开始存入,设数据块长度为10个单元。
根据下式:
求出值,并将值放回原处。
参考程序如下:
ORG2000H
MOVR0,#10
MOVR1,#30H
START:
MOVA,@R1;
取数
JBACC.7,NEG;
若为负数,转NEG
JZZER0;
若为零,转ZER0
ADDA,#02H;
若为正数,求X+2
AJMPSAVE;
转到SAVE,保存数据
ZER0:
MOVA,#64H;
数据为零,Y=100
AJMPSAVE;
NEG:
DECA;
求∣X∣(减1后取反)
CPLA
SAVE:
MOV@R1,A;
保存数据
INCR1;
地址指针指向下一个地址
DJNZR0,START;
数据未处理完,继续处理
SJMP$;
暂停
三、分支、散转结构程序设计
分支结构程序就是条件判断分支程序,即根据不同的条件,执行不同的程序段。
分支程序的设计要点如下:
■确定分支条件。
■选用合适的条件转移指令。
①判累加器A是否为零指令JZ和JNZ;
②比较条件转移指令CJNE、DJNZ;
③判进位标志指令JC和JNC;
④判位条件转移指令JB和JNB等。
■正确选定转移的目标地址,一般在转移的目的地址处设定标号。
1.无条件分支程序——程序设计者事先设计好的分支结构(也称为散转结构)
经常使用指令LJMP、AJMP、SJMP、JMP(@A+PC、@A+DPTR)。
★使用转移指令表的散转程序
根据R2的内容,转向不同的处理程序:
(R2)=0:
转向PROG0
(R2)=1:
转向PROG1
……
(R2)=n:
转向PROGn
参考程序:
MOVDPTR,#TABJ;
指向散转指令表首址
MOVA,R2;
读R2的内容
RLA;
由于散转指令AJMP占用2字节,因此将A的内容
乘2,以便于执行JMP@A+DPTR指令
JNCNADD;
若(A)>
255则使TABJ翻到下一页,否则顺序执行
INC