ImageVerifierCode 换一换
格式:PPT , 页数:80 ,大小:369.76KB ,
文档编号:4068985      下载积分:28 文币
快捷下载
登录下载
邮箱/手机:
温馨提示:
系统将以此处填写的邮箱或者手机号生成账号和密码,方便再次下载。 如填写123,账号和密码都是123。
支付方式: 支付宝    微信支付   
验证码:   换一换

优惠套餐
 

温馨提示:若手机下载失败,请复制以下地址【https://www.163wenku.com/d-4068985.html】到电脑浏览器->登陆(账号密码均为手机号或邮箱;不要扫码登陆)->重新下载(不再收费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录  
下载须知

1: 试题类文档的标题没说有答案,则无答案;主观题也可能无答案。PPT的音视频可能无法播放。 请谨慎下单,一旦售出,概不退换。
2: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
3: 本文为用户(晟晟文业)主动上传,所有收益归该用户。163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

1,本文(第4章-MCS51汇编语言程序的设计课件-.ppt)为本站会员(晟晟文业)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!

第4章-MCS51汇编语言程序的设计课件-.ppt

1、第四章 MCS-51汇编语言程序设计n4.1 汇编语言程序设计概述n4.2 顺序与循环程序设计n4.3 子程序的设计n4.4 分支转移程序设计n4.5 查表程序设计n4.6 综合编程举例4.1 汇编语言程序设计概述4.1.1 概述 MCS-51单片机的汇编语言指令系统,每一条指令就是汇编语言的一条命令语句。由于汇编语言是面向机器硬件的语言,因此使用汇编语言进行程序设计,必须熟悉MCS-51单片机的硬件结构、指令系统、寻址方式等,才能编写出符合要求的程序。汇编语言语句有两种基本类型:1.1.指令语句指令语句 每一条指令在汇编时都产生一个指令代码,也称为机器代码,该机器代码对应着机器的一种操作。2

2、.2.伪指令语句伪指令语句 伪指令语句没有目标代码,它主要是为汇编程序服务的,在汇编过程中起控制作用。标号字段和操作字码段之间要有冒号“:”相隔;操作码字段和操作数字段间的分界符是空格;双操作数之间用逗号相隔;操作数字段和注释字段之间的分界符用分号“;”相隔。标号字段 操作码字段 操作数字段 注释字段(LABLE)(OPCODE)(OPRAND)(COMMENT)MCS-51汇编语言的4分段格式:1.标号字段 标号是语句所在地址的标志符号2.操作码字段 规定语句执行的操作,不能空缺3.操作数字段 存放指令的操作数或操作数地址,可以采用字母和数字的多种表示形式4.注释字段 在MCS-51汇编语言

3、中应有向汇编程序发出的指示信息,告诉它如何完成汇编工作,这一任务是通过使用伪指令来实现的。“伪”体现在汇编时,伪指令没有相应的机器代码产生。伪指令具有控制汇编程序的输入输出、定义数据和符号、条件汇编、分配存储空间等功能。不同汇编语言的伪指令也有所不同,但一些基本的内容却是相同的。n伪指令 下面介绍在MCS-51汇编语言程序中常用的伪指令。n ORG 汇编起始地址命令 n END 汇编语言程序结束伪指令 n EQU 赋值伪指令 n DB 定义字节伪指令 n DW 定义字伪指令n BIT 位地址符号伪指令 DATA 定义标号数值伪指令ORG ORG 汇编起始地址命令汇编起始地址命令功能:规定程序的

4、起始地址。如果不用ORG规定,则汇编的得到的目标程序将从0000H开始。通用形式ORG M,M为十或十六进制数.例如:ORG 2000H START:MOV A,#00H 注意:在一个源程序中,可以多次使用注意:在一个源程序中,可以多次使用ORGORG指令,指令,来规定不同的程序段的起始地址。但是,地址必来规定不同的程序段的起始地址。但是,地址必须由小到大排列,不能交叉、重叠。须由小到大排列,不能交叉、重叠。END END 汇编语言程序结束伪指令汇编语言程序结束伪指令 功能:用在程序末尾,表示程序已经结束。汇编程序对END以后的指令不再汇编。EQU EQU 赋值伪指令赋值伪指令 功能:把操作数

5、段中的地址或数据赋值 给标号字段中的标号。格式:标号(字符名称)EQU 数或汇编符号例:AA EQU R1 ;R1与AA等值DB DB 定义字节伪指令定义字节伪指令 功能:从指定单元开始定义(存储)若干个字节的数值或ASCII码字符。常用于定义数据常数表。格式:格式:操作码操作码 操作数操作数 DB DB 字节常数或字节常数或ASCIIASCII字符字符例:ORG 1000HDB 76H,73,C,BDB 0ACH 则(1000H)=76H (1001H)=49H (1002H)=43H (1003H)=42H (1004H)=0ACH DW DW 定义字伪指令定义字伪指令 功能:从指定单元开

6、始定义(或存储)若干个字的数据或ASCII码字符。格式:格式:操作码操作码 操作数操作数 DW DW 字常数或字常数或ASCIIASCII字符字符 BIT BIT 位地址符号伪指令位地址符号伪指令功能:把位地址赋予所规定的字符名称。格式:字符名称 操作码 操作数 BIT 位地址例:ABC BIT P1.0 Q4 BIT P2.2 汇编后,位地址P1.0、P2.2分别赋给变量ABC和Q4。DATA DATA 定义标号数值伪指令定义标号数值伪指令 功能:给标号段中的标号赋以数值。格式:标号 操作码 操作数 字符名称:DATA 表达式例:MN:DATA 3000H汇编后MN的值为3000H.DATA

7、与EQU的区别在于:用DATA定义的标识符汇编时作为标号登记在符号表中,所以可以先使用后定义;而EQU定义的标识符必须先定义后使用,因后者不登记在符号表中。4.1.2 4.1.2 汇编语言程序设计步骤汇编语言程序设计步骤 使用汇编语言作为程序设计语言的步骤与高级语言编程步骤类似,但略有差异。其程序设计步骤大致可分为以下几步:1分析课题,确定算法或解题思路。2画工作流程图(图形的符号规定均同于高级 语言流程图)3分配内存单元,确定程序与数据区存放地址。4编写源程序。5上机调试、修改,最后确定源程序。程序设计时,必须根据实际问题和所使用的计算机的特点来确定算法,然后按照尽可能使程序简程序简短和缩短

8、运行时间短和缩短运行时间两个原则编写程序。4.1.3 汇编语言源程序的汇编 语言源程序翻译成机器代码(指令代码)的过程称为“汇编”。手工汇编 通过查指令的机器代码表,逐个把助记符指令翻译成机器代码,再进行调试和运行。缺点:繁琐、容易出错。缺点:繁琐、容易出错。所以只有小程序或受条件限制时才使用。所以只有小程序或受条件限制时才使用。在实际的程序设计中,都是采用机器汇编在实际的程序设计中,都是采用机器汇编来自动完成。来自动完成。机器汇编 借助于微计算机来代替手工汇编。它实际上是通过执行汇编程序汇编程序来对源程序进行汇编的。由于使用微型计算机完成了汇编,而汇编后得到的机器代码却是在单片机上运行,所以

9、这种机器汇编又称为交叉汇编交叉汇编。交叉汇编后,通过微机的串口(或并口)将汇编得到的机器代码送到用户样机(或在线仿真器)再进行程序的调试和运行。有时,在分析现成产品的ROM/EPROM中的程序时,要将二进制数的机器代码语言程序翻译成汇编语言源程序,该过程称为反汇编反汇编。4.2 4.2 顺序与循环程序设计顺序与循环程序设计 顺序结构的程序是一种最简单、最基本的程序(也称为简单程序)。它的特点是按程序编写的顺序一次执行,程序流向不变。这类程序是所有复杂程序的基础。在很多实际程序中会遇到需多次重复执行某段程序的情况,可把这段程序设计为循环结构程序,这样可大大缩短程序。4.2.1 4.2.1 顺序程

10、序设计顺序程序设计 要写出高质量的程序还是需要掌握一定的技巧,需要熟悉指令系统,正确地选择指令,最大限度地优化程序的目的。例1:将20H单元的两个BCD码拆开并变成ASCII码,存入21H、22H单元。方法一方法一 采用把BCD数除以10H的方法,除后相当于把此数右移了4位,这样两个BCD码分别移到A、B的低4位,然后再各自与30H相“或”即变为ASCII码。地址 机器码 周期数 源程序 ORG 2000H2000H 74 20 1 MOV A,20H2002H 75 F0 10 2 MOV B,#10H2005H 84 4 DIV AB2006H 43 F0 30 2 ORL B,#30H2

11、009H 85 22 F0 2 MOV 22H,B200CH 44 30 1 ORL A,#30H 200EH F5 21 1 MOV 21H,A END 此程序占用字节数为此程序占用字节数为1616,执行机器周期数为,执行机器周期数为1313。方法二方法二 采用先把20H中低4位BCD码交换出来加以转换、存放,然后再把高4位BCD码交换至低4位加以转换、存放。地 址 机器码 周期数 源程序 ORG 2000H 2000H 78 22 1 MOV R0,#22H 2002H 76 00 1 MOV R0,#0 2004H E5 20 1 MOV A ,20H 2006H D6 1 XCHD A

12、 ,R0 2007H 43 22 30 1 ORL 22H,#30H 200AH C4 1 SWAP A 200BH 44 30 1 ORL A ,#30H 200DH F5 21 1 MOV 21H,A END 此程序占用字节数为此程序占用字节数为15,执行机器周期为,执行机器周期为9。例2:设有两个4位BCD码,分别存放在23H、22H单元和33H、32H单元中,求它们的和,并送入43H、42H单元中去。解:由于BCD码是分放在高、低位两个字节中,因而要从低位字节开始相加,且每进行一次加法运算,需要进行一次BCD码调整。ORG 2000H CLR C MOV A,22H ADD A,32H

13、 DA A MOV 42H,A MOV A,23H ADDC A,33H DA A MOV 43H,ALL:SJMP LL END4.2.2循环程序设计循环程序设计 循环程序的基本结构:1.1.循环初态循环初态 2.设置循环过程中工作单元的初始值。3.例如:设置循环次数计数器、地址指针赋初值。2.2.循环体循环体 3.3.重复执行的程序段部分称为循环体,完成主要的操作(包括对地址指针的修改)。3.3.循环控制部分循环控制部分 4.4.用于控制循环的执行和结束。在循环初态已经给出了5.循环结束条件,即循环次数初值。循环程序每执行一次6.,都检查结束条件。当条件不满足时,修改地址指针和7.控制变量

14、;当条件满足时,停止循环。若循环程序的循环体中不再包含循环程序,即为单重循环程序。如果在循环体中还包含循环程序,那么这种现象称为循环嵌套。注意:多重循环程序中,只允许外重循注意:多重循环程序中,只允许外重循环嵌套内重循环程序,不允许循环互相环嵌套内重循环程序,不允许循环互相相交,也不允许从循环程序的外部跳入相交,也不允许从循环程序的外部跳入循环程序的内部。循环程序的内部。X Xi i为单字节数,顺序存放在RAM从50H开始的单元,n放在R2中现在要求它们的和(双字节)并放在R3R4中,则有:MOV R3,#0MOV R3,#0 MOV R4,#0 MOV R4,#0 MOV R0,#50H M

15、OV R0,#50H LOOP:MOV A,R4 LOOP:MOV A,R4 ADD A,R0 ADD A,R0 MOV R4,A MOV R4,A INC R0 INC R0 CLR A CLR A ADDC A,R3 ADDC A,R3 MOV R3,A MOV R3,A DJNZ R2,LOOP DJNZ R2,LOOP END END思考思考 多字节加多字节加(减减)法是否可用循环法是否可用循环 程序实现程序实现?如何实现如何实现?例2:多重循环-软件延时程序(50ms延时)。我们知道使用12MHz晶振时,1个机器周期为1 us,执行1条DJNZ指令的时间就为2 us。用双重循环可以写

16、出如下程序段:DEL:MOV R7,#200 DEL1:MOV R6,#125 DEL2:DJNZ R6,DEL2;1252=250us DJNZ R7,DEL1;0.25ms200=50 ms RET由于没有考虑到除“DJNZ R6,DEL2”,指令外的其他指令的时间,如把其它指令的时间计算在内,则延时时间为:(250+1+2250+1+2)*200+1=50.601ms200+1=50.601ms比较精确的延时,可修改程序如下:比较精确的延时,可修改程序如下:DEL:MOV R7,#200DEL1:MOV R6,#123 NOPDEL2:DJNZ R6,DEL2;2123+2=248us

17、DJNZ R7,DEL1;(2482482 2)2002001 150.001ms50.001ms 注意:用软件实现延时程序,不允许注意:用软件实现延时程序,不允许有中断,否则将严重影响定时的准确性。有中断,否则将严重影响定时的准确性。4.3子程序的设计子程序的设计 在实际应用中通常把多次使用的程序段按一定结构编好,存放在内存中,当需要时,程序可以去调用这些独立的程序段。通常将这种可以被调用的程序段称为子子程序程序。调用子程序的程序称为主程序主程序。使用子程序的过程,称为调用子程序。4.3.1 4.3.1 子程序结构与设计注意事项子程序结构与设计注意事项 由于子程序的资源需要被所有调用程序共享

18、,所以子程序在功能上具有通用性、在结构上应具有独立性。子程序的末尾有一条子程序返回指令(RET)。子程序的结构与一般程序的主要区别:子程序的结构与一般程序的主要区别:编写子程序时的注意事项:1.1.每个子程序赋一个名字每个子程序赋一个名字(实际上是一个入口地址的代号)。2.2.能正确地传递参数。能正确地传递参数。3.首先要有入口条件,说明进入子程序时它所要处理的数据如何得到。另外,要有出口条件,即处理的结果是如何存放的。3.3.注意保护现场和恢复现场。注意保护现场和恢复现场。4.保护和恢复现场通常用堆栈来进行。4.4.为了使子程序具有一定的通用性,子程序中为了使子程序具有一定的通用性,子程序中

19、的操作对象应尽量用地址或寄存器形式的操作对象应尽量用地址或寄存器形式,而不采用立即数形式。子程序中如果含有转移指令,应尽量用相对转移指令,以便在内存的哪个区域都能正确执行。4.3.2 4.3.2 子程序的调用与返回子程序的调用与返回 调用:ACALL addr11 (2字节,2周期,2K范围)LCALL addr16 (3字节,2周期,64K范围)返回:RET(1字节,2周期)4.3.3 4.3.3 子程序嵌套子程序嵌套 子程序嵌套指,在子程序执行过程中还可以调用另一个子程序。子程序嵌套的次数从理论上说是无限的理论上说是无限的,但实际上,由于受堆栈深度堆栈深度的限制,嵌套次数是有限的。子程序嵌

20、套过程(实现多重转子)。从上述过程可以看出从上述过程可以看出,堆栈在子程序调用,堆栈在子程序调用中是必不可少的,因中是必不可少的,因为断点地址是自动按为断点地址是自动按先进后出的原则存入先进后出的原则存入堆栈区的,从而保证堆栈区的,从而保证了存入的断点地址能了存入的断点地址能依次正确地返回。依次正确地返回。4.4.4 4.4.4 子程序设计子程序设计(参数的不同传递方法参数的不同传递方法)例:编写一个子程序,将片内的一组单元清零。子程序不包含这组单元的起始地址和单元的个数。1.通过寄存器传递参数 SUBRT:MOV A ,#00HLOOP:MOV R0,A INC R0 DJNZ R7,LOO

21、P RETMAIN:MOV R0,#30H;MOV R7,#0AH;ACALL SUBRT 2.通过堆栈传递参数假设数据区的起始地址事先存放在70H单元,被清零单元的个数事先存放在71H单元,主程序为:MAIN:PUSH 70H PUSH 71H ACALL SUBRTPc:.SUBRT:POP DPH POP DPL POP R7 POP R0 SUB1:MOV A,#00HLOOP:MOV R0,A INC R0 DJNZ R7,LOOP PUSH DPL PUSH DPH RET例3:通过数据指针传递参数 主程序:地址:5000H:ACALL PRINT 5002H:DB THIS IS

22、 AN EXAMPLE DB 0AH,0DH,00H NEXT:子程序:PRINT:POP DPH POP DPLPPP1:MOV A,#00H MOVC A,A+DPTR INC DPTR JZ PPPEND;(A)=0转PPPEND,此时(DPTR)NEXT地址PPP2:;打印程序 SJMP PPP1PPPEND:JMP A+DPTR ;指向NEXT处,取代返回指令。4.4分支转移程序设计分支转移程序设计 分支转移程序的最大特点是程序中含有转移指令,转移指令又分为无条件转移转移指令又分为无条件转移和有条件转移和有条件转移,因此分支程序也可分为无条件分支转移程序和有条件分支转移程序。我们在这

23、里讲述的重点是有条件分支转移。单分支转移结构单分支转移结构 结构特点:程序的判别只有两个出口,两者选一。单分支转移的程序设计一般根据运算结果的状态标志,用条件判跳指令来选择并转移。例:求单字节有符号数的二进制补码 应该首先判断被转换数的符号,负数进行转换,正数即为补码。CMPT:JNB ACC.7,RETURN;(A)0,不需转换 MOV C,ACC.7 ;符号位保存 CPL A ADD A,#1 MOV ACC.7,C RETURN:RET 最简单的分支程序设计,一般采用逐次比较最简单的分支程序设计,一般采用逐次比较法,就是把所有不同情况一个一个地进行比较,法,就是把所有不同情况一个一个地进

24、行比较,发现符合就转向对应的处理程序。发现符合就转向对应的处理程序。此法的缺点:程序太长,有此法的缺点:程序太长,有N种种可能的情况,可能的情况,就需要就需要N个判断和转移。可用多分支程序解决个判断和转移。可用多分支程序解决例:求符号函数的值。例:求符号函数的值。符号函数的定义符号函数的定义 Y=1当当X00当当X=0-1当当X0?1Y-1YNYYN程序:SIGNFUC:MOV A,40H CJNE A,#00H,NZEAR AJMP NEGTNZEAR:JB ACC.7,POSI MOV A,#01H AJMP NEGTPOSI:MOV A,#81HNEGT:MOV 41H,A END 思考

25、:设思考:设5AH单元中有一变量单元中有一变量X,编写计算下述函数编写计算下述函数式的程序,结果存入式的程序,结果存入5BH单元。单元。Y=X2 1X2+841 X=1010X=15 X2R1X=15?41Y结束结束X256NADD:JMP A+DPTRTBJ1:AJMP PRG0 AJMP PRG1 AJMP PRGn注意:所有的处理程序入口注意:所有的处理程序入口PRG0PRG0、PRG1PRG1PRGnPRGn和散转表和散转表TBJ1TBJ1都必须与都必须与AJMPAJMP指令在同一个指令在同一个2K2K范围内,对于一个范围内,对于一个2K2K内内放不下所有的处理程序的情况,可把一些较长

26、的处理程序放不下所有的处理程序的情况,可把一些较长的处理程序放于其它地方,而在放于其它地方,而在2K2K外用外用LJMPLJMP指向这些处理程序。指向这些处理程序。上例修改为:PRG1:LJMP XPRG1PRG2:LJMP XPRG2例:据(R3)转向不同处理程序JMP7:MOV DPTR,#TBJ7 MOV A,R3 MOV B,#3 MUL AB ;(A)低8位(B)高8位 XCH A,B ;(A)高8位(B)低 ADD A,DPH;(R2)*3低位在A中 MOV DPH,A XCH A,B ;(R2)*3高位加到DPH上 JMP A+DPTRTBJ7:LJMP PRG0 ;3字节 LJ

27、MP PRG1 LJMP PRGn 注意:注意:对散转点超过256个时,即n255时,寄存器R2放不下,必须用两个字节存放(R3R2)。并利用对DPTR进行加法运算的方法,直接修改DPTR然后再用指令:JMP A+DPTR使用地址偏移量表使用地址偏移量表散转点较少,所有操作程序处在同一页时,考虑散转点较少,所有操作程序处在同一页时,考虑使用此法使用此法。例:按R2的内容转向6个处理程序 JMP:MOV A,R2 MOV DPTR,#TBJ3 MOVC A,A+DPTR JMP A+DPTRTBJ3:DB PRG0-TBJ3 DB PRG1-TBJ3 DB PRG5-TBJ3 PRG0:处理程序

28、处理程序0 PRG1:处理程序处理程序1 PRG5:处理程序处理程序5 R2=0R2=0时时MOVC A,A+DPTRMOVC A,A+DPTR中中(A)=PRG0-TBJ3(8(A)=PRG0-TBJ3(8位位);(DPTR)=TBJ3(16);(DPTR)=TBJ3(16位)位)执行执行JMP A+DPTRJMP A+DPTR时时(A+DPTR(A+DPTR)PRG0-TBJ3PRG0-TBJ3TBJ3=PRG0TBJ3=PRG0。(。(1616位)位)条件条件:转移表的大小加上各个程序长度必须小于转移表的大小加上各个程序长度必须小于256B,256B,而转移表和各处理程序可位于而转移表和

29、各处理程序可位于ROMROM中的任中的任何地方。何地方。使用转向地址表使用转向地址表转向范围较大时,考虑采用此法转向范围较大时,考虑采用此法.例:根据R2的内容转向各个处理程序,设转向入口为PRG0-PRGn,则散转程序和转移表如下:JMP9:MOV DPTR,#TBL9 MOV A,R2 ADD A,R2 ;(R2)*2(A)JNC NADD INC DPH ;(R2)*2256 NADD:MOV R3,A MOVC A,A+DPTR XCH A,R3 ;转移地址高8位 INC A MOVC A,A+DPTR MOV DPL,A ;转移地址低8位 MOV DPH,R3 CLR A JMP A

30、+DPTRTBL9:DW PRG0 DW PRG1 DW PRGn注意:此法可实现注意:此法可实现64K64K范围内转移,但散转数范围内转移,但散转数n256n255n255时,则应用双字节加法运算来修时,则应用双字节加法运算来修改改DPTRDPTR。4.5查表程序设计查表程序设计 所谓查表法,就是对一些复杂的函数运算,例如sin x 等,事先把其全部可能范围的函数值按一定规律存放在程序存储器。当程序中要用到这些函数时,可以直接按编排好的索引值进行查找。当然,索引值和函数值应该有直接的对应关系。查表法的优点:查表法的优点:节省运算步骤,程序简洁,执行速度提高。查表法的缺点:查表法的缺点:占用较

31、多的存储单元。随着存储器价格的大幅度下降,这个问题已微不足道,所以查表法的应用越来越广泛。4.5.1 4.5.1 查表程序总述查表程序总述 为了便于实现查表的功能,MCS-51汇编语言中专门设置了两条查表指令:u MOVC A,A+DPTRMOVC A,A+DPTR 采用DPTR存放数据表格的地址,查表过程比较简单。查表前,应先把数据表格起始地址存入DPTR,然后把所查表的索引值送入累加器A中,最后使用该条查表指令完成查表。u MOVC A,A+PC 操作过程如下:1.使用传送指令将所查数据的索引值送入累加器A。2.用“ADD A,#data指令对累加器A进行修正。data修正式为:PC+da

32、ta=PC+data=数据表首地址数据表首地址 PC是“MOVC A,A+PC”的下一条指令的地址。因此,data值实际等于查表指令和数据表格之间的字节数。3.采用该条查表指令完成查表。4.5.2 4.5.2 查表程序设计举例查表程序设计举例 例1:设有一个循环检测报警装置,需对16路输入进行控制,每路有一个最大允许值,它为双字节数,控制时需根据测量的路数,找出该路的最大允许值,看输入值是否大于允许值,如大于即报警。路数X(0X15)放于R2中。Y为最大允许值,放在表格中查表后最大值放于R3R4中。TAB:MOV A,R2 ADD A,R2 MOV R3,A ADD A,#06 MOVC A,

33、A+PCMOVC A,A+PC XCH A,R3 ;1字节 ADD A,#03 ;2字节 MOVC A,A+PC ;1字节 MOV R4,A ;1字节 RET ;1字节TAB1:DW 1520H,3721H,4264H,7850H DW 3483H,3657H,883H,9943H DW 1000H,4051H,6758H,8931H DW 4468H,5871H,3284H,7808H 这个查表程序具有局限性,表格长度不能超过255B,表格只能存放在MOVC A,A+PC 指令以下的256个单元。如果表格长度超过256B,则需要把表格放在64KB程序存储器空间的任何地方,则应使用指令“MOV

34、C A,A+DPTR”且对DPH、DPL进行计算,求出表目的地址。例2:一个温度控制器中,测出电压与温度的非线性关系,需对它进行线性化补偿,测量值为10位二进制数,设测量输入值放于R2R3中,可用如下程序把它转换成线性温度值,仍存放R2R3中,设R2R3:000000111111011103F7HLTB2:MOV DPTR,#TAB2 MOV A,R3 CLR C RLC A MOV R3,A ;(R3)=EEH XCH A,R2 ;(R2)=EEH,(A)=03HRLC ARLC AXCH R2,AXCH R2,AADD A,DPL ADD A,DPL ;EEH+DPLEEH+DPLA AM

35、OV DPL,A MOV DPL,A ;(;(R3R2R3R2)*2 2(DPTRDPTR)DPTRDPTRMOV A,DPHMOV A,DPHADDC A,R2ADDC A,R2MOV DPH,AMOV DPH,ACLR ACLR AMOVC A,A+DPTRMOVC A,A+DPTRMOV R2,AMOV R2,ACLR ACLR AINC DPTRINC DPTRMOVC A,A+DPTRMOVC A,A+DPTRMOV R3,AMOV R3,ARETRETTAB2:DW TAB2:DW ;温度值表温度值表由于使用指令由于使用指令MOVCA,A+DPTR,表表TAB2可放在可放在64KB

36、程程序存储器的任何位置,序存储器的任何位置,此 外 表 格 长 度 可 大 于此 外 表 格 长 度 可 大 于256B。4.6综合编程举例综合编程举例 代码转换类程序代码转换类程序 在计算机内部的运算一般都是用二进制,而在计算机与外设的数据传送中常采用BCD码、ASCII码和其他代码,这就存在一个代码之间转换的问题。在程序设计中常采用算法处理和查表方式。前者是根据待转换的两种代码的某种数学上的运算关系,通过一定的算法进行转换;后者是将两种待转换的代码对应列表,然后用查表指令进行转换。例1 将累加器A中0FFH范围内的二进制数转换为BCD数。BB:MOV B,#100 DIV AB MOV R

37、0,A INC R0 MOV A,#10 XCH A,B DIV AB SWAP A ADD A,B MOV R0,A RET 本程序通过两次“DIV”指令分离出百位数和十分数,这样的转换方法避免了循环程序,十分简单。例2 把A中的压缩BCD码转换成二进行制数。BIN:MOV R2,A ANL A,#0F0H SWAP A MOV B,#10 MUL AB MOV R3,A MOV A,R2 ANL A,#0FH ADD A,R3 RET 例3 ASCII码转换成二进制数。要求:ASCII二进制数,并拼装成一个字节,放到70H单元之中。(60H)=33H(字符“3”的ASCII码值),(61)

38、=43H(字符“C”的ASCII码值)。字符09对应的ASCII码值30H39H。字符AF对应的码值41H46H。主程序:ATOH:MOV R0,#61H MOV R1,#70H ACALL CVERT ;结果存放在A中 SWAP A MOV R1,A ;存高位 DEC R0 ACALL CVERT XCHD A,R1子程序:CVERT:MOV A,R0 CLR C SUBB A,#30H CJNE A,#0AH,NEQ AJMP BIG;(A)=OAHNEQ:JC LEND;(A)OAH,cy=0LEND:RET算术逻辑指令在多字节运算中的应用 多字节十进制数多字节十进制数(BCDBCD码)

39、码)加法:加法:被加数和加数分别存放在40H和50H为起始地址的单元,求这两个数的和,并将和存放到起始地址为40H单元中去。R040H,R150H.字节数存放在R2中,将36701985存放在43H40H,12663459存放在53H50H.MAIN:MOV RO,#40H MOV R1,#50H MOV R2,#04H ACALL J1ABCD1 J1ABCD1:CLR CJ1ABCD2:MOV A,R0 ADDC A,R1 DA A MOV R0,A INC R0 INC R1 DJNZ R2,J1ABCD2 RET采用重复加法的双字节无符号乘法功能(R2R3)*(R6R7)(R4R5R6

40、R7)入口:R2R3中存放被乘数,R6R7中存放乘数。出口:结果存放在R4R5R6R7中例:编制一多字节乘法子程序。设被乘数为3个字节(分别存储在符号地址J、K、L单元中)乘数为单字节(存于符号地址M单元中)J K L M*LOMLHIMLHIMK+LOMKHIMJLOMJRES3RES2RES1RES0被乘数乘数部分积乘积 MULJKLM:PUSH A PUSH B MOV A,M MOV B,L MUL AB MOV LOML,A MOV HIML,B MOV A,M MOV B,K MUL AB MOV LOMK,A MOV HIMK,B MOV A,M MOV B,J MUL AB M

41、OV LOMJ,A MOV HIMJ,B MOV RES0,LOML MOV A,HIMK ADD A,LOMK MOV RES1,A MOV A,HIMK ADDC A,LOMJ MOV RES2,A CLR A ADDC A,HIMJ MOV RES3,A POP B POP A RET例:例:从22H单元开始有一无符号数据块,其长度在20H单元,求出数据块中最大值,并存入21H单元。ORG 2000H CLR A MOV R2,20H MOV R1,#22H LP:CLR C SUBB A,R1 JNC NEXT MOV A,R1 SJMP NEXT1 NEXT:ADD A,R1 NEXT1:INC R1 DJNZ R2,LP MOV 21H,A LP1:SJMP LP1 END思考:如何在该例的基础上改为求最小值?

侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|