第4章AT89S51汇编语言程序设计主要内容:1.程序设计的一般方法2.应用程序设计举例重点理解:程序设计的一般方法和技巧汇编语言汇编语言源程序汇编目标程序汇编指令与机器码指令有一一对应的关系。一、单片机编程语言高级语言机器语言☆用汇编语言编写程序效率高,占用存储空间小,运行速度快。☆可读性差,离不开具体的硬件,是面向“硬件”的语言。4.1汇编语言程序设计概述•两种基本语句:二、汇编语言语句和格式汇编时产生相应的机器代码。执行时对应机器的一种操作。汇编时无机器代码与之对应。控制汇编过程的一些控制命令。4.1汇编语言程序设计概述(续)指令语句伪指令语句“伪”体现在该种指令汇编后无相应机器代码产生。具有控制汇编程序的输入/输出、定义数据和符号、条件汇编、分配存储空间等功能。ORG—定位END—结束汇编EQU—赋值DB—定义字节DW—定义数据字DS—定义存储区BIT—位定义常用的伪指令(七条)三、伪指令4.1汇编语言程序设计概述(续)1.ORG(ORiGin)汇编起始地址命令(1)规定程序的起始地址。若省略,则目标程序从0000H地址开始。ORG2000H……ORG2500H……ORG3000HORG2500H……ORG2000H……ORG3000H(2)可多次用ORG指令,以规定不同程序段的起始地址。但地址必须由小到大,且不能交叉、重叠。例:√×三、伪指令(续)2.END(ENDofAssembly)汇编终止命令整个源程序只能有一条END命令,且位于最后。3.EQU(EQUate)标号赋值命令用于给标号赋值,赋值后标号值在整个程序有效。例:TESTEQU2000H表示TEST=2000H,汇编时,凡是遇到TEST,均以2000H来代替。若出现在程序中间,其后的源程序将不进行汇编。三、伪指令(续)4.DB(DefineByte)定义数据字节命令用于在程序存储器连续单元中定义字节数据例:ORG2000HDB30H,24,”C”汇编后(2000H)=30H(2001H)=18H(十进制数24)(2002H)=43H(字符“C”的ASCII码)三、伪指令(续)5.DW(DefineWord)定义数据字命令用于在程序存储器的连续单元中定义16位的数据字例:ORG2000HDW1246H,7BH,10汇编后(2000H)=12H;第1个字(2001H)=46H(2002H)=00H;第2个字(2003H)=7BH(2004H)=00H;第3个字(2005H)=0AH三、伪指令(续)6.DS(DefineStorage)定义存储区命令用于在程序存储器中预留指定数目的连续单元例1:TABEL:DS10;从TABEL代表的地址开始,保留10个连续的地址单元。例2:ORG2000HDS10H;从2000H地址开始,保留16个连续地址单元。注意:DB、DW和DS命令只能对程序存储器有效,不能对数据存储器使用。三、伪指令(续)三、伪指令(续)7.BIT位定义命令用于给字符名称赋以位地址。例1:QABITP1.6;把P1.6的位地址赋给变量QA。位地址可以是符号地址,也可是绝对位地址。例2:QABIT96H一、单片机汇编语言程序设计的基本步骤:4.2AT89S51汇编语言程序设计⑴分析题意、明确要求、设计算法等。⑶确定数据结构:合理地选择和分配内存单元以及工作寄存器;⑵画出程序流程图。⑷编写汇编源程序。⑸仿真、调试和优化程序。⑹固化程序。4.2AT89S51汇编语言程序设计(续)•程序编写做到:占用存储空间少;运行时间短;结构清晰,易读、易于移植。按结构化程序设计思想,程序都可由:顺序结构分支结构循环结构等构成二、单片机汇编语言程序设计思想:分析:010101104.2AT89S51汇编语言程序设计(续)三、程序举例------顺序程序例1:拆字程序把70H的内容拆开,高位送71H低位,低位送72H低位70H71H72H0000010100000110例1:拆字程序(续)4.2AT89S51汇编语言程序设计(续)结束70H内容送A高低位交换,屏蔽高位送71H70H内容送A屏蔽高位后送72H开始ORG0000HAJMPMAINORG0100HMOV70H,#56HMOVA,70HSWAPAANLA,#0FHMOV71H,AMOVA,70HANLA,#0FHMOV72H,AENDMAIN:4.2AT89S51汇编语言程序设计(续)三、程序举例------分支程序通常用条件转移指令形成简单分支结构。如:判(A)=Z或NZ,转移判(CY)=1或0,转移判(bit)=1或0,转移CJNE比较不相等转移例2:假设内RAM30H、31H单元内容分别为a、b,按下式计算Y值,并将结果存于32H单元中。a-b(a≥0)a+b(a0)Y=4.2AT89S51汇编语言程序设计(续)ORG0000HAJMPMAINORG0100HMOVA,30HA内容为负数?结束(30H)A计算a+b结果送32H单元开始计算a-bYNJBACC.7,JIAFACLRCSUBBA,31HSJMPDONEADDA,31HMOV32H,AENDMAIN:JIAFA:DONE:例2程序清单4.2AT89S51汇编语言程序设计(续)三、程序举例------循环程序例3:数据块传递程序:将内RAM60H~6FH内容传送到内RAM70H~7FH单元ORG0000HAJMPMAINORG0100HMOVR0,#60HMOVR1,#70HMOVR2,#10HMOVA,@R0MOV@R1,AINCR0INCR1DJNZR2,ZHCENDNOPYN数据全部传递?结束初始化修改地址指针开始送数取数MAIN:ZHC:4.2AT89S51汇编语言程序设计(续)子程序是单独编写的程序段,需要时可调用。简化程序结构,减少占用程序存储空间。子程序的形式与要求:⑴标明子程序的入口地址,以方便调用;⑵指出入口与出口参数,以正确进行参数传递;常采用工作寄存器或累加器、地址指针寄存器或堆栈进行参数传递。⑶注意保护现场;⑷子程序的末尾用RET返回指令结束。⑸子程序可以嵌套。三、程序举例------子程序4.2AT89S51汇编语言程序设计(续)有关指令:1、堆栈操作指令2、子程序调用指令;绝对调用指令;长调用指令ACALLaddrllLCALLaddr163、子程序返回指令:RETPUSHdirectPOPdirect;入栈指令;出栈指令三、程序举例------子程序(续)子程序4.2AT89S51汇编语言程序设计(续)基本结构MAIN:……;MAIN为主程序入口标号……LCALLSUB;调用子程序SUB…………SUB:PUSHPSW;现场保护PUSHAccPOPAcc;现场恢复,注意要先进后出POPPSWRET;最后一条指令必须为RET子程序处理程序段三、程序举例------子程序(续)4.2AT89S51汇编语言程序设计(续)例5:要求在P1.0引脚上产生周期为4ms的方波。三、程序举例------子程序(续)例5程序清单FB:CPLP1.0;P1.0取反ACALLDL2msSJMPFBDL2ms:MOVR7,#10;延时2ms的子程序DL1:MOVR6,#48DL2:NOPNOPDJNZR6,DL2DJNZR7,DL1RETEND设晶振为12MHZ,则机器周期为1us。所以子程序延时:1+[1+(1+1+2)×48+2]×10+2=1953(us)三、程序举例------子程序(续)已知程序执行前有A=02H,SP=42H,(41H)=FFH,(42H)=FFH。下述程序执行后,A=?SP=?(41H)=?(42H)=?PC=?POPDPHPOPDPLMOVDPTR,#3000HRLAMOVB,AMOVCA,@A+DPTRPUSHAccMOVA,BINCAMOVCA,@A+DPTRPUSHAccRETORG#3000HDB10H,80H,30HDB80H,50H,80H习题讲解A=80HSP=40H(41H)=50H(42H)=80HPC=8050H