您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 述职报告 > 2019年最新-单片机汇编语言程序设计1-精选文档
1第四章汇编语言程序设计主要内容汇编语言及格式伪指令汇编语言程序设计24.1汇编语言及格式4.1.1汇编语言及特点计算机只能识别、执行机器语言指令,但它的书写、记忆、阅读困难。汇编语言比较容易记忆、书写、阅读。现在已不使用机器语言直接编写程序。3用汇编语言编写的程序,叫做汇编源程序.它需要经过翻译变成机器语言程序,计算机才能执行,这个翻译过程叫做汇编.完成翻译过程的工具程序叫做汇编程序。汇编后得到的机器语言程序,叫做目标程序。4汇编语言的特点助记符与指令一一对应,因此用汇编语言编写的程序能真实反映计算机的实际运行情况,占用的空间小,运行速度快;能直接操作存储器、I/O接口,控制、管理硬件的能力强,能充分发挥计算机硬件资源的效率程序设计者必须熟悉计算机的硬件,程序设计比用高级语言困难汇编语言缺乏通用性,程序的移植困难。54.1.2汇编语言的语句格式一条汇编语言的语句包括四部分内容:标号、操作码、操作数和注释。其格式为:标号:操作码操作数;注释例如:ABC1:ADDA,R3;A的内容与R3的内容相加,;结果存放在A.①标号位于语句的开始,它以字母开始,后面可跟字母、数字、下划线等。标号与指令助记符之间用冒号“:”分隔。标号是可选的,不是必需的。它可作为一个符号地址被使用。6②操作码用助记符表示,操作数在助记符后。助记符与操作数之间至少要有一个空格,两操作数之间用“,”分隔。③注释是可选择的,目的是对程序进行解释,增加程序的可读性。它用分号“;”开始,可以用任何符号。④指令中的数据可以使用二进制(结尾加B),十进制(D,是默认的,可省略),十六进制(H),八进制(Q或O)。例如:MOVA,#12HMOVR3,#35MOVB,#01110100B等。74.1.3伪指令伪指令是为了协助汇编程序将汇编源程序按我们的要求正确的产生目标程序。例如规定一段代码在存储器中的存储地址,定义符号地址等。它本身与机器指令没有关系,在汇编过程中不产生形影的目标代码。81、定位伪指令(3)例:ORG0000HLJMPSTARTORG0100HSTART:MOVSP,#4FH第一条指令,存放在0000,复位后首先执行该指令的存放地址0100H。START为标号,它表示相应指令的存放地址,汇编时,给它赋值START=0100H在汇编语言程序设计中,经常用该伪指令制定某段代码的存放地址(1)格式:ORGnn是一个数据,它表示在该指令后面的程序代码或数据表格的在程序存储器中存放的首地址。(2)功能:指定该伪指令后面的代码或常数表格在程序存储器中存放的开始地址。9ORG0000LJMPM_START……ORG0100HABC:DB01H,02H,03H,04HM_START:MOVSP,#60H……数据表ABC首地址在0100H而程序在数据之后(0100H+4=0104H)102、定义字节伪指令(1)格式:标号:DBX1,X2,……X(2)功能:定义字节数据、或字符数据常数。其中,DB是伪指令,X1,X2……是一个字节数据,或一个字符串。每个数据占用一个字节;字符串必须用单引号将它括起来,字符串中的每一个字符占用一个字节,用它的ASCII码表示。11(3)字节定义举例ORG2000HDATA:DB01H,02H,‘A’CHAR:DB‘CDE’经过汇编后,由于伪指令ORG定义DATA的首地址为2000H,存储器从2000H开始存放以上两组数据2000H:01H2019H:02H2019H:41H2019H:43H2019H:44H2019H:45HA的ASCII码字符串中CDE,每个字符的ASCII码占用一个字节DATA表从2000H开始存放,DATA=2000H,CHAR=2019H123、定义双字节伪指令(1)格式:标号:DWX1,X2,……Xn(2)功能:它用于定义16位的数据。(3)举例:ORG1000HABC:DW1234H,56H汇编后,数据的存放1000H:12H34H00H56H注意:对DW定义的双字节数据,高位在前,低位在后存放。不足两字节,高位补0数据可使用16进制、十进制、八进制、二进制方式进行定义,用后缀区分。没有后缀是默认的十进制数据。12在前34在高位地址134、预留存贮区伪指令(1)格式:标号:DS表达式(2)功能:DSn从标号指定单元开始,预留n个单元的存贮区。存储单元的个数由表达式的值确定(常数或者可求值的表达式),它可以使一个具体的数值。(3)例ORG3000HSEG:DS16ABC:DB12H,34H从3000H开始预留16字节,从3016开始存放后面定义的数据3000H:--3016H:12H3017H:23H预留16字节145、符号赋值伪指令(1)格式:符号EQU数值或汇编符号(2)功能:给一个符号赋值。利用该指令,我们可以将具体的地址、或常数,用一个符号地址或符号常数来表示。(3)例:DATA1EQU1234INPOTEQU2000H数据常数1234可以用DATA1代替在程序设计中输入端口地址2000H可以用符号代替使用符号的好处是:符号一般定义在程序的头部,或头文件里,当需要重新分配资源、或修改数据常数时,只需要修改定义部分,不必在整个程序中去查找修改。否则每一处都得修改。15EQU指令还可以将一个汇编符号赋值给另一个符号。例如ABCEQUR7;符号ABC与寄存器符号R7等值;它的具体地址已居于工作寄存;器取得选择定义了符号后,在程序设计中,我们就可以使用这些符号。例如MOVDPTR,#INPOTMOVXA,DPTR,A从输入端口INPOT读入端口状态。实际上,我们使用的P0~P3等符号,也是这样定义的,只不过它是汇编工具软件定义的默认符号。166.DATA伪指令(1)格式:符号DATA数据或表达式(2)与EQU基本类似。不同的地方是:①EQU必须先定义后使用,DATA则可以先使用后定义(使用的语句在前,定义域据在后)②DATA语句只能将一个数据赋值给一个符号,不能将另一个已定义的符号赋值给一个新的符号;③表达式是可以求值的。177.位地址符号定义(1)格式:符号BIT位地址(2)功能:给位地址定义一个符号名(3)例LEDBITP1.7;POSTBIT00H;位地址00H可以用POST符号注意:也可以使用EQU指令定义为地址POSTEQU00H只要程序设计中,将POST用位操作指令处理。但这样对程序的阅读不直观,建议还是使用位地址定义指令定义为地址,这样设计的程序给人的感觉比较好。18(1)格式:END(2)功能:END指示源程序到结束。END指令放在汇编语言源程序的末尾。汇编程序遇到该指令后,就认为汇编源程序已经处理完毕,后面的代码不需要处理。因此,该指令不能放在源程序中间,必须放在最后。如果在程序的最后没有END指令,汇编程序会提出警告。8.结束汇编指令194.2汇编语言程序设计4.2.1单片机汇编语言程序设计的基本步骤①分析问题,确定解决问题的思路和计算方法;②依据解题思路和算法确定运算步骤和顺序,把运算过程用程序流程框图表示;③确定所需数据、工作单元的数量,分配寄存器和存储单元;④根据流程图编写程序;⑤调试程序,发现并修正错误;⑥固化程序。⑦编写程序的相关说明20举例求单字节带符号二进制数的补码。求补码的算法:资源分配:输入数据:在DATA单元结果:保存在SULT单元使用子程序结构程序流程图开始A(DATA)A≥0?N除符号位外,A=(A)+1YNEG_F(A)SULT结束A压栈A弹出)(010除符号位补XXXXX21求补码的程序代码程序代码如下:DATAEQU30HORG0LJMPSTARTORG03HLJMPINT0_FUN…ORG0100HSTART:MOVSP,#50H……LCALLNEGSUB……复位入口定位在0地址外部中断0入口地址主程序开始地址求补码子程序程序的其它功能22NEGSUB:PUSHACCMOVA,DATAJNBACC.7,NEG_E;(A)≥0,不需要转换CLRACC.7;先取反一次,再取反一;次相当于保存符号为不变CPLAADDA,#1NEG_E:MOVSULT,A;保存结果POPACCRETEND该行只有注释,为了阅读方便对齐234.2.2程序的基本结构及程序流程框图1。基本程序结构最基本的程序结构:顺序结构、分支结构、循环结构。子程序、中断服务程序是一种特殊的程序,它们也是由以上三种基本结构构成的。这三种结构用流程图表示为:AB顺序结构判断BBNY分支结构i=初值A修改并判断iYN循环结构242。程序流程框图程序设计实际上是程序流程图的设计。程序代码的编制只是依据程序流程图,用一定的程序设计语言来实现程序流程图所表达的的程序设计思想。对于一个稍微复杂的程序,先设计流程图,再编写代码,其程序设计效率要高许多,同时程序的质量也会好许多,也便于程序的阅读、调试、修改。要求你们在程序设计时,首先写出算法,然后画出程序流程图,在这之后再编写程序代码。253。程序流程图的画法在前面已经接触到了一些程序流程图,它是由一些基本图框符号,以及表示程序执行方向的有向线段组成。(1)基本符号①程序的开始与结束符号框②程序的处理过程符号框③判断符号框④表示程序执行方向的有向线段⑤有这些基本符号,就可以画出程序流程框图。还有一些其它的符号,我们不要求,需要时查相关资料。判断判断26⑤当一张图不能表示一个完整的程序流程时,可以用多张图表示,这时,出现在不同位置的图,用一个连接符号进行连接,例如符号AA2第一页AA3第二页2位于不同位置并顺序连接的两个连接符号具有相同的编号。编号可以用数字,也可以用字符串。274。流程图的画法(1)依据算法,将一个问题分解为一系列的计算、或判断步骤,用图框符号表示每一步的处理、或判断过程;(2)按照算法顺序,用有向线段将这些图框符号表示的处理过程连接起来,箭头表示的是处理过程的执行方向。(3)对于判断框,在它的分支出标出条件:用Y表示判断结果为“是”执行该分支,“N”表示判断结果为非执行;(4)对于转移目标,一般应该给出一个符号,作为编写程序代码是的转移符号地址(标号)。例如前面给出的求补码子程序。28开始A(DATA)A≥0?N除符号位外,A=(A)+1YNEG_E(A)SULT结束A压栈A弹出判断A≥0转移到NEG_E判断不满足A≥0则执行负数求补运算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:MOVR0,#50H;源地址MOVR1,#60H;目的地址MOVA,R0;取源数据ANLA,#0FH;高4位清0MOVR1,A;保存低4位INCR1;修改目的地址MOVA,R0;取源数据ANLA,#0F0H;低4位清0SWAPA;半字节交换MOVR1,A;保存高4位SJMP$;在该处无限循环开始Ro#50HR1#60HA(R0)A(A)FH(R1)(A),R1(R1)+1A(R0)A(A)F0HA半字节交换后,送(R1)结束该符号表示转移到当前指令执行31程序代码:CZCX:MOVR0,#50H;源地址MOVR1,#60H;目的地址MOVA,R0;取源数据ANLA,#0FH;高4位清0MOVR1,A;保存低4位INCR1;修改目的地址MOVA,R0;取源数据ANLA,#0F0H;低4位清0SWAPA;半字节交换MOVR1,A;保存高4位SJMP$;在该处无限循环正常程序设计时,不能有这样的死循环,这个例子只表示前面的代码已完成了所要求
本文标题:2019年最新-单片机汇编语言程序设计1-精选文档
链接地址:https://www.777doc.com/doc-3745785 .html