第4章汇编语言程序设计主要内容汇编语言的构成汇编语言源程序的设计与汇编简单程序设计与分支程序设计循环与查表程序设计子程序与运算程序设计重点掌握MCS-51单片机的各种形式的汇编语言程序设计的方法.汇编语言的构成4.1.1程序设计语言(1)机器语言(machinelanguage)能为计算机直接识别和执行的机器级的语言.(2)汇编语言(assemblylanguage)由助记符,保留字,伪指令等组成,容易为人们识别,记忆和读写,用来代替机器语言进行程序设计的一种语言.汇编语言不独立于具体的机器.(3)高级语言(high-levellanguage)是面向过程和问题并能独立于机器的通用程序设计语言,是一种接近人们自然语言和常用数学表达式的计算机语言.汇编语言的构成由于计算机只能识别二进制数,所以计算机的指令均由二进制代码组成。为了便于记忆和使用,计算机制造厂对指令系统的每一条指令都给出了助记符。因此,助记符是根据机器指令不同的功能和操作对象来描述指令的符号。这种用助记符形式来表示的机器指令称为汇编语言指令。因此,汇编语言是一种采用助记符表示指令、数据和地址来设计程序的语言。汇编语言的特点①助记符指令和机器指令一一对应。用汇编语言编制的程序,效率高,占用存储空间小,运行速度快。②用汇编语言编程比用高级语言困难。因为汇编语言是面向汇编语言的构成③计算的,程序设计人员必须对计算机有相当深入的了解,才能使用汇编语言编制程序。④汇编语言能直接和存储器及接口电路打交道,也能申请中断。因此,汇编语言程序能直接管理和控制硬件设备。⑤汇编语言缺乏通用性,程序不易移植。各种计算机都有自己的汇编语言,不同实际上的汇编语言之间不能通用。汇编语言的构成4.1.2汇编语言格式MCS-51单片机的汇编语言格式如下:[标号:]操作码助记符[第一操作数][,第二操作数][,第三操作数][;注释](Label)(OPcode)(Operand)(Comment)1、标号:表示指令位置的符号地址,以英文字母开始的由1~6个字母或数字组成的字符串,并以“:”结尾。2、操作码:操作码助记符是表示指令操作功能的英文字母。3、操作数:用于给指令的操作提供数据或地址。4、注释:注释不属于语句的功能部分,只是对每条语句的解释说明。5、分界符(分隔符):冒号,空格,逗号和分号。汇编语言的构成4.1.3汇编语言构成1.指令性语句是指采用指令助记符构成的汇编语言语句,它必须符合汇编语言的语法规则.指令性语句与计算机的指令一一对应.MCS-51有111条指令的助记符语句.2.指示性语句指示性语句又称伪指令语句,简称伪指令.伪指令是在机器汇编时,供汇编程序识别和执行的命令,可以用来对机器的汇编过程进行某种控制,令其进行一些特殊的操作.例如:规定生成的目标代码在内存中的存放区域,为源程序中的符号和标号赋值以及指示汇编的结束.在MCS-51的汇编语言中,常用的伪指令共有8条,现分别介绍如下:汇编语言的构成1、ORG汇编起始命令格式:ORG16位地址如:ORG0100H2、END程序结束命令格式:END3、EQU赋值命令格式:字符名称EQU项(数据、表达式或字符串)说明:(1)字符名称必须以字母开头;(2)用字符表示的数据汇编不能区分立即数和地址,在使用中确定;(3)若定义的是地址或寄存器,可作变量用。汇编语言的构成如:AAEQUR1;其中项是字符串MOVA,AASHUEQU100DELAYEQU07EBHMOVA,SHU;SHU作地址(存储单元)用LCALLDELAYABCEQU30HMOVABC,#46H;#46H→30H,ABC作变量用,;即作地址用MOVR2,ABC;(30H)→R2MOVA,#ABC;#30H→A,ABC作常数用汇编语言的构成4、DATA数据地址赋值命令格式:字符名称DATA表达式(数据或地址)说明:(1)主要用于定义变量或数据;(2)格式中的表达式必须是确定的值;(3)与EQU的区别:①DATA中的表达式不能是字符串;②EQU定义的字符名必须先定义后使用,而DATA定义的字符名可以先使用后定义如:ABCDATA36HMOVABC,#32MOVA,ABC;#32→36H,ABC作变量用MOVR3,#ABC;#36H→R3,ABC作常数用汇编语言的构成5、DB定义字节命令格式:DB数据、数据表或字符串说明:(1)各项用逗号分开;(2)字符串用单引号括起来;(3)数据存入ROM指定的空间。如:ORG2000HDB0A3HLIST:DB26H,03HSTR:DB‘ABC’,’W’,’12345’汇编后2000H~200BH单元的内容是:A3H26H03H41H42H43H75H31H32H33H34H35H汇编语言的构成6、DW定义字命令格式:DW16位数据、数据表说明:(1)各项用逗号分开;(2)先存放高8位,再存放低8位;(3)数据存入ROM指定的空间。如:ORG1500HTABLE:DW7234H,8AH,10H汇编后1500H~1505H单元的内容是:72H34H00H8AH00H10H汇编语言的构成7、DS定义存储空间命令格式:DS表达式(常数)说明:汇编时,从指定地址开始保留一定数量的存储空间。如:ORG1000HDS08HDB30H,8AH汇编后:1000H~1007H单元保留(1008H)=30H(1009H)=8AH汇编语言的构成8、BIT定义位地址符号(位变量)命令格式:字符名BIT位地址如:A1BITP1.0A2BIT02HFLAGRUNBIT08H4.2汇编语言源程序的设计与汇编4.2.1汇编语言源程序的设计步骤(1)拟制设计任务书(2)建立数学模型(3)确立算法(4)绘制程序流程图(5)编制汇编语言源程序(6)上机调试4.2.2汇编语言源程序的汇编1.人工汇编2.机器汇编4.3简单程序设计4.3.1简单程序设计简单程序是指程序中没有使用转移类指令的程序段,机器执行这类程序时也只需按照先后顺序依次执行,中间不会有任何分支,有时称为顺序程序或直线程序.[例4.2]请编写能把20H单元内两个BCD数变换成相应的ASCII码,并放在21H(高位BCD数的ASCII码)和22H(低位BCD数的ASCII码)单元的程序.解:算法:把两个BCD数拆开后,分别加30H即可.相应程序如下:ORG0500HMOVR0,#22HMOV@R0,#00H简单程序设计MOVA,20HXCHDA,@R0ORL22H,#30HSWAPAORLA,#30HMOV21H,ASJMP$END[例4.3]已知一个补码形式的16位二进制数(低8位在NUM单元,高8位在NUM+1单元),试编写能求该16位二进制数原码的绝对值的程序.简单程序设计解:先对NUM单元中低8位取反加1,再把由此产生的进位位加到NUM+1单元的反码上,最后去掉它的最高位(符号位).ORG0300HNUMDATA20HMOVR0,#NUMMOVA,@R0CPLAADDA,#01HMOV@R0,AINCR0MOVA,@R0CPLAADDCA,#00H简单程序设计ANLA,#7FHMOV@R0,ASJMP$END[例4.4]已知20H单元中有一个二进制数,请编程把它转换成3位BCD数,把百位BCD数送入FIRST单元的低4位,十位和个位BCD数放在SECOND单元,十位BCD数在SECOND单元中的高4位.解:方法很多,介绍用除法.ORG0200HFIRSTDATA30HSECONDDATA31H简单程序设计MOVA,20HMOVB,#64HDIVABMOVFIRST,AMOVA,BMOVB,#0AHDIVABSWAPAORLA,BMOVSECOND,ASJMP$END分支程序设计例4.7已知两个带符号数分别存于ONE和TWO单元,试编程比较它们的大小,并把结果存入MAX单元.解:(1)算法利用溢出标志OV的状态来判断若X–Y为正数,则:在OV=0时,XY在OV=1时,XY若X-Y为负数,则:在OV=0时,XY在OV=1时,XY正数-负数=正数;正数-正数=正数;负数-负数=正数.负数-正数=正数正数-正数=负数;负数-正数=负数;负数-负数=负数.正数-负数=负数分支程序设计分支程序设计(2)程序如下:ORG1000HONEEQU30HTWOEQU31HMAXEQU32HCLRCNEG:JBOV,XMAXMOVA,ONEYMAX:MOVA,TWOSUBBA,TWOSJMPDONEJZDONEXMAX:MOVA,ONEJBACC.7,NEGDONE:MOVMAX,AJBOV,YMAXSJMP$SJMPXMAXEND分支程序设计例4.8某系200名学生参加外语统考,若成绩已存放在MCS-51外部RAM起始地址为ENGLISH的连续单元中,现决定给成绩在95~100分之间的学生颁发A级合格证书,在90~94分之间的学生颁发B级合格证书.试编写程序,统计获得A级和B级证书的学生人数,并把统计结果存入内部RAM的GRADA和GRADB单元.解:这是一个循环和分支相结合的程序设计,流程图见书P144页.分支程序设计分支程序设计相应程序为:ORG0600HENGLISHXDATA1000HGRADADATA30HGRADBDATA31HMOVGRADA,#00HMOVGRADB,#00HMOVR2,#0C8HMOVDPTR,#ENGLISHLOOP:MOVXA,@DPTRCJNEA,#5FH,LOOP1LOOP1:JNCNEXT1CJNEA,#5AH,LOOP2分支程序设计LOOP2:JCNEXTINCGRADBSJMPNEXTNEXT1:INCGRADANEXT:INCDPTRDJNZR2,LOOPSJMP$END4.4循环程序设计循环程序特点:程序中含有可以重复执行的程序段,该程序段通常称为循环体.循环程序设计要点:1.循环初始化在循环程序开头,用于完成循环前的准备工作.2.循环处理循环程序所具有的功能的体现程序段.3.循环控制用于控制循环次数.4.循环结束用于循环程序输出结果.循环程序设计循环程序通常有两种编制方法:一种是先循环处理后循环控制(即先处理后判断);另一种是先循环控制后循环处理(即先判断后处理),如图4-7所示.P145例4.9已知内部RAM的BLOCK单元开始有一无符号数据块,块长在LEN单元.请编写求数据块中各数累加和并存入SUM单元的程序.循环程序设计循环程序设计解:(1)先判断后处理程序为:ORG0200HLENDATA20HSUMDATA21HBLOCKDATA22HCLRAMOVR2,LENMOVR1,#BLOCKINCR2SJMPCHECKLOOP:ADDA,@R1INCR1循环程序设计CHECK:DJNZR2,LOOPMOVSUM,ASJMP$END(2)先处理后判断的程序为:ORG0200HLENDATA20HSUMDATA21HBLOCKDATA22HCLRAMOVR2,LEN循环程序设计MOVR1,#BLOCKNEXT:ADDA,@R1INCR1DJNZR2,NEXTMOVSUM,ASJMP$END循环程序设计例4.10已知内部RAMADDR为起始地址的数据块内数据是无符号数,块长在LEN单元内.请编程求数据块中最大值并存入MAX单元.解:以比较交换法为例.比较交换法先使MAX单元清零,然后把它和数据块中每个数逐一进行比较,只要MAX中的数比数据块中某数大就进行下一个数的比较,否则把数据块中的大数传送到MAX单元后再进行下个数的比较,直到数据块中每个数都比较完为止.此时,MAX单元中便可得到最大