欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    最新单片机汇编语言程序设计1ppt课件.ppt

    • 资源ID:34128969       资源大小:1.25MB        全文页数:66页
    • 资源格式: PPT        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    最新单片机汇编语言程序设计1ppt课件.ppt

    24.1 汇编语言及格式9ORG 0000LJMP M_START ORG 0100HABC: DB 01H,02H,03H,04HM_START:MOV SP,#60H 数据表ABC首地址在0100H而程序在数据之后(0100H+4=0104H)102、定义字节伪指令(1 1)格式:)格式:标号:标号:DB X1, X2, XDB X1, X2, X(2 2)功能:定义字节数据、或字符数据常数。)功能:定义字节数据、或字符数据常数。 其中,其中,DBDB是伪指令,是伪指令,X1X1,X2X2是一个字节数据,或是一个字节数据,或一个字符串。一个字符串。 每个数据占用一个字节;每个数据占用一个字节; 字符串必须用单引号将它括起来,字符串中的每一个字字符串必须用单引号将它括起来,字符串中的每一个字符占用一个字节,用它的符占用一个字节,用它的ASCIIASCII码表示。码表示。11(3)字节定义举例ORG 2000HDATA:DB 01H,02H,ACHAR:DB CDE经过汇编后,由于伪指令经过汇编后,由于伪指令ORG定义定义DATA的首地址为的首地址为2000H,存储器从存储器从2000H开始存放以上两组数据开始存放以上两组数据2000H:01H2001H:02H2003H:41H2004H:43H2005H:44H2006H:45HA的ASCII码字符串中CDE ,每个字符的ASCII码占用一个字节DATA表从2000H开始存放,DATA=2000H,CHAR=2004H123 3、定义双字节伪指令、定义双字节伪指令(1 1)格式:标号:)格式:标号:DW X1DW X1,X2X2,XnXn(2 2)功能:它用于定义)功能:它用于定义1616位的数据。位的数据。(3 3)举例:)举例:ORG 1000HABC:DW 1234H,56H汇编后,数据的存放汇编后,数据的存放1000H: 12H 34H 00H 56H注意:注意:l 对对DWDW定义的双字节数据,高定义的双字节数据,高位在前,低位在后存放。位在前,低位在后存放。l 不足两字节,高位补不足两字节,高位补0 0l 数据可使用数据可使用1616进制、十进制、进制、十进制、八进制、二进制方式进行定义,用八进制、二进制方式进行定义,用后缀区分。没有后缀是默认的十进后缀区分。没有后缀是默认的十进制数据。制数据。12在前34在高位地址134、预留存贮区伪指令(1 1)格式:)格式: :DS DS (2 2)功能:)功能:DS nDS n从标号指定单元开始,预留从标号指定单元开始,预留n n个单元的存贮个单元的存贮区。存储单元的个数由表达式的值确定(常数或者可求值的区。存储单元的个数由表达式的值确定(常数或者可求值的表达式),它可以使一个具体的数值。表达式),它可以使一个具体的数值。(3 3)例)例ORG 3000HORG 3000HSEG : DS 16SEG : DS 16ABC: DB 12H, 34HABC: DB 12H, 34H从从 3000H开始预留开始预留16字节,字节,从从3016开始存放后面定义开始存放后面定义的数据的数据3000H : -3016H : 12H3017H: 23H预留16字节145、符号赋值伪指令格式:符号格式:符号 EQU EQU 数值或汇编符号数值或汇编符号功能:功能:给一个符号赋值。给一个符号赋值。利用该指令,我们可以将具体的地址、或常数,用一个符号地利用该指令,我们可以将具体的地址、或常数,用一个符号地址或符号常数来表示。址或符号常数来表示。(3 3)例:)例:DATA1 EQU 1234DATA1 EQU 1234 INPOT EQU 2000H INPOT EQU 2000H数据常数1234可以用DATA1代替在程序设计中输入端口地址2000H可以用符号代替使用符号的好处是:符号一般定义在程序的头部,或头文件里,使用符号的好处是:符号一般定义在程序的头部,或头文件里,当需要重新分配资源、或修改数据常数时,只需要修改定义部当需要重新分配资源、或修改数据常数时,只需要修改定义部分,不必在整个程序中去查找修改。否则每一处都得修改。分,不必在整个程序中去查找修改。否则每一处都得修改。15EQU 指令还可以将一个汇编符号赋值给另一个符号。指令还可以将一个汇编符号赋值给另一个符号。例如例如 ABC EQU R7 ;符号;符号ABC与寄存器符号与寄存器符号R7等值等值 ;它的具体地址已居于工作寄存;它的具体地址已居于工作寄存 ;器取得选择;器取得选择定义了符号后,在程序设计中,我们就可以使用这些符号。定义了符号后,在程序设计中,我们就可以使用这些符号。例如例如 MOV DPTR, #INPOT MOVX A,DPTR,A从输入端口从输入端口INPOT读入端口状态。读入端口状态。实际上,我们使用的实际上,我们使用的P0P3等符号,也是这样定义的,只不过等符号,也是这样定义的,只不过它是汇编工具软件定义的默认符号。它是汇编工具软件定义的默认符号。166. DATA伪指令(1 1)格式:)格式: 符号符号 DATA DATA 数据或表达式数据或表达式(2 2)与)与EQUEQU基本类似。基本类似。不同的地方是:不同的地方是: EQU EQU 必须先定义后使用,必须先定义后使用,DATADATA则可以先使用后定义则可以先使用后定义(使用的语句在前,定义域据在后)(使用的语句在前,定义域据在后) DATA DATA语句只能将一个数据赋值给一个符号,不能将另一语句只能将一个数据赋值给一个符号,不能将另一个已定义的符号赋值给一个新的符号;个已定义的符号赋值给一个新的符号; 表达式是可以求值的。表达式是可以求值的。177. 位地址符号定义位地址符号定义(1 1)格式:)格式: 符号符号 BIT BIT 位地址位地址(2 2)功能:)功能: 给位地址定义一个符号名给位地址定义一个符号名(3 3)例)例 LED BIT P1.7LED BIT P1.7; POST BIT 00HPOST BIT 00H;位地址;位地址00H00H可以用可以用POSTPOST符号符号注意:也可以使用注意:也可以使用EQUEQU指令定义为地址指令定义为地址 POST EQU 00HPOST EQU 00H 只要程序设计中,将只要程序设计中,将POSTPOST用位操作指令处理。但这用位操作指令处理。但这样对程序的阅读不直观,建议还是使用位地址定义指令样对程序的阅读不直观,建议还是使用位地址定义指令定义为地址,这样设计的程序给人的感觉比较好。定义为地址,这样设计的程序给人的感觉比较好。188. 结束汇编指令194.2 汇编语言程序设计4.2.1 单片机汇编语言程序设计的基本步骤单片机汇编语言程序设计的基本步骤分析问题,确定解决问题的思路和计算方法;分析问题,确定解决问题的思路和计算方法;依据解题思路和算法确定运算步骤和顺序,把运算过程用依据解题思路和算法确定运算步骤和顺序,把运算过程用程序流程框图表示;程序流程框图表示;确定所需数据、工作单元的数量,分配寄存器和存储单元;确定所需数据、工作单元的数量,分配寄存器和存储单元;根据流程图编写程序;根据流程图编写程序;调试程序,发现并修正错误;调试程序,发现并修正错误;固化程序。固化程序。 编写程序的相关说明编写程序的相关说明20举例举例求单字节带符号二进制数的补码。求单字节带符号二进制数的补码。求补码的算法:求补码的算法:资源分配:资源分配:输入数据:在输入数据:在DATA单元单元结果:保存在结果:保存在SULT单元单元使用子程序结构使用子程序结构程序流程图程序流程图开始A(DATA)A0?N除符号位外,A=(A)+1YNEG_F(A)SULT结束A压栈A弹出)(010除符号位补XXXXX21求补码的程序代码复位入口定位在0地址外部中断0入口地址主程序开始地址求补码子程序程序的其它功能22NEGSUB: PUSH ACC MOV A , DATA JNB ACC.7 , NEG_E ;(;(A)0,不需要转换,不需要转换 CLR ACC.7 ;先取反一次,再取反一;先取反一次,再取反一 ;次相当于保存符号为不变;次相当于保存符号为不变 CPL A ADD A , #1NEG_ E : MOV SULT,A ;保存结果;保存结果 POP ACC RET END该行只有注释,为了阅读方便对齐234.2.2 程序的基本结构及程序流程框图1。基本程序结构。基本程序结构 最基本的程序结构:顺序结构、分支结构、循环结构。最基本的程序结构:顺序结构、分支结构、循环结构。 子程序、中断服务程序是一种特殊的程序,它们也是由子程序、中断服务程序是一种特殊的程序,它们也是由以上三种基本结构构成的。这三种结构用流程图表示为:以上三种基本结构构成的。这三种结构用流程图表示为:AB顺序结构判断BBNY分支结构i=初值A修改并判断i YN循环结构242。程序流程框图。程序流程框图 程序设计实际上是程序流程图的设计。程序代码的编制程序设计实际上是程序流程图的设计。程序代码的编制只是依据程序流程图,用一定的程序设计语言来实现程序流只是依据程序流程图,用一定的程序设计语言来实现程序流程图所表达的的程序设计思想。程图所表达的的程序设计思想。 对于一个稍微复杂的程序,先设计流程图,再编写代码,对于一个稍微复杂的程序,先设计流程图,再编写代码,其程序设计效率要高许多,同时程序的质量也会好许多,也其程序设计效率要高许多,同时程序的质量也会好许多,也便于程序的阅读、调试、修改。便于程序的阅读、调试、修改。 要求你们在程序设计时,首先写出算法,然后画出程序要求你们在程序设计时,首先写出算法,然后画出程序流程图,在这之后再编写程序代码。流程图,在这之后再编写程序代码。253。程序流程图的画法 在前面已经接触到了一些程序流程图,它是由一些基本图在前面已经接触到了一些程序流程图,它是由一些基本图框符号,以及表示程序执行方向的有向线段组成。框符号,以及表示程序执行方向的有向线段组成。(1)基本符号)基本符号 程序的开始与结束符号框程序的开始与结束符号框 程序的处理过程符号框程序的处理过程符号框 判断符号框判断符号框 表示程序执行方向的有向线段表示程序执行方向的有向线段 有这些基本符号,就可以画出程序流程框图。还有有这些基本符号,就可以画出程序流程框图。还有一些其它的符号,我们不要求,需要时查相关资料。一些其它的符号,我们不要求,需要时查相关资料。 判断判断26 当一张图不能表示一个完整的程序流程时,可以用多张当一张图不能表示一个完整的程序流程时,可以用多张图表示,这时,出现在不同位置的图,用一个连接符号图表示,这时,出现在不同位置的图,用一个连接符号进行连接,例如进行连接,例如符号AA2第一页AA3第二页2位于不同位置并顺序连接的两个连接符号具有相同的编号。编号可以用数字,也可以用字符串。274。流程图的画法。流程图的画法(1)依据算法,将一个问题分解为一系列的计算、或判断步)依据算法,将一个问题分解为一系列的计算、或判断步骤,用图框符号表示每一步的处理、或判断过程;骤,用图框符号表示每一步的处理、或判断过程;(2)按照算法顺序,用有向线段将这些图框符号表示的处理)按照算法顺序,用有向线段将这些图框符号表示的处理过程连接起来,箭头表示的是处理过程的执行方向。过程连接起来,箭头表示的是处理过程的执行方向。(3)对于判断框,在它的分支出标出条件:用)对于判断框,在它的分支出标出条件:用Y 表示判断结表示判断结果为果为“是是”执行该分支,执行该分支,“N”表示判断结果为非执行;表示判断结果为非执行;(4)对于转移目标,一般应该给出一个符号,作为编写程序)对于转移目标,一般应该给出一个符号,作为编写程序代码是的转移符号地址(标号)。例如前面给出的求补码子代码是的转移符号地址(标号)。例如前面给出的求补码子程序。程序。28开始A(DATA)A0?N除符号位外,A=(A)+1YNEG_E(A)SULT结束A压栈A弹出判断A0转移到NEG_E判断不满足A0则执行负数求补运算NGE_E作为转移地址,例如前面的求补码程序例如前面的求补码程序294.2.3 简单程序设计简单程序设计 简单程序就是不存在转移类指令的程序,程序的执行过简单程序就是不存在转移类指令的程序,程序的执行过程没有转移,严格按照先后顺序,中间没有分支、循环、也程没有转移,严格按照先后顺序,中间没有分支、循环、也不存在子程序的调用。不存在子程序的调用。例例 :将内部数据存储器:将内部数据存储器50H单元中的一个单元中的一个8位二进制数拆开,位二进制数拆开,分成两个分成两个4位数,高四位存入位数,高四位存入61H单元,低四位存入单元,低四位存入60H单元,单元,60H,61H的高的高4位清位清0。 算法很简单:取出所要处理的字节,将它的高算法很简单:取出所要处理的字节,将它的高4位清位清“0”后存后存入入60H,将低,将低4位清位清“0”并将高低并将高低4位做半字节交换后存入位做半字节交换后存入61H。程序流程图:程序流程图:30例4.5 程序流程图程序代码:程序代码:CZCX: MOV R0,#50H ; 源地址源地址 MOV R1,#60H ;目的地址;目的地址 MOV A,R0 ;取源数据取源数据 ANL A,#0FH ;高高4位清位清0 MOV R1,A ;保存低保存低4位位 INC R1 ;修改目的地址修改目的地址 MOV A,R0 ;取源数据;取源数据 ANL A,#0F0H ;低;低4位清位清0 SWAP A ;半字节交换;半字节交换 MOV R1,A ;保存高;保存高4位位 SJMP $ ;在该处无限循环在该处无限循环开始Ro#50HR1#60HA(R0)A(A)&#0FH(R1)(A),R1(R1)+1A(R0)A(A)&#0F0HA半字节交换后,送(R1)结束该符号表示转移到当前指令执行31程序代码:程序代码:CZCX: MOV R0,#50H ; 源地址源地址 MOV R1,#60H ;目的地址目的地址 MOV A,R0 ;取源数据取源数据 ANL A,#0FH ;高高4位清位清0 MOV R1,A ;保存低保存低4位位 INC R1 ;修改目的地址修改目的地址 MOV A,R0 ;取源数据取源数据 ANL A,#0F0H ;低低4位清位清0 SWAP A ;半字节交换半字节交换 MOV R1,A ;保存高保存高4位位 SJMP $ ;在该处无限循环在该处无限循环正常程序设计时,不能有这样的死循环,这个例子只表示前面的代码已完成了所要求的功能。32例4.6 单字节十六进制转换成BCD码 将存放在将存放在56H单元的一个十六进制(二进制)数转换成单元的一个十六进制(二进制)数转换成BCD码。码。 教材上有一种算法,它适合于单字节的运算。教材上有一种算法,它适合于单字节的运算。算法分析:一个十六进制数,其十进制值在算法分析:一个十六进制数,其十进制值在0255之间,一之间,一种算法是:该数除以种算法是:该数除以100,得到的商为十进制的百位数,剩下,得到的商为十进制的百位数,剩下的余数再除以的余数再除以10,得到的商为十进制数的十位,剩下的余数,得到的商为十进制数的十位,剩下的余数(除以(除以1)是十进制数的个位。)是十进制数的个位。 教材上教材上75页给出了该程序。页给出了该程序。 如果是任意位二进制数,这种算法就有困难。如果是任意位二进制数,这种算法就有困难。 我们来看另外一个算法。我们来看另外一个算法。33通用二进制BCD码转换算法710710702.222iiiDbbbb展开后展开后7610.Db bb b对于一个二进制数据对于一个二进制数据34762107621076210772108822.2222(2(.2(2).)2(2(.2(2*0).)Dbbbbbbbbbbbbbb ii次乘2, 7次加b (1或加0)运算次乘2,次加b (1或加0)运算逐步将2提出来,它可以表达为:35对于任意k字节的二进制数据1个字节8位,k个字节,k*8位这是一个非常规则的迭代运算公式,从二进制数的最高位开始利用循环程序可以很方便编出程序,现我们先看简单程序(顺序程序)如何实现。以一字节为例*8 1*8 2210*8 1*8 2210*8 1*8 2210*8 1*8 1*8 1210,*8*822.2222(2(.2(2).)2(2(.2(2*0).)kkkkkkkkkkkDbbbbbbbbbbbbbb ii次乘2,次加b (1或加0)运算另扩充一位0次乘2,次加b (1或加0)运算 36我们可以这样计算我们可以这样计算1. 1. 令令 D D0 0=0=0;2. D2. D1 1=2D=2D0 0+b+b7 7; ; D D2 2=2D=2D1 1+b+b6 6=2(b=2(b7 7)+b)+b6 6 ; ; D D3 3=2D=2D2 2+b+b5 5=2(2b=2(2b7 7+b+b6 6)+b)+b5 5 ; ; D D4 4=2D=2D3 3+b+b4 4; ; D D5 5=2D=2D4 4+b+b3 3; ; D D6 6=2D=2D5 5+b+b2 2; ; D D7 7=2D=2D6 6+b+b1 1; ; D D8 8=2D=2D7 7+b+b0 0. . 经过以上步骤,得到的经过以上步骤,得到的D8D8就是压缩的就是压缩的BCDBCD码。我们可码。我们可以用手工作一个计算来验证。以用手工作一个计算来验证。B=64H=01100100BB=64H=01100100BD0=0D0=03.3.D1=2D1=2* *0+0=00+0=037D2=2*0+1=1D3=2*1+1=3D4=2*3+0=6D5=2*6+0=12D6=2*12+1=25D7=2*25+0=50D8=2*50+0=100 可以得到可以得到D8=100。 注意:注意: 加加bi通过将源操作数左移一位,将最高位移到通过将源操作数左移一位,将最高位移到CY,再再使用带进位加法指令进行使用带进位加法指令进行Di+Di+CY 来实现。来实现。加法运算后,要使用十进制调整指令加法运算后,要使用十进制调整指令DAA。该方法适用于任意字节的二进制数转换成十进制数。该方法适用于任意字节的二进制数转换成十进制数。38程序流程框图 假设待转换的数据保存在符号地址假设待转换的数据保存在符号地址DATA的内部的内部RAM,结,结果存放在果存放在JG_BUF单元,实现该算法的程序流程框图如下单元,实现该算法的程序流程框图如下BTOBCDR0#DATAR1#JG_BUFJG_BUF清0取(R0)到A,带进位左移,将最高位移到C,存回AA(R1)ADDC A,R1十进制调整(R1)(A)R1=(R1)+1A(R1)ADDC A,R1十进制调整(R1)AR1=(R1)-1共8次结束39程序代码DATA EQU 30H ;符号地址定义;符号地址定义JG_BUF EQU 40H ORG 0000H ; 伪指令伪指令 LJMP STARA ;让开中断服务程序入口;让开中断服务程序入口 ORG 0100HSTARA: MOV SP,#60H ;设置堆栈;设置堆栈 BTOBCD: MOV R0,#DATA ;源操作数地址;源操作数地址 MOV R1,#JG_BUF ;结果存放地址;结果存放地址 MOV R1, #0 ;D0=0(结果清(结果清0) INC R1 MOV R1, #0 DEC R1;求;求D1 MOV A, R0 ;取源操作数;取源操作数 RLC A ;将最高位移到进位位,其它为左移一位;将最高位移到进位位,其它为左移一位 MOV R0, A ;保存源数据其它位,;保存源数据其它位, 40MOV A, R1 ;取;取D0低位(十位,个位)低位(十位,个位)ADDC A, R1 ; 计算计算D0+D0+CyDAA ;十进制调整;十进制调整MOV R1, A ;保存十位、个位结果;保存十位、个位结果INC R1 ;修改地址,指向百位;修改地址,指向百位MOV A, R1 ;取百位;取百位ADDC A, R1 ;带进位加法;带进位加法 Di+Di+CyDAA ; 十进制调整十进制调整MOV R1, A ;保存百位;保存百位DEC R1 ;修改地址指向低位;修改地址指向低位;求;求D2MOV A, R0 ;取源操作数;取源操作数RLC A ;将最高位移到进位位,其它为左移一位;将最高位移到进位位,其它为左移一位MOV R0, A ;保存源数据其它位,;保存源数据其它位, MOV A, R1 ;取;取D0低位(十位,个位)低位(十位,个位)ADDC A, R1 ; 计算计算D0+D0+CyDAA ;十进制调整;十进制调整MOV R1, A ;保存十位、个位结果;保存十位、个位结果共8次41MOV A, R1 ;取;取D0低位(十位,个位)低位(十位,个位)ADDC A, R1 ; 计算计算D0+D0+CyDAA ;十进制调整;十进制调整MOV R1, A ;保存十位、个位结果;保存十位、个位结果INC R1 ;修改地址,指向百位;修改地址,指向百位MOV A, R1 ;取百位;取百位ADDC A, R1 ;带进位加法;带进位加法 Di+Di+CyDAA ; 十进制调整十进制调整MOV R1, A ;保存百位;保存百位DEC R1 ;修改地址指向低位;修改地址指向低位;求;求D3MOV A, R0 ;取源操作数;取源操作数RLC A ;将最高位移到进位位,其它为左移一位;将最高位移到进位位,其它为左移一位MOV R0, A ;保存源数据其它位,;保存源数据其它位, MOV A, R1 ;取;取D0低位(十位,个位)低位(十位,个位)ADDC A, R1 ; 计算计算D0+D0+CyDAA ;十进制调整;十进制调整MOV R1, A ;保存十位、个位结果;保存十位、个位结果42MOV A, R1 ;取;取D0低位(十位,个位)低位(十位,个位)ADDC A, R1 ; 计算计算D0+D0+CyDAA ;十进制调整;十进制调整MOV R1, A ;保存十位、个位结果;保存十位、个位结果INC R1 ;修改地址,指向百位;修改地址,指向百位MOV A, R1 ;取百位;取百位ADDC A, R1 ;带进位加法;带进位加法 Di+Di+CyDAA ; 十进制调整十进制调整MOV R1, A ;保存百位;保存百位DEC R1 ;修改地址指向低位;修改地址指向低位;求;求D4MOV A, R0 ;取源操作数;取源操作数RLC A ;将最高位移到进位位,其它为左移一位;将最高位移到进位位,其它为左移一位MOV R0, A ;保存源数据其它位,;保存源数据其它位, MOV A, R1 ;取;取D0低位(十位,个位)低位(十位,个位)ADDC A, R1 ; 计算计算D0+D0+CyDAA ;十进制调整;十进制调整MOV R1, A ;保存十位、个位结果;保存十位、个位结果43MOV A, R1 ;取;取D0低位(十位,个位)低位(十位,个位)ADDC A, R1 ; 计算计算D0+D0+CyDAA ;十进制调整;十进制调整MOV R1, A ;保存十位、个位结果;保存十位、个位结果INC R1 ;修改地址,指向百位;修改地址,指向百位MOV A, R1 ;取百位;取百位ADDC A, R1 ;带进位加法;带进位加法 Di+Di+CyDAA ; 十进制调整十进制调整MOV R1, A ;保存百位;保存百位DEC R1 ;修改地址指向低位;修改地址指向低位;求;求D5MOV A, R0 ;取源操作数;取源操作数RLC A ;将最高位移到进位位,其它为左移一位;将最高位移到进位位,其它为左移一位MOV R0, A ;保存源数据其它位,;保存源数据其它位, MOV A, R1 ;取;取D0低位(十位,个位)低位(十位,个位)ADDC A, R1 ; 计算计算D0+D0+CyDAA ;十进制调整;十进制调整MOV R1, A ;保存十位、个位结果;保存十位、个位结果44MOV A, R1 ;取;取D0低位(十位,个位)低位(十位,个位)ADDC A, R1 ; 计算计算D0+D0+CyDAA ;十进制调整;十进制调整MOV R1, A ;保存十位、个位结果;保存十位、个位结果INC R1 ;修改地址,指向百位;修改地址,指向百位MOV A, R1 ;取百位;取百位ADDC A, R1 ;带进位加法;带进位加法 Di+Di+CyDAA ; 十进制调整十进制调整MOV R1, A ;保存百位;保存百位DEC R1 ;修改地址指向低位;修改地址指向低位;求;求D6MOV A, R0 ;取源操作数;取源操作数RLC A ;将最高位移到进位位,其它为左移一位;将最高位移到进位位,其它为左移一位MOV R0, A ;保存源数据其它位,;保存源数据其它位, MOV A, R1 ;取;取D0低位(十位,个位)低位(十位,个位)ADDC A, R1 ; 计算计算D0+D0+CyDAA ;十进制调整;十进制调整MOV R1, A ;保存十位、个位结果;保存十位、个位结果45MOV A, R1 ;取;取D0低位(十位,个位)低位(十位,个位)ADDC A, R1 ; 计算计算D0+D0+CyDAA ;十进制调整;十进制调整MOV R1, A ;保存十位、个位结果;保存十位、个位结果INC R1 ;修改地址,指向百位;修改地址,指向百位MOV A, R1 ;取百位;取百位ADDC A, R1 ;带进位加法;带进位加法 Di+Di+CyDAA ; 十进制调整十进制调整MOV R1, A ;保存百位;保存百位DEC R1 ;修改地址指向低位;修改地址指向低位;求;求D7MOV A, R0 ;取源操作数;取源操作数RLC A ;将最高位移到进位位,其它为左移一位;将最高位移到进位位,其它为左移一位MOV R0, A ;保存源数据其它位,;保存源数据其它位, MOV A, R1 ;取;取D0低位(十位,个位)低位(十位,个位)ADDC A, R1 ; 计算计算D0+D0+CyDAA ;十进制调整;十进制调整MOV R1, A ;保存十位、个位结果;保存十位、个位结果46MOV A, R1 ;取;取D0低位(十位,个位)低位(十位,个位)ADDC A, R1 ; 计算计算D0+D0+CyDAA ;十进制调整;十进制调整MOV R1, A ;保存十位、个位结果;保存十位、个位结果INC R1 ;修改地址,指向百位;修改地址,指向百位MOV A, R1 ;取百位;取百位ADDC A, R1 ;带进位加法;带进位加法 Di+Di+CyDAA ; 十进制调整十进制调整MOV R1, A ;保存百位;保存百位DEC R1 ;修改地址指向低位;修改地址指向低位;求;求D8MOV A, R0 ;取源操作数;取源操作数RLC A ;将最高位移到进位位,其它为左移一位;将最高位移到进位位,其它为左移一位MOV R0, A ;保存源数据其它位,;保存源数据其它位, MOV A, R1 ;取;取D0低位(十位,个位)低位(十位,个位)ADDC A, R1 ; 计算计算D0+D0+CyDAA ;十进制调整;十进制调整MOV R1, A ;保存十位、个位结果;保存十位、个位结果47MOV A, R1 ;取;取D0低位(十位,个位)低位(十位,个位)ADDC A, R1 ; 计算计算D0+D0+CyDAA ;十进制调整;十进制调整MOV R1, A ;保存十位、个位结果;保存十位、个位结果INC R1 ;修改地址,指向百位;修改地址,指向百位MOV A, R1 ;取百位;取百位ADDC A, R1 ;带进位加法;带进位加法 Di+Di+CyDAA ; 十进制调整十进制调整MOV R1, A ;保存百位;保存百位DEC R1 ;修改地址指向低位;修改地址指向低位。 END注意: 这里的程序仅作参考; 程序中有许多重复的代码,如果使用循环程序结构,程序将变得 非常短; 在实际程序设计中,这样的功能程序一般编写成子程序。后面我 们就讨论循环程序。 该程序用顺序程序结构实现,太长了,如果2字节,4字节转换就更长。 程序中求Di的部分是相似的,能否让计算机重复执行,而不需要重复写着部分代码?484.2.4 循环程序设计 循环程序包括循环变量初循环程序包括循环变量初始化、循环体、修改循环变量、始化、循环体、修改循环变量、循环判断循环判断4部分。部分。1。循环程序的结构。循环程序的结构有两种结构有两种结构(1)先执行,后判断)先执行,后判断对于这种结构,循环体至少被对于这种结构,循环体至少被执行一次。执行一次。置初值循环体修改循环变量循环判断退出循环结束LOOP49(2) 先判断,后执行先判断,后执行 这种结构的循环这种结构的循环程序,循环体有可能程序,循环体有可能一次也不会被执行。一次也不会被执行。循环变量置初值循环体修改循环变量循环判断退出循环未结束LOOP已结束502。单循环程序举例(1)二进制BCD程序 前面讨论该程序,使用的是顺序程序结构,在该程序中有许多相同的代码,程序长度较长(当然执行时间是比较短的)。如果使用循环程序结构,则程序会变得比较简单。 我们使用子程序结构,待转换的数据存放在DATA中,结果存放在JG_BUF单元。BTOBCDR0#DATAR1#JG_BUFJG_BUF清0将源操作数(R0)带进位左移一位,将最高位移到C,再存回A(R1)ADDC A,R1十进制调整(R1)(A)R1=(R1)+1A(R1)ADDC A,R1十进制调整(R1)AR1=(R1)-1结束R3#8R3-1=0?YN 51BTOBCD程序DATA EQU 30H ;符号地址定义;符号地址定义JG_BUF EQU 40H ORG 0000H ; 伪指令伪指令 LJMP STARA ;让开中断服务程序入口;让开中断服务程序入口 ORG 0100HSTARA: MOV SP,#60H ;设置堆栈;设置堆栈 MOV 30H, #56H ; 调用前,需要先将需要转换调用前,需要先将需要转换的的 ;数据送;数据送DATAM-LOOP: LCALL BTOBCD ;调用子程序;调用子程序 LCALL DISP_SUB LCALL KB_SUB LJMP M-LOOP;子程序;子程序BTOBCD: MOV R0, #DATA ;源操作数地址;源操作数地址 MOV R1, #JG_BUF ;结果存放地址;结果存放地址 MOV R1, #0 ;D0=0(结果清(结果清0) INC R1 MOV R1, #052 DEC R1 ;恢复结果存放地址;恢复结果存放地址 MOV R3,#8 ;循环变量赋初值;循环变量赋初值8次次 LOOP: MOV A, R0 ;取源操作数;取源操作数 RLC A ;将最高位移到进位位,其它为左;将最高位移到进位位,其它为左移一位移一位 MOV R0, A ;保存源数据其它位,;保存源数据其它位, MOV A, R1 ;取;取D0低位(十位,个位)低位(十位,个位) ADDC A, R1 ; 计算计算D0+D0+Cy DAA ;十进制调整;十进制调整 MOV R1, A ;保存十位、个位结果;保存十位、个位结果 INC R1 ;修改地址,指向百位;修改地址,指向百位 MOV A, R1 ;取百位;取百位 ADDC A, R1 ;带进位加法;带进位加法 Di+Di+Cy DAA ; 十进制调整十进制调整 MOV R1, A ;保存百位;保存百位 DEC R1 ;修改地址指向低位;修改地址指向低位 DJNZ R3,LOOP RET END53利用循环程序结构,程序比顺序程序代码短多了。但执利用循环程序结构,程序比顺序程序代码短多了。但执行时间要稍长一点。行时间要稍长一点。54 对于任意字节的二进制数据转换成对于任意字节的二进制数据转换成BCD数据的过程是一样数据的过程是一样的。区别仅在于:的。区别仅在于: 将待转换的数据左移时,必须从最低字节开始,每个字节左移将待转换的数据左移时,必须从最低字节开始,每个字节左移一位,低字节的最高位移到高字节的最低位上,最高字节的最一位,低字节的最高位移到高字节的最低位上,最高字节的最高位移出到高位移出到CY。如果字节数比较多,也可以使用循环方式。如果字节数比较多,也可以使用循环方式。 对于对于N(N5)个字节二进制数据,转换成压缩的)个字节二进制数据,转换成压缩的BCD码后,码后,一般不超过一般不超过N+2字节(字节(2N+1为)。为)。 作为作业,编写一个作为作业,编写一个N(NR0?将小的数存放到(R0)-1单元,大的数存放在( R0)(R4)-1=0?(R3)-1=0?RETPAIXU1PAIXU2DATA0DATA1DATA2DATA3DATA4DATA5DATA6DATA7DATA8DATA9DATA0DATA1DATA2DATA3DATA4DATA5DATA6DATA7DATA8最大数DATA0DATA1DATA2DATA3DATA4DATA5DATA6DATA7第二大最大数第一次,最大数被存放到最高单元,下次它不参加排序第二次,次大数被存放到次高单元,下次它不参加排序顺序比较找出最大数63PAIXU: MOV R3,#9PAIXU1:MOV A,R3 MOV R4,A MOV R0,#40HPAIXU2:MOV A,R0 MOV R2,A INC R0 CLR C SUBB A,R0 JC PAIXU 3 ;不需要交换不需要交换 ;AR0,交换两个数据,交换两个数据, MOV A,R2 XCH A,R0 ;大的数大的数R0, DEC R0 MOV R0,A INC R0 ;指向后一字节指向后一字节 PAIXU3:DJNZ R4, PAIXU2 ;修改修改R4,判断内循环是否完成,判断内循环是否完成, DJNZ R3, PAIXU1 ; 修改修改R3,判断外循环是否结束。,判断外循环是否结束。 RET64 该方法,第一次进行该方法,第一次进行9 9次比较,次比较,第二次循环进行第二次循环进行8 8次比较次比较,共进,共进行行9+8+7+1=459+8+7+1=45次次 教材上还有一种算法教材上还有一种算法, , 只要全部只要全部数据都顺序后,程序结束。该算法数据都顺序后,程序结束。该算法的循环次数是不固定的,最多次数的循环次数是不固定的,最多次数9 9* *9=819=81次,最少可能只有次,最少可能只有9 9次。次。 程序设计有两种观点。程序设计有两种观点。第一种第一种是只是只要数据量不变,希望运算时间是固要数据量不变,希望运算时间是固定的,在此条件下,效率越高越好。定的,在此条件下,效率越高越好。第二种第二种是尽量缩短运算时间,不要是尽量缩短运算时间,不要求具有基本相同的运算时间。求具有基本相同的运算时间。 用于不同场合的程序,要求可以用于不同场合的程序,要求可以不同。不同。开始R3#9R4(R3),R0#40HAR0R0(R0)+1R2AAR0?将小的数存放到(R0)-1单元,大的数存放在( R0),置F0=1,AR0(R3)-1=0?F0=0?RETSTARTL2L1NNYYNY655。设计循环程序应注意的问题在教材在教材

    注意事项

    本文(最新单片机汇编语言程序设计1ppt课件.ppt)为本站会员(豆****)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开