片机汇编语言程序设计.ppt

上传人:za****8 文档编号:3196627 上传时间:2019-12-08 格式:PPT 页数:48 大小:270.01KB
返回 下载 相关 举报
片机汇编语言程序设计.ppt_第1页
第1页 / 共48页
片机汇编语言程序设计.ppt_第2页
第2页 / 共48页
片机汇编语言程序设计.ppt_第3页
第3页 / 共48页
点击查看更多>>
资源描述
第4章单片机汇编语言程序设计,4.1汇编语言程序设计的基础知识4.2汇编程序设计方法4.3综合编程举例,4.1汇编语言程序设计的基础知识,4.1.1汇编语言的语句格式汇编语言具有程序结构简单、执行速度快、程序易优化、编译后占用空间小的特点。汇编语言编程比高级语言困难,必须对计算机硬件有相当深入的了解,才能使用汇编语言编写程序。各种汇编语言的语法规则是基本相同的,且具有相同的语句格式。汇编语句除包括指令外还包括伪指令。MCS-51单片机汇编语言的语句格式表示如下:标号:操作码操作数;注释,4.1.1汇编语言的语句格式,(1)标号标号是语句地址的标志符号,标号后边必须跟以冒号。标号由18个ASCII字符组成,头一个字符必须是字母,其余字符可以是字母、数字或其它特定字符。不能使用汇编语言已经定义了的符号作为标号。如指令助记符、伪指令助记符以及寄存器名等。“1TAB:”(以数字开头),“START”(无冒号),“TAB+5:”(“+”号不能出现在标号中),“MOV:”(指令助记符)都是错误的标号。,4.1.1汇编语言的语句格式,(2)操作码操作码用于规定这条语句执行的操作,是一条指令助记符或伪指令助记符。操作码在一条汇编语句中是必不可少的。(3)操作数操作数用于给操作码提供操作的数据或地址。在一条语句中,操作数可能是空白,也可能包括一项、二项或三项,各操作数之间用逗号分隔。MCS-51单片机汇编语句操作数的获得有立即数寻址、寄存器寻址、寄存器间接寻址等6种之同的寻址方式。,4.1.1汇编语言的语句格式,(4)注释注释是对语句的解释说明,不是必须的,但它可使程序的编制显得更加清楚。注释以“;”开头,长度不限,一行不够时可以换行接着书写,但换行时应还在开头使用“;”号。(5)分隔符汇编语句在上述各部分的开头或末尾使用分隔符把它们分开,以便于区分。冒号“:”用于标号之后;空格“”用于操作码和操作数之间;逗号“,”用于操作数之间;分号“;”用于注释之前。,4.1.2伪指令,伪指令与指令的概念不同,伪指令并不被译成机器码,只是影响到汇编过程,用来对汇编过程进行某种控制或提供某些汇编信息。1.设置起始地址伪指令ORG格式:标号:ORGnnORG100HSTART:MOVA,#30HMOVB,#50H一般来说,在一个汇编语言源程序的开始,都安置一条ORG伪指令来指出该程序在存储器中存放的起始位置。,4.1.2伪指令,2.定义字节伪指令DB格式:标号:DBX1,X2,Xn该伪指令把单字节数据X1,X2,Xn存入目标程序存储器,通常用于定义一个常数表。ORG1000HTAB:DB00H,01H,02H,03H,04H伪指令定义的数据00H,01H,02H,03H,04H从指定的1000H单元开始依次存放,一个数据占用一个字节存储单元。指令中Xi也可以是由两个单引号括起来的一个字符串,这时Xi定义的字节长度等于字符串的长度,每一个字符为一个ASCII码。,4.1.2伪指令,3.字定义伪指令DW格式;标号:DWY1,Y2,Yn该伪指令功能与DB伪指令类似,也是给数据表中的数据分配存储单元。所不同的是DW伪指令定义的数据为字。存储时将高8位数据存入低地址单元,将低8位数据存入高地址单元。ORG2000HWTAB:DW1000H,2000H,3000H伪指令DW定义了数据1000H,2000H,3000H,它们依次从指定的2000H单元开始存放。,4.1.2伪指令,4.赋值伪指令EQU格式:符号名EQU表达式伪指令表示将表达式的值或特定的某个汇编符号定义一个指定的符号名。由EQU伪指令定义过的符号名可以在本程序段的任意位置上引用。DBUFEQU30H使用上述伪指令后,则符号DBUF就等价于30H。在程序中对DBUF进行赋值,实际上就是对内部RAM的30H赋一个值。,4.1.2伪指令,5.位定义伪指令bit格式:符号名BIT位地址表达式该伪指令把位地址表达式的值赋给前面的符号名。HIGHbit20H使用上述伪指令后,则HIGH等价于位地址20H,在其后的编程中可以用HIGH代替20H使用。6.汇编结束伪指令END格式:标号:ENDEND伪指令指出结束汇编,即使后面还有指令,汇编程序也不作处理。,4.1.3汇编语言程序的基本框架,ORG0000HAJMPMAIN;跳转到主程序ORG0003HLJMPINT_X0;外部中断0入口ORG000BHLJMPINT_T0;定时器0中断入口ORG0013HLJMPINT_X0;外部中断1入口ORG001BHLJMPINT_T1;定时器1中断入口ORG0023HLJMPINT_S;串口中断入口ORG0100H,4.1.3汇编语言程序的基本框架,MAIN:;主程序开始MOVSP,#70H;设置堆栈段;以下是中断服务程序INT_X0:;外部中断0服务子程序RETIINT_T0:;定时器0服务子程序RETIINT_X1:;外部中断1服务子程序RETI,4.1.3汇编语言程序的基本框架,INT_T1:;定时器1服务子程序RETIINT_S:;串口中断服务子程序RETI;可以在此处放置子程序END;汇编结束程序框架中包含了5个中断服务,在实际使用中可能只用到其中的部分中断。在0003H处安排了中断服务程序的入口地址表,主程序放在其后,从0100H单元开始执行。,4.1.4汇编过程,汇编又分手工汇编和计算机汇编。手工汇编指由汇编者对照指令表,将源程序的每条指令的指令代码分别查出,然后把这些指令代码以字节为单位从源程序的起始地址依次排列形成目标程序。计算机汇编采用系统软件汇编程序来完成,汇编过程采取两次扫描的方式。第一次扫描读取存放在磁盘上的源程序,生成复制程序和符号表;第二次扫描使用机器指令操作代码表、伪指令操作表和符号表读取存放在磁盘上的复制程序,生成目标程序。,4.2汇编程序设计方法,4.2.1程序设计步骤用汇编语言编写一个程序的过程可分为以下五个步骤:(1)分析问题,确定算法(2)根据算法制定程序流程图(3)确定数据格式,分配系统资源(4)根据流程图编写程序(5)程序调试,4.2.2顺序程序,例4-1将地址为2002H、2001H、2000H的数据存储单元的内容,分别传送到2005H、2004H、2003H存储单元中去。START:MOVDPTR,#2002HMOVXA,DPTR;取2002H单元内容MOVDPTR,#2005HMOVXDPTR,A;送到2005H单元MOVDPTR,#2001HMOVXA,DPTR;取2001H单元内容MOVDPTR,#2004HMOVXDPTR,A;送到2004H单元,4.2.2顺序程序,MOVDPTR,#2000HMOVXA,DPTR;取2000H单元内容MOVDPTR,#2003HMOVXDPTR,A;送到2003H单元RET,4.2.2顺序程序,例4-2设内部RAM的40H、41H单元中分别存放着一个字节的二进制数,要求取出这两个单元中的低半字节,合并成一个字节后,存入50H单元中。START:MOVR1,40H;设置R1为数据指针MOVA,R1;取出第一个单元中的内容ANLA,0FH;取第一个数的低半字节SWAPA;移至高半字节INCR1;修改数据指针XCHA,R1;取第二个单元中的内容ANLA,0FH;取第二个数的低半字节ORLA,R1;拼字MOV50H,A;存放结果RET,4.2.3分支程序,在MCS-51单片机指令系统中,有JZ(JNZ)、CJNE、JC(JNC)和JB(JNB)等丰富的控制转移指令,它们是分支结构程序设计的基础,可以完成各种各样的条件判断、分支。分支结构一般分为单分支和多分支两种结构。,4.2.3分支程序,例4-3x,y均为8位二进制数,设x在R0中,按照下面的函数关系求出y后存入R1中。START:CJNER0,00H,SUL1;R0中的数与00比较不等转移MOVR1,00H;相等,R10SJMPSUL2SUL1:JCNEG;两数不等,若(R0)0,则R101HSJMPSUL2NEG:MOVR1,0FFH;(R0)(R0),则把(R1)送(R0);否则(R0)保持不变。再将(R0)分别与(R2)和(R3)比较,比较处理的方法与上面相同,这样比较3次后,R0中即为3个数中最大的数。BR2:ORG2500HMOVR0,00H;R0清零MOVA,R1;第一个数(R1)送AACALLCOMP;比较(R1)与(R0)大小MOVA,R2;第二个数(R2)送AACALLCOMP;比较(R2)与(R0)大小,4.2.3分支程序,MOVA,R3;第三个数(R3)送AACALLCOMP;比较(R3)与(R0)大小HERE:AJMPHERECOMP:MOVR4,A;R4暂存A的内容CLRC;清进位位CSUBBA,R0;(A)(R0)JCM1;(A)(R0)时大数存R0M1:RET,4.2.4循环程序,1.循环程序的组成(1)循环初始化部分:是为了保证程序能正常进行循环操作而做的准备工作。(2)循环体部分:需要重复执行的程序段,是循环的主体。(3)循环控制部分:用来保证循环程序按规定的次数或特定条件正常循环,按一定规律修改操作数地址及控制变量,以便每次执行循环体时得到新的数据。,4.2.4循环程序,2.循环程序的结构常见循环结构有两种:一种是先检查是否满足控制条件,符合则执行循环体,否则退出循环,也称为“当”型循环;另一种是先执行循环体,然后再判断循环是否继续进行,也称为“直到”型循环。,4.2.4循环程序,3.循环控制的方法(1)计数控制循环将计数器的初值设置为循环次数,以后每执行一次循环体,使循环计数器减1,并测试计数器是否为0,若为0,则终止循环。这种方法称为计数法,一般用循环指令DJNZ进行编程。(2)条件控制法对于循环次数不能预先确定的程序,只能根据循环过程中某个特定条件是否满足来控制循环是继续还是退出。这类通过测试特定条件来实现循环控制的方法称为条件控制法。,4.2.4循环程序,例4-5设在内部RAM的BLOCK单元开始处有长度为LEN的无符号数据块,试编一个求和程序,并将和存入内部RAM的SUM单元(设和不超过8位)。由于循环的次数确定,采用计数循环控制,循环计数初值设置为LEN即可。START:CLRA;清累加器AMOVR2,LEN;数据块长度送R2MOVR1,BLOCK;数据块首址送R1LOOP:ADDA,R1;循环加法INCR1;修改地址指针DJNZR2,LOOP;修改计数器并判断MOVSUM,A;存和RET,4.2.4循环程序,例4-6长度为10H的字符串存放在首地址为inbuf的内部RAM中,将这个字符串向片外RAM的outbuf地址开始的存储单元传送,一直进行到遇见回车符(ODH)或整个字符串传送完毕。由于字符串长度是10H,采用计数循环控制。题目中要求遇见回车符(ODH)则停止传送,所以同时采用条件控制法控制循环。MOVR7,#10H;置转送次数MOVR0,#inbuf;送字符串首地址MOVDPTR,#outbuf;送传送单元起始地址LOOP:CJNER0,#0DH,NEXT;取字符比较,是回车符则转移SJMPEND,4.2.4循环程序,NEXT:MOVA,R0;取字符MOVXDPTR,A;送字符INCR0;地址加1INCDPTRDJNZR7,LOOP;未送完返回END:SJMP$RET,4.2.4循环程序,例4-710秒软件延时程序。使用6MHz晶振,一个机器周期为2s,计算出一条指令以至一个循环所需要的执行时间,给出相应的循环次数,便能达到延时的目的。DELAY:MOVR5,100;第一层循环执行100次DEL0:MOVR6,200;第二层循环执行200次DEL1:MOVR7,248;第三层循环执行248次DEL2:DJNZR7,DEL2DJNZR6,DEL1DJNZR5,DEL0RET,4.2.5子程序设计,需要进行一些数值不同而算法相同的操作,这时常常将实现这个算法的操作设计为一个子程序。子程序需要由主程序或子程序调用。子程序调用子程序,称为子程序嵌套。子程序的结构包括子程序名、具体功能程序、子程序返回三部分。子程序返回由RET指令完成。1.子程序编写的原则(1)子程序第一条指令前必须有标号,该标号应以子程序的功能命名,以便阅读时一目了然。(2)在给子程序所加的注释中应该说明子程序的功能,并标明子程序的入口参数和出口参数。,4.2.5子程序设计,(3)子程序执行完成后一定要返回主程序,而子程序是通过RET指令返回到主程序的。(4)在子程序在调用和返回时,隐含两次堆栈操作(压栈和弹栈),而且有可能在子程序中再调用子程序(即子程序嵌套),编程时应注意堆栈区的大小要满足要求。(5)保护现场和恢复现场必须在子程序执行之前,将使用到一些寄存器或存储单元保护起来,通常是进行压栈操作或改变工作寄存器的物理地址,这种操作称为保护现场。子程序执行完成返回主程序后,再将压栈的内容取出,即弹栈,或恢复原来工作寄存器的物理地址,称为恢复现场。,4.2.5子程序设计,2.主程序和子程序之间的参数传递在需要在主程序和子程序之间进行参数传递时,主程序应先把有关的参数存入约定的位置,子程序执行时,可以从约定的位置取得参数,当子程序执行完时,将得到的结果再存入约定的位置,返回主程序后,主程序可以从这些约定的位置取得需要的结果。参数的传递方法主要有以下几种方式:(1)用工作寄存器或累加器传递参数(2)利用堆栈传递参数(3)利用操作数地址传递参数,4.2.5子程序设计,例4-8编写子程序实现多字节无符号数的加法。下面子程序入口参数DATA1是被加数的低位地址,DATA2是加数的低位地址,N是相加字节的个数;出口参数DATA2是和数的低位地址。MADD:MOVR0,#DATA1;置被加数MOVR1,#DATA2;置加数MOVR7,#N;置字节数CLRC;清进位位LOOP:MOVA,R0ADDCA,R1;求和MOVR1,A;存结果INCR0;修改指针INCR1DJNZR7,LOOP;循环判断RET,4.2.5子程序设计,例4-9把内部RAM某一单元中一个字节的十六进制数转换成两位ASCII码,结果存放在内部RAM的连续两个单元中。假设一个字节的十六进制数在内部RAM的40H单元,而结果存入50H,51H两个单元。一个字节的十六进制数是由两位数字组成,需要两次进行ASCII转换,可以编写子程序完成将1位十六进制数转换成ASCII,然后在主程序中两次调用它。调用过程中可以用堆栈进行参数传递。MAIN:MOVSP,#30HMOVR1,#50H;R1为存结果的指针MOVA,40H;A为需转换的十六进制数SWAPA;先转换高位半字PUSHACC;压栈LCALLHEASC;调用子程序HEASC转换低半字节内容;,4.2.5子程序设计,POPACCMOVR1,A;存高半字节转换结果INCR1PUSH40HLCALLHEASCPOPACCMOVR1,A;存低半字节转换结果ENDHEASC:MOVR0,SPDECR0DECR0;R0指向十六进制数参数地址XCHA,R0;取被转换参数ANLA,0FH;保留低半字节ADDA,2;修改A值MOVCA,A+PC;查表XCHA,R0;结果送回堆栈RETTAB:DB30H,31H,32H,4.3综合编程举例,4.3.1算术运算程序1带符号数的加减运算程序设计例4-10设在BLOCK和BLOCK+l单元中有以两个补码形式的带符号单字节数。请编写求两数之和,并把它放在SUM和SUM+l两个单元中(低8位在SUM单元,高8位在SUM+1单元)的子程序。SBADD:PUSHACCPUSHPSWMOVPSW,#08H;保护现场(改变工作寄存器区)MOVR0,#BLOCK;R0指向一个加数MOVR1,#SUM;Rl指向和单元MOVR2,#00H;高位先令其为零MOVR3,#00HMOVA,R0,4.3.1算术运算程序,JNBACC.7,POS1;若为正数则转POS1MOVR2,#0FFH;若为负数,则全“1”送R2POS1:INCR0MOVB,R0JNBB.7,POS2;若是正数,则转POS2MOVR3,#0FFH;若是负数,则全“1”送R3POS2:ADDA,B;低8位相加MOVR1,A;存低8位和INCR1MOVA,R2ADDCA,R3;完成高8值求和MOVR1,A;存高8位和POPPSW;恢复现场POPACCRETEND,4.3.1算术运算程序,2多字节乘除运算程序设计例4-11将(R2R3)和(R6R7)中双字节无符号数相乘,结果存入R4R5R6R7。NMUL:MOVR4,0;初始化MOVR5,0CLRCMOVR0,16NMUL1:MOVA,R4;CyR4R5R6R7右移一位RRCAMOVR4,AMOVA,R5RRCAMOVR5,AMOVA,R6RRCA,4.3.1算术运算程序,MOVR6,AMOVA,R7RRCMOVR7,AJNCNMUL2;C为移出乘数最低位MOVA,R5;(R4R5)+;(R6F7)(R4R5)ADDA,R3MOVR5,AMOVA,R4ADDCA,R2MOVR4,ANMUL2:DJNZR0,NMUL1;循环16位MOVA,R4;最后结果再移一位RRCAMOVR4,A,MOVA,R5RRCAMOVR5,AMOVA,R6RRCAMOVR6,AMOVA,R7RRCAMOVR7,ARET,4.3.2查表程序,MCS-5l指令系统中有两条专用的查表指令,MOVCA+PC指令可用于在“本地”范围内查表,MOVCA,A+DPTR指令适用于在64KB范围内查表。例4-12在一个温度检测系统中,温度模拟信号由10位A/D输入。将A/D结果转换为对应温度值,可采用查表方法实现。先由实验测试出整个温度量程范围内的A/D转换结果,把A/D转换结果000H3FFH所对应的温度值编制为一个表存储在程序存储器中,那么就可以根据检测到的模拟量的A/D转换值查找出相应的温度值。设测得的A/D转换结果已存入20H,21H单元中(高位字节在20H中,低位字节在21H中),查表得到的温度值存放在22H#、23H单元(高位字节在22H中,低位字节在23H中)。,4.3.2查表程序,FTMP:MOVDPTR,TAB;DPTR表首地址MOVA,21H;(20H)(21H)2CLRCRLCAMOV21H,AMOVA,20HRLCAMOV20H,AMOVA,21H;表首地址+偏移量ADDCA,DPLMOVDPL,AMOVA,20HADDCA,DPHMOVDPH,A,CLRAMOVCA,A+DPTR;查表得温度值高字节MOV22H,ACLRAINCDPTRMOVCA,A+DPTR;查表得温度值低字节MOV23H,ARETTAB:DW,4.3.3数据排序程序,1.算法说明例如原始数据为顺序50、38、7、13、59、44、78、22第次冒泡的过程是:50、38、7、13、59、44、78、22(逆序,互换)38、50、7、13、9、44、78、22(逆序,互换)38、7、50、13、59、44、78、22(逆序,互换)38、7、13、50、59、44、78、22(正序,不互换)38、7、l3、50、59、44、78、22(逆序,互换)38、7、13、50、44、59、78、22(正序,不互换)38。7、13、50、44、59、78、22(逆序,互换)38、7、13、50、44、59、22、78(第一次冒泡结束),4.3.3数据排序程序,如此进行,各次冒泡的结果是:第一次冒泡38、7、13、50、44、59、22、78第二次冒泡7、13、38、44、50、22、59、78第二次冒泡7、13、38、44、22、50、59、78第四次冒泡7、13、38、22、44、50、59、78第五次冒泡7、13、22、38、44、50、59、78第六次冒泡7、13、22、38、44、50、59、78第七次冒泡7、13、22、38、44、50、59、78由于每次冒泡都从前向后排定了一个大数,因此每次冒泡所需进行的比较次数都递减1。控制排序结束常不仅使用计数方法,还要使用设置互换标志的方法。,4.3.3数据排序程序,例4-13假定8个数据连续存放在30H为首地址的内部RAM单元中,编程使用冒泡法进行升序排序。分析:将外层循环次数放在R3中,内层循环次数放在R2中,位地址7FH为冒泡过程中是否有数据互换的状态标志,(7FH)l表明有互换发生,(7FH)=0,表明无互换发生,无互换发生则立即排序结束。ORG1000HMOVR0,#30H;数据区首地址送R0MOVR3,#07H;设置外循环次数在R3中LP0:CLR7FH;交换标志位清0MOVA,R3;取外循环次数MOVR2,A;设置内循环次数MOVR0,#30H;重新设置数据区首,4.3.3数据排序程序,LP1:MOV20H,R0;数据区数据送20H单元中MOVA,R0;20H内容送AINCR0;修改地址指针(R0+1)MOV21H,R0;下一个地址的内容送21HCLRC;Cy清0SUBBA,21H;前一个单元的内容与下一个单元的内容比较JCLP2;有借位转移到LP2处执行MOVR0,20H;无借位,前、后内容交换DECR0MOVR0,21HINCR0;修改地址指针(R0+1)SETB7FH;置位交换标志位为1LP2:DJNZR2,LP1;内循环次数减1不等于0,则程序转到LP1JNB7FH,LP;交换标志位若为0,则程序转到LP3处结束循环DJNZR3,LP0;外循环次数减1不等于0,则程序转到LP0处LP3:SJMP$;程序执行完,“原地踏步”END,4.3.5位操作程序,例4-14编写一段程序,实现如图所示的逻辑运算电路。图中25H和26H是位变量的地址,其他为位名称。,4.3.5位操作程序,按照逻辑表达式编制程序如下:START:MOVC,P2.2ORLC,TF0MOVP1.3,CMOVC,IE1ORLC,/25HANLC,P1.3ANLC,/26HMOVP1.3,CSJMP$,作业4.24.64.74.94.10,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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