您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 述职报告 > 单片机基础(第3版)_第4章 80C51单片机汇编语言程序设计
1机器语言:机器语言是用二进制代码表示的计算机能直接识别和执行的一种机器指令的集合。汇编语言:汇编语言(AssemblyLanguage)是面向机器的程序设计语言。汇编语言源程序:用汇编语言编写的程序.编译程序:编译程序也叫编译系统,是把用高级语言编写的面向过程的源程序翻译成目标程序的语言处理程序。目标程序:把可在计算机上直接运行的机器语言程序称为目标程序.第4章80C51单片机汇编语言程序设计24.1汇编语言的格式4.1.1伪指令(Pseudo—Instruction)在汇编语言源程序中用MCS-51指令助记符编写的程序,一般都可以一一对应地产生机器码,这种指令是真正意义上的指令。如:MOVA,#68H的机器码为74H、68HLJMP2000H的机器码为02H、20H、00H3但还有一些指令不产生机器码,即没有对应的机器码,也就是说它不是CPU能执行的指令,只是提供汇编控制信息,以便在汇编时执行一些特殊的操作,这种指令称为伪指令。如:L1:DB20H没有对应的机器码,但这条伪指令所要完成的功能是将地址为L1的存储单元的内容定义成20H。4伪指令的格式:[标号:]操作码<项或项表>[;注释]其中:方括号为可选项,标号可要可不要;注释是编程者附加的说明,也是可要可不要。尖括号为必选项,可以是单项,也可以是多项操作码为必选项,该项为ORG、DB、DW、DS、EQU、BIT、END等7项中的任意一项。下面分别介绍这些伪指令的功能:51.设置起始地址ORG(Origin)ORG<nn>其中,ORG是该伪指令的操作码助记符,操作数nn是16位二进制数,前者表明为后续源程序经汇编后的目标程序安排存放位置,后者则给出了存放的起始地址值。ORG伪指令总是出现在每段源程序或数据块的开始,它可以使我们把程序、子程序或数据块存放在存储器的任何位置。若在源程序开始不放ORG指令,则汇编将从0000H单元开始编排目标程序。常用的伪指令有如下几种:6【例4-1】ORG2000HMOVSP,#60HMOVR0,#2FHMOVR2,#0FFHORG伪指令说明其后面程序的目标代码在存储器中存放的起始地址是2000H,存储器地址2000H75H81H60HSP的地址=81H2003H78H2FH2005H7AHFFH72.汇编终止命令END[标号:]END[表达式]END命令通知汇编程序结束汇编。在END之后,所有的汇编语言指令均不予以处理。每一个完整的汇编语言源程序的后面必须有END,否则,编译程序在对汇编语言源程序进行编译时,因找不到尾端而无法进行编译。83.赋值EQU(Equate)[标号]EQU<数或者汇编符号>其功能是将操作数段中的地址或数据赋予标号字段的标号,故又称为等值指令。例4-2】SGEQUR0;SG与R0等值DEEQU40H;DE与40H等值MOVA,SG;(R0)→(A)MOVR7,DE;(40H)→(R7)94.定义字节DB(DefineByte)[标号:]DB8位数表其中,8位数表是指一个字节的数、字符串或以引号括起来的ASCII码字符串(一个字符用ASCII码表示,就相当于一个字节)。该指令的功能是把DB后面的内容存入从标号开始的连续单元中。10【例4-4】:ORG1000HSEGl:DB53H,78H,2SEG2:DB'DAY'END则:(1000H)=53H(1001H)=78H(1002H)=32H(1003H)=44H(1004H)=41H(1005H)=59H115.定义数据字DW(defineword)[标号:]DW项或项表DW的基本含义与DB相同,不同的是DW定义16位数据,常用来建立地址表。【例4-3】2200:DWl234H,08H则:(2200H)=12H(2201H)=34H(2202H)=00H(2203H)=08H126.定义存储区DS(DefineStorage)[标号:]DS表达式该指令的功能是由标号指定单元开始,定义一个存储区,以备源程序使用。存储区内预留的存储单元数由表达式的值决定。【例4-5】:ORG3000HSEG;DS08HDB30H,40H上例表示从3000H单元开始,连续预留8个存储单元,然后从3008H单元开始按DB命令给内存单元赋值,即(3008H)=30H,(3009H)=40H。137.位地址符号BIT字符名BIT<位地址>其功能是把位地址赋予字符名称。【例4-6】MNBITPl.7G5BIT02H则汇编后,位地址P1.7、02H分别赋给变量MN和G5。144.1.2汇编语言的格式汇编语言是面向机器的程序设计语言,对于不同CPU的微型机,其汇编语言一般是不同的,但是,它们之间所采用的语言规则有很多相似之处。在此,我们以MCS-51的汇编语言为例来说明汇编语言的规范。汇编语言源程序是由汇编语句(指令语句)构成的。汇编语句由四个部分构成,每一部分称为一个字段,汇编程序能够识别它们。15MCS-51汇编语言的语句格式:[标号:][操作码][操作数][;注释]每个字段之间要用分隔符分开,而每个字段内部不能使用分隔符。可以作为分隔符的符号有空格、冒号、逗号、分号等。16【例4-8】LOOP:MOVA,R0;(R0)→A标号操作码目的操作数源操作数注释下面分别解释这四个字段的含义:1)标号:标号是用户设定的一个符号,表示存放指令的存储单元的地址。标号由以字母开始的1—8个字母或数字串组成,以冒号结尾。不能用指令助记符、伪指令或寄存器名来作标号。标号是任选的,并不是每条指令或数据存储单元都要标号,只在需要时才设标号,例如转移指令所要访问的存储单元前面一般要设置标号。一旦使用了某标号定义一地址单元,在程序的其它地方就不能随意修改这个定义,也不能重复定义。172)操作码:是指令助记符,用来表示指令的性质。对于一条汇编语言指令,这个字段是必不可少的。3)操作数:给出的是参加运算(或其它操作)的数据或数据的地址。操作数可以表示为工作寄存器名、特殊功能寄存器名、标号名、常数、表达式等。这一字段为可选项(可有或可没有)。若有两个操作数(目的操作数和源操作数),两个操作数之间应以逗号分开。目的操作数指数据要到达的目的地,如A。源操作数指数据的来源,如R0。4)注释:注释字段不是汇编语言的功能部分,只是增加程序的可读性,良好的注释是汇编语言程序编写中的重要组成部分。18计算机完成某一具体的工作任务,必须按序执行一条条指令。这种按工作要求编排指令序列的过程称为程序设计(或编程)。用汇编语言编写一个程序的过程大致可分为:①确定计算方法,定出运算步骤和顺序,把运算过程画成框图。②确定数据,包括工作单元的数量,分配存放单元。③按所使用计算机的指令系统,把确定的运算顺序(框图)写成汇编语言程序。194.2.1顺序结构程序顺序结构程序是一种最简单、最基本的程序,按照程序编写的顺序依次执行,编写这类程序主要应注意正确地选择指令,提高程序的执行效率和尽可能节省存储空间。4.2汇编语言程序的基本结构形式20【例4-9】:双字节二进制数求补。BINPL:MOVA,R3JNZACC.7,RETURNMOVA,R2;低位字节补码送R2CPLAADDA,#01HMOVR2,AMOVA,R3MOVF0,ACC.7CPLAADDCA,#00H;高位加进位MOVACC.7,F0MOVR3,A;高位字节补码送R3RETURN:RETEND214.2.2分支程序分支结构程序可根据程序要求无条件或有条件地改变程序执行的顺序,选择程序流向。编写这类结构的程序关键是要正确选择和使用转移指令,即无条件转移、条件转移和跳转。22【例4-10】:设变量x存放在VAR单元之中,函数值y存放在FUNC中,按下式给y赋值:1X0Y=0X=0-1X0将变量X值送入A中,判断A中的内容:若A>0则FUNC=1若A=0则FUNC=0若A<0则FUNC=-123程序框图如下图所示。24程序清单:VAREQU30HFUNCEQU31HSTART:MOVA,VAR;取xJZCOMP;为0转COMPJNBACC.7,POSI;0转POSIMOVA,#0FFH;0,-1→ASJMPCOMPPOSI:MOVA,#01HCOMP:MOVFUNC,AEND25【例4-11】:128种分支转移程序。根据入口条件转移到128个目的地址。程序框图如下:26入口:(R3)=转移目的地址的序号00H~7FH。出口:转移到相应子程序人口。程序清单:MOVA,R3RLAMOVDPTR,#JMPTABJMP@A+DPTRJMPTAB:AJMPROUT00...AJMPROUNT7F27此程序要求128个转移目的地址(ROUT00~ROUT7F)必须驻留在与绝对转移指令AJMP同一个2KB存储区内。RL指令对变址部分乘以2,是由于每AJMP指令占2个字节。如改用LJMP指令,目的地址可以任意安排在64KB的程序存储器空间内,但该指令为3字节,所以程序应对变址部分乘以3。284.2.3循环结构程序在程序设计中,常遇到反复执行某一段程序,此时可用循环程序结构,这有助于缩短程序,提高程序的质量。循环结构的程序一般包括下面几个部分:1.置循环初值置循环初值是设置用于循环过程工作单元的初始值。例如,设置循环次数计数器、地址指针初值、存放和数的单元初值等。2.循环体重复执行的程序段部分。3.循环修改在单片机中,一般用一个工作寄存器Rn作为计数器,给这个计数器赋初值作循环次数,每循环一次,对其进行修改。4.循环控制判断控制变量是否满足终值条件,不满足则转去重复执行循环工作部分,满足则顺序执行,退出循环。29这四个部分有两种组织方式,如下图所示:循环程序流程图30若循环程序的循环体中不再包括循环程序,即为单重循环程序。如果在循环体中还包含有循环程序,那么,这种现象就称为循环嵌套,这样的程序就称为多重循环程序。在多重循环程序中,只允许外循环嵌套内循环程序,而不允许循环体互相交叉。另外,也不允许从循环程序的外部跳人循环程序的内部。【例4-12】:若Xi均为单字节数据,并按i(i=1~n)顺序存放在80C51的内部RAM从50H开始的单元中,n放在R2中,现在要求它们的和(双字节)放在R3R4中。31入口:Xi存放在从50H开始的单元;n放在R2中。出口:和存放于R3R4中。程序框图如右图所示。程序清单如下:ADDl:MOVR3,#00HMOVR4,#00HMOVR2,#nMOVR0,#50HLOOP:MOVA,R4;取部分和低位ADDA,@R0;与Xi相加MOVR4,AINCR0;地址加1CLRAADDCA,R3;低位字节向高位进位MOVR3,ADJNZR2,LOOP;未加完继续重复END32其中:第2~4条为置初值。第5~11条为循环体。R2作为控制变量。第12条为循环控制。注意:R0作为变址单元,用它来寻址Xi。一般来说,循环工作部分中的数据应该用间接方式来寻址。33运算类程序MCS-51系列机中,已设计了单字节的加、减、乘、除指令,而在实际应用程序设计中经常要用到多字节的各种运算,在此举例说明这类程序设计的方法。4.3.1算术运算程序1.加减法运算2.乘法运算3.除法运算4.3实用程序举例34(1)多个不带符号的单字节数相加假设有多个单字节数,依次存放在外部RAM21H开始的连续单元中,要求把计算结果存放在R1和R2中(假定相加的和为2字节数)。其中R1为高位字节,则程序如下:MOVR0,21H;设置数据指针MOVR3,#N;字数MOVR1,#00H;和的高位字节清零MOVR2,#00H;和的低位字节清零LOOP:MOVXA,@R0;取一个加数ADDA,R2;单字节数相加MOVR2,A;和的低8位送R2JNCLOOP1INCR1;有进位,则和的高8位加1LOOP1:INCR0;指向下一个单元DJNZR3,LOOP35(2)两个不带符号的多字节数相减两个N字节数分别存放在内部RAM单元中,低字节在前,高字节在后,分别由R0指定被减数单元地址,由R1指定减数单元地址,其差存放在原被
本文标题:单片机基础(第3版)_第4章 80C51单片机汇编语言程序设计
链接地址:https://www.777doc.com/doc-3563092 .html