版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章汇编语言程序设计主要内容汇编语言的构成汇编语言源程序的设计与汇编简单程序设计与分支程序设计循环与查表程序设计子程序与运算程序设计重点掌握MCS-51单片机的各种形式的汇编语言程序设计的方法.汇编语言的构成4.1.1程序设计语言(1)机器语言(machinelanguage)能为计算机直接识别和执行的机器级的语言.(2)汇编语言(assemblylanguage)由助记符,保留字,伪指令等组成,容们识别,记忆和读写,用来代替机器语言进行程序设计的一种语言.汇编语言不独立于具体的机器.(3)高级语言(high-levellanguage)是面向过程和问题并能独立于机器的通用程序设计语言,是一种接近人们自然语言和常用数学表达式的计算机语言.汇编语言的构成由于计算机只能识别二进制数,所以计算机的指令均由二进制代码组成。为了便于记忆和使用,计算机制造厂对指令系统的每一条指令都给出了助记符。因此,助记符是根据机器指令不同的功能和操作对象来描述指令的符号。这种用助记符形式来表示的机器指令称为汇编语言指令。因此,汇编语言是一种采用助记符表示指令、数据和地址来设计程序的语言。汇编语言的特点①助记符指令和机器指令一一对应。用汇编语言编制的程序,效率高,占用存储空间小,运行速度快。②用汇编语言编程比用高级语言困难。因为汇编语言是面向汇编语言的构成③计算的,程序计算机有相当深入的了解,才能使用汇编语言编制程序。④汇编语言能直接和存储器及接口电路打交道,也能申请中断。因此,汇编语言程序能直接管理和控制硬件设备。⑤汇编语言缺乏通用性,程序不。各种计算机都有自己的汇编语言,不同实际上的汇编语言之间不能通用。汇编语言的构成4.1.2汇编语言格式MCS-51单片机的汇编语言格式如下:[标号:]操作码助记符[第一操作数][,第二操作数][,第三操作数][;注释](Label)(OPcode)(Operand)ment)1、标号:表示指令位置的符号地址,以英文字母开始的由1~6个字母或数字组成的字符串,并以“:”结尾。2、操作码:操作码助记符是表示指令操作功能的英文字母。3、操作数:用于给指令的操作提供数据或地址。4、注释:注释不属于语句的功能部分,只是对每条语句的解释说明。5、分界符(分隔符):冒号,空格,逗号和分号。汇编语言的构成4.1.3汇编语言构成1.指令性语句是指采用指令助记符构成的汇编语言语句,它必须符合汇编语言的语法规则.指令性语句与计算机的指令一一对应.MCS-51有111条指令的助记符语句.2.指示性语句指示性语句又称伪指令语句,简称伪指令.伪指令是在机器汇编时,供汇编程序识别和执行的命令,可以用来对机器的汇编过程进行某种控制,令其进行一些特殊的操作.例如:规定生成的目标代码在内存中的存放区域,为源程序中的符号和标号赋值以及指示汇编的结束.在MCS-51的汇编语言中,常用的伪指令共有8条,现分别介绍如下:汇编语言的构成1、ORG汇编起始命令格式:ORG16位地址
如:ORG0100H
2、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时,X>Y在OV=1时,X<Y若X-Y为负数,则:在OV=0时,X<Y在OV=1时,X>Y正数-负数=正数;正数-正数=正数;负数-负数=正数.负数-正数=正数正数-正数=负数;负数-正数=负数;负数-负数=负数.正数-负数=负数分支程序设计分支程序设计(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单元中便可得到最大值.循环程序设计相应程序为:ORG0300HLENDATA20HMAXDATA22HMOVMAX,#00HMOVR0,#ADDRLOOP:MOVA,@R0CJNEA,MAX,NEXT1NEXT1:JCNEXTMOVMAX,ANEXT:INCR0DJNZLEN,LOOPSJMP$END循环程序设计例4.11设有10组3字节被加数和加数,分别存放在以BLOCK1和BLOCK2为起始地址的两个数据块中.请编程求10组数的和(设和仍为3字节),并把和送回以BLOCK1为起始地址的数据块中.解:这是一个双重循环问题.内循环用于完成3字节被加数和加数的求和,外循环用于控制10组3字节数的求和是否完成,程序流程如图4-9所示.P148循环程序设计循环程序设计相应的程序为:ORG1000HBLOCK1EQU20HBLOCK2EQU40HMOVR0,#BLOCK1MOVR1,#BLOCK2MOVR2,#0AHLOOP:MOVR3,#03HCLRCLOOP1:MOVADDCMOV@R0,AINCR0循环程序设计
INCR1DJNZR3,LOOP1DJNZR2,LOOPSJMP$END查表程序设计在况下,本来通过计算才能解决的问题,也可以改用查表方法解决,而且要简便得多.因此,在实际单片机应用中,常常需要编制查表程序以缩短程序长度并提高程序执行速度.使用的指令为:
MOVCA,@A+DPTRMOVCA,@A+PC例4.13已知R0低4位有一个十六进制数(0~F中的一个),请编写能把它转换成ASCII码并送入R0的程序.解:采用查表法.查表程序设计(1)使用MOVCA,@A+DPTR指令的程序为:ORG1000HMOVDPTR,#ASCTABMOVA,R0ANLA,#0FHMOVCA,@A+DPTRMOVR0,ASJMP$ASCTAB:DB‘0’,‘1’,‘2’,‘3’,‘4’DB‘5’,‘6’,‘7’,‘8’,‘9’DB‘A’,‘B’,‘C’,‘D’,‘E’,‘F’END查表程序设计(2)使用MOVCA,@A+PC指令,程序为:ORG1000HMOVA,R0ANLA,#0FH
ADDA,#03HMOVCA,@A+PCMOVR0,ASJMP$ASCTAB:DB‘0’,‘1’,‘2’,‘3’,‘4’DB‘5’,‘6’,‘7’,‘8’,‘9’DB‘A’,‘B’,‘C’,‘D’,‘E’,‘F’END查表程序设计例4.14已知BLOCK1为起始地址的数据块(数据块长度在LEN单元),数据块中每个存储单元中的高.低4位分别为两个十六进制数,请通过编程把它们相应的ASCII码,并放在从BLOCK2开始的连续存储单元(低4位ASCII码在前,高4位ASCII码在后).解:相应的程序为:ORG1000HLENEQU20HBLOCK1EQU21HBLOCK2EQU51HMOVR0,#BLOCK1MOVR1,#BLOCK2MOVDPTR,#ASCTAB查表程序设计LOOP:MOVA,@R0ANLA,#0FHMOVCA,@A+DPTRMOV@R1,AMOVA,@R0SWAPAANLA,#0FHMOVCA,@A+DPTRINCR1MOV@R1,AINCR0INCR1DJNZLEN,LOOP查表程序设计
SJMP$ASCTAB:DB‘0’,‘1’,‘2’,‘3’,‘4’DB‘5’,‘6’,‘7’,‘8’,‘9’DB‘A’,‘B’,‘C’,‘D’,‘E’,‘F’END例4.15设有一起始地址为DTATAB的数据表格,表中存放有1024个元素,每个元素为二字节.请编写能根据R5.R4中元素的序号查找对应元素并放入R5.R4(R5中为高8位,R4为低8位)的程序.解法:由于数据表格内的每个元素为2字节,故R5.R4中的元素序号应扩大两倍后在与DPTR中的数据表格起始地址DTATAB相加,以获得数据元素的绝对地址.查表程序设计
ORG1000HSTART:MOVDPTR,#DTATABMOVA,R4CLRCRLCAXCHA,R5RLCAXCHA,R5ADDA,DPLMOVDPL,AMOVA,DPHADDCA,R5MOVDPH,A查表程序设计
CLRAMOVCMOVR5,AMOVA,#01HMOVCA,@A+DPTRMOVR4,ARETDTATAB:DW…DW…..END4.5子程序设计与运算程序设计4.5.1子程序设计所谓子程序是指完成确定任务并能为其他程序反复调用的程序段.调用子程序的程序叫做主程序或称调用程序.在工程上,几乎所有实用程序都是由程序构成的.子程序在结构上应具有通用性和独立性,在编写子程序时应注意以下问题:(1)子程序的第一条指令地址称为子程序的入口地址.(2)主程序调用子程序是通过安排在主程序中的调用指令实现的,子程序返回主程序必须执行在子程序末尾的一条RET指令.(3)主程序调用子程序以及从子程序返回主程序后,计算机能自动保护并恢复主程序的断点地址.现场须保护.(4)为使所编子程序可以放在64KB内存的任何子域,并能被子程序设计主程序调用,子程序必须使用相对转移指令,而不使用其他转移指令,以便汇编时生成浮动代码.(5)子程序参数可以分为入口和出口参数.传递子程序参数的方法通常有以下4种:①利用寄存器或片内RAM传送子程序参数②利用寄存器传送子程序参数的地址③利用堆栈传送子程序参数④利用位地址传送子程序参数例4.16设MDA和MDB内有两个数a和b,请编写c=axa+bxb并把c送入MDC的程序,设a和b均为小于10的整数.子程序设计解:本程序由两部分组成:主程序和子程序.ORG1000HMDAEQU20HMDBEQU21HMDCEQU22HMOVA,MDAACALLSQRMOVR1,AMOVA,MDBACALLSQRADDA,R1MOVMDC,ASJMP$子程序设计SQR:ADDA,#01HMOVCA,@A+PCRETSQRTAB:DB0,1,4,9,16,25,36,49,64,81END例4.17在HEX单元中存有两个十六进制数,试通过编程分别把它们转换成ASCII码存入ASC和ASC+1单元.解:利用堆栈传递参数.ORG1000HMOVSP,#50HPUSHHEXACALLHASCPOPASC子程序设计
MOVA,HEXSWAPAACALLHASCPOPASC+1SJMP$HASC:DECSPDECSPPOPACCANLA,#0FHADDA,#07HMOVCA,@A+PCPUSHACCINCSP子程序设计
INCSPRETASCTAB:DB‘0’,’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’DB‘9’,’A’,’B’,’C’,’D’,’E’,’F’END例4.18已知片内RAM中有一五位BCD码(高位在前,低位在后),最大不超过65535,起始地址在R0中,BCD码位数减1(04H)已在R2中.请编写把BCD码转换为二进制整数并存入R4R3(R4中为高8位)中的程序.ORG0800HBCDB:PUSHPSWPUSHACCPUSHB子程序设计
MOVR4,#00HMOVA,@R0MOVR3,ALOOP:MOVA,R3MOVB,#10MULABMOVR3,AMOVA,#10XCHA,BXCHA,R4MULAB子程序设计
ADDA,R4XCHA,R3INCR0ADDXCHA,R3ADDCA,#00HMOVR4,ADJNZR2,LOOPPOPBPOPACCPOPPSWRET运算程序设计运算程序可分为浮点数运算程序和定点数运算程序两大类.浮点数运算程序较复杂;定点数运算程序较简单.这里只介绍定点数运算程序.运算程序通常编成子程序的形式,以供主程序在需要时调用.1.加减运算程序设计可为为无符号数运算和有符号数运算程序设计.(1)无符号运算例4.19已知以RAMBLOCK1和BLOCK2为起始地址的存储区中分别有5字节无符号被减数和减数(低位在前,高位在后).请编写减法子程序令它们相减,并把差放入以BLOCK1为起始地址的存储单元.运算程序设计解:ORG0A00HSBYTESUB:MOVR0,#BLOCK1MOVR1,#BLOCK2MOVR2,#05HCLRCLOOP:MOVA,@R0SUBBA,@R1MOV@R0,AINCR0INCR1DJNZR2,LOOPRETEND运算程序设计例4.20设在BLOCK和BLOCK+1单元中有两个补码形式的带符号数.请编出求两数之和并把它放在SUM和SUM+1单元(低8位在SUM单元)的子程序.解:ORG0100HSBSHACCPUSHPSWMOVPSW,#08HMOVR0,#BLOCKMOVR1,#SUMMOVR2,#00HMOVR3,#00HMOVA,@R0运算程序设计
JNBACC.7,POS1MOVR2,#0FFHPOS1:INCR0MOVB,@R0JNBB.7,POS2MOVR3,#0FFHPOS2:ADDA,BMOV@R1,AINCR1MOVA,R2ADDCA,R3运算程序设计
MOV@
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 病毒病阻断防控技术方案
- 理疗师专业技术考核标准文件
- 冷藏库果蔬储藏管理操作规范
- 中频电疗操作技术规范
- 中医推拿手法操作规范指南
- 肉鸡生长阶段光照强度调控方案
- 班前会安全交底开展指导手册
- 茶叶加工车间卫生清洁管理制度
- 肉鸭圈养管理与疾病防控方案
- 危险化学品重大危险源辨识指南
- 专题提升Ⅰ 杠杆平衡问题(解析版)
- 现代西班牙语A1课后翻译
- 《碳排放管理体系建设与评价指南》
- 装配式建筑装饰装修技术 课件 模块一 装配式装修概述
- FZ∕T 93043-2012 棉纺并条机行业标准
- 高铁火车工作原理
- MOOC 英国小说-南京大学 中国大学慕课答案
- 《旅游法规》课件-第25讲 旅行社责任保险分析
- MOOC 隔网的智慧-乒羽两项-西南交通大学 中国大学慕课答案
- JTT327-2016 公路桥梁伸缩装置通用技术条件
- 高中化学选择性必修3 教材习题答案
评论
0/150
提交评论