51汇编语言程序设计_第1页
51汇编语言程序设计_第2页
51汇编语言程序设计_第3页
51汇编语言程序设计_第4页
51汇编语言程序设计_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

1、第四章-汇5编1语言程序设计重点及难点:单片机汇编语言程序设计的基本概念、伪指令、单片机汇编语言程序的三种基本结构形式、常用汇编语言程序设计。教学基本要求:1、掌握汇编语言程序设计的基本概念;2、掌握伪指令的格式、功能和使用方法;3、掌握顺序结构、分支结构和循环结构程序设计的步骤和方法4、掌握常用汇编语言程序设计步骤和方法。教学内容4.1汇编语言程序设计概述一、汇编语言的特点(1)助记符指令和机器指令一一对应,所以用汇编语言编写的程序效率高,占用存储空间小,运行速度快,因此汇编语言能编写出最优化的程序。(2)使用汇编语言编程比使用高级语言困难,因为汇编语言是面向计算机的,汇编语言的程序设计人员

2、必须对计算机硬件有相当深入的了解。(3)汇编语言能直接访问存储器及接口电路,也能处理中断,因此汇编语言程序能够直接管理和控制硬件设备。(4)汇编语言缺乏通用性,程序不易移植,各种计算机都有自己的汇编语言,不同计算机的汇编语言之间不能通用;但是掌握了一种计算机系统的汇编语言后,学习其他的汇编语言就不太困难了。二、汇编语言的语句格式标号:操作码操作数;注释三、汇编语言程序设计的步骤与特点(1)建立数学模型(2)确定算法(3)制定程序流程图(4)确定数据结构(5)写出源程序(6)上机调试程序4.2伪指令伪指令是程序员发给汇编程序的命令,也称为汇编命令或汇编程序控制指令MCS-51常见汇编语言程序中常

3、用的伪指令:第四章MCS-51汇编语言程序设计 1ORG(ORiGin)汇编起始地址命令标号:ORG地址2END(ENDofassembly)汇编终止命令标号:END表达式3EQU(EQUate)赋值命令字符名称EQU赋值项4DB(DefineByte)定义字节命令标号:DB8位数表5DW(DefineWord)定义数据字命令标号:DW16位数表6DS(DefineStonage)定义存储区命令标号:DW16位数表BIT位定义命令字符名称BIT位地址DATA数据地址赋值命令字符名称DATA表达式4.3单片机汇编语言程序的基本结构形式一、顺序程序例4-1三字节无符号数相加,其中被加数在内部RAM

4、的50H、51H和52H单元中;加数在内部RAM的53H、5414和55H单元中;要求把相加之和存放在50H、51H和52H单元中,进位存放在位寻址区的00H位中。MOVR0,#52H;被加数的低字节地址MOVR1,#55H;加数的低字节地址MOVA,R0ADDA,R1;低字节相加MOVR0,A;存低字节相加结果DECR0DECR1MOVA,R0ADDCA,R1;中间字节带进位相加MOVR0,A;存中间字节相加结果DECR0DECR1MOVA,R0ADDCA,R1;高字节带进位相加MOVR0,A;存高字节相加结果CLRAADDCA,#00H;存放进位的单元地址MOVR0,A;进位送00H位保存

5、二、分支程序1单分支程序例4-2变量X存放在VAR单元内,函数值Y存放在FUNC单元中,试按下式的要求给Y赋值。1X0Y=0,则转POSIMOVA,#0FFH;若X0,则Y=1DONE:MOVEFUNC,A;存函数值SJMP$END图4-1例4-2的分支流程图第四章MCS-51汇编语言程序设计 这个程序的特征是先比较判断,然后按比较结果赋值,这实际是三分支而归一的流程图,因此,至少要用两个转移指令。初学者很容易犯的一个错误是:漏掉了其中的SJMPDONE语句,因为流程图中没有明显的转移痕迹。这个程序也可以按图4-1(b)的流程图来编写,其特征是先赋值,后比较判断,然后修改赋值并结束。参考程序:

6、ORG1000HVARDATA30HFUNCDATA31HMOVA,VAR;AXJZDONE;若X=0,则转DONEMOVR0,#0FFH;先设X0,R0=FFHJNBACC.7,NEG;若X0,R0=1NEG:MOVA,#01H;若X0,则Y=1DONE:MOVFUNC,A;存函数值SJMP$END2多分支程序K=Q三、循环程序循环程序一成(1)直循即确(2)循环转向要分支(3)循环(4)循环控制部分,根据循环结束条件,判断是否结束循环。以上4个部分可以有两种组织方式。例4-3从BLOCK单元开始存放一组无符号数,一般称为一个数据块。数据块长度放在LEN单元,编写一个求和程序,将和存入SUM

7、单元,假设和不超过8位二进制数。在置初值时,将数据块长度置入一个工作寄存器,将数据块首地址送入另一个工作寄存器,一般称它为数据块地址指针。每做一次加法之后,修改地址指针,以便取出下一个数来相加,并且使计数器减1。到计数器减到0时,求和结束,把和存入SUM即可。参考程序:各单元的地址是任意的。LENDATA20HSUMDATA21HBLOCKDATA22HCLRA;清累加器MOVR2,LEN;数据块长度送R2MOVR1,#BLOCK;数据块首址送RlLOOP:ADDA,R1;循环做加法INCR1;修改地址指针DJNZR2,LOOP;修改计数器并判断MOVSUM,A;存和以上程序在计数器初值不为零

8、时是没有问题的,但若是数据块的长度有可能为零,则将出现问题。当R2初值为零,减1之后将为FFH,故要做256次加法之后才会停止,显然和题意不符。若考虑到这种情况,则可按图4-3(b)的方式来编写程序。在做加法之前,先判断一次R2的初值是否为零。整个程序仍基本套用原来的形式:CLRA;清累加器MOVR2,LEN;数据块长度送R2MOVR1,#BLOCK;数据块首址送RlINCR2SJMPCHECKLOOP:ADDA,R1;循环做加法INCR1;修改地址指针CHECK:DJNZR2,LOOPMOVSUM,A;存和单片机汇编语言程序设计举例一、算术运算程序例4-4假定R2、R3和R4、R5分别存放两

9、个16位的带符号二进制数,其中R2和R4的最高位为两数的符号位。请编写带符号双字节二进制数的加减法运算程序,以BSUB为减法程序入口,以BADD为加法程序入口,以R6、R7保存运算结果。参考程序:BSUB:MOVA,R4;取减数高字节CPLACC.7;减数符号取反以进行加法MOVR4,ABADD:MOVA,R;取被加数MOVC,ACC.7MOVF0,C;被加数符号保存在F0中XRLA,R4;两数高字节异或第四章MCS-51汇编语言程序设计 第四章MCS-51汇编语言程序设计 JIA:QWE:JIAN:BMP:QAZ:MOVC,ACC.7;两数同号CY=O,两数异号CY=1MOVA,R2CLRA

10、CC.7;高字节符号位清“0”MOVR2,A;取其数值部分MOVA,R4CLRACC.7;低字节符号位清“0”MOVR4,A;取其数值部分JCJIAN;两数异号转JIANMOVA,R3;两数同号进行加法ADDA,R5;低字节相加MOVR7,A;保存和MOVA,R2ADDCA,R4;高字节相加MOVR6,A;保存和JBACC.7,QAZ;符号位为“1”转溢出处理MOVC,F0;结果符号处理MOVACC.7,CMOVR6,ARETMOVA,R3;两数异号进行减法CLRCSUBBA,R5;低字节相减MOVR7,A;保存差MOVA,R2SUBBA,R4;高字节相减MOVR6,A;保存差JNBACC.7

11、,QWE;判断差的符号,为“0”转QWEMOVA,R7;为“1”进行低字节取补CPLAADDA,#1MOVR7,AMOVA,R6;高字节取补CPLAADDCA,#0MOVR6,ACPLF0;保存在F0中的符号取反SJMPQWE;转结果符号处理;溢出处理二、数制转换程序例4-5在内部RAM的hex单元中存有2位十六进制数,试将其转换为ASCII码,并存放于asc和asc+1两个单元中。主程序(MAIN):MOVSP,#3FHMAIN:PUSHhex;十六进制数进栈ACALLHASC;调用转换子程序POPasc;第一位转换结果送asc单元MOVA,hex;再取原十六进制数SWAPA;高低半字节交换

12、PUSHACC;交换后的十六进制数进栈ACALLHASCPOPasc+l;第二位转换结果送asc+l单元子程序(HASC):HASC:DECSP;跨过断点保护内容DECSPPOPACC;弹出转换数据ANLA,#0FH;屏蔽高位ADDA,#7;修改变址寄存器内容MOVCA,A+PC;查表PUSHACC;查表结果进栈INCSP;修改堆栈指针回到断点保护内容INCSPRETSPASCTAB:DB“0,1,2,3,4,5,6,7”;ASCII码表DB“8,9,A,B,C,D,E,F”三、定时程序有多个定时需要,我们可以先设计一个基本的延时程序,使其延迟时间为各定时时间的最大公约数,然后就以此基本程序作

13、为子程序,通过调用的方法实现所需要的不同定时。例如要求的定时时间分别为5ps、10ps和20ps并设计一个1s延时子程序DELAY,则不同定时的调用情况表示如下:LOOP1:MOVLCALLDJNZR0,DELAYR0,#05HLOOP1;5s延时LOOP2:MOVLCALLR0,DELAY#0AH;10s延时第四章MCS-51汇编语言程序设计 DJNZR0,LOOP2MOVR0,#14H;20s延时LOOP3:LCALLDELAYDJNZR0,LOOP3四、查表程序一个查表程序的例子。假定有44键盘,键扫描后把被按键的键码放在累加器A中键码与处理子程序入口地址的对应关系为:键码入口地址0RK

14、01RKl2RK2并假定处理子程序在ROM64KB的范围内分布。要求以查表方法,按键码转向对应的处理子程序。参考程序如下:MOVDPTR,#BS;子程序入口地址表首址RLA;键码值乘以2MOVR2,A;暂存AMOVCA,A+DPTR;取得入口地址低位PUSHA;进栈暂存INCAMOVCA,A+DPTR;取得入口地址高位MOVDPH,APOPDPLCLRAJMPA+DPTR;转向键处理子程序BSDBRK0L;处理子程序入口地址表DBRK0HDBRK1LDBRK1HDBRK2LDBRK2H五、数据极值查找程序例4-6内部RAM20H单元开始存放8个无符号8位二进制数,找出其中的最大数。极值查找操作

15、的主要内容是进行数值大小的比较。假定在比较过程中,以A存放大数,与之逐个比较的另一个数放在2AH单元中。比较结束后,把查找到的最大数送2BH单元中。程序流程如图所示。图极值查找程序流程参考程序如下:MOVMOVMOVDECLOOP:INCMOVCJNECHK:JNCMOVLOOP1:DJNZMOVHERE:AJMPR0,#20H;数据区首地址R7,#08H;数据区长度A,R0;读第一个数R7R02AH,R0;读下一个数A,2AH,CHK;数值比较LOOP1;A值大转移A,R0;大数送AR7,LOOP;继续2BH,A;极值送2BH单元HERE8极值查找程序流程;停止六、数据排序程序例4-7假定8个数连续存放在20H为首地址的内部RAM单元中,使用冒泡法进行升序排序编程。设R7为比较次数计数器,初始值为07H。TRO为冒泡过程中是否有数据互换的状态标志,TR0=0表明无互换发生,TR0=1表明有互换发生。第四章MCS-51汇编语言程序设计 冒泡法排序程序流程参考程序:SORT:MOVR0,#20H;数据存储区首单元地址MOVR7,#07H;各次冒泡比较次数CLRTR0;互换标志清“0”LOOP:MOVA,R0;取前数MOV2BH,A;存前数INCR0MOV2AH,R0;取后数CLRCSUBBA,R0;

温馨提示

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

评论

0/150

提交评论