汇编语言程序设计ppt课件.ppt
第5章 汇编语言程序设计,教学目的:熟悉80C51系列单片机的汇编语言,能够熟练编写汇编语言源程序。教学重点:常用汇编语言程序设计方法。教学难点:分支程序、散转程序与子程序的设计,汇编语言 图51 源程序、汇编程序、目的程序之间关系示意图,5.1 概 述,程序设计语言:机器语言、汇编语言、高级语言,5.1.1 程序设计语言,4-1 汇编程序约定,汇编语言程序:用汇编语言编写的、完成特定功能的指令序列。汇编程序:能将汇编语言源程序转换成机器语言目标程序的系统软件。,汇编语言程序到机器语言程序的转换过程称为汇编。1.手工汇编:人工查指令表汇编。用于设计短小程序或调试程序的场合。2.机器汇编:用汇编程序进行汇编。,5.1.2 汇编语言规范,高级语言:一种面向过程且独立于计算机硬件结构的通用计算机语言,汇编语言格式与伪指令,1)汇编语言源程序由以下两种指令构成汇编语句(指令语句)伪指令(指示性语句)2)汇编语句的格式:标号:操作码操作数;注释3)伪指令:控制汇编用的特殊指令,这些指令不属于指令系统,不产生机器代码。,2.80C51汇编程序设计中常用的伪指令,(1)ORG 汇编起始指令 规定目标程序的起始地址,格式如下:标号 操作码 操作数 ORG 表达式(exp)必须为16位地址(2)EQU 赋值指令把操作数段中的地址或数据赋值给标号,格式如下:标号 操作码 操作数字符名称 EQU 数或汇编符号 例1 AA EQU R1;R1与AA等值 则 MOV A,AA 指令与 MOV A,R1指令结果相同。,(3)DB 从指定单元开始定义(存储)若干个字节的数据或ASCII码字符,常用于定义8位数据常数表。格式:操作码 操作数 DB 字节常数或ASCII字符例:ORG 1000HDB34H,73,A,BDB0AH,0BH,20则(1000H)34H(1001H)49H(1002H)41H(1003H)42H(1004H)0AH(1005H)0BH(1006H)14H,(4)DW 定义字指令 定义程序存储器中存放的若干个字的数据或ASCII码字符16位常数表格式 DW。,例3 ORG 2200H DW 1246H,7BH,10 则(2200H)12H(2201H)46H(2202H)00(2203H)7BH(2204H)00(2205H)0AH(5)BIT 定义位地址指令 格式 BIT 例4 ABC BIT P1.0 Q4 BIT P2.2 则汇编后,位地址P1.0,P1.2分别赋给变量ABC和Q4。(6)END 汇编结束指令,(7)DATA定义标号数值为指令 格式:标号 操作码 操作数 符号名称 DATA 表达式如 MN DATA 3000H;MN相当于3000HDATA与EQU的区别在于前者可以先使用后定义而后者不行,必须先定义才能使用。(8)DS定义存储空间指令 功能:从指定地址开始保留DS之后表达式的值所规定的存储单元。格式:标号 操作数 DS 表达式例:P105 例7,判断框 连接点 图:常用流程图符号,美国国家标准化协会ANSI(American National Standard Institute)设定了一些常用的流程图符号如图所示:,起止框 或 流程线,输入输出框 处理框,5.1.3 汇编语言程序设计步骤,一.分析工作任务、确定方案和计算方法二.了解应用系统的硬件配置、性能指标。三.建立系统数学模型,确定控制算法和操作步骤。四.画程序流程图 表示程序结构和程序功能,五.编制源程序1.合理分配存储器单元和了解I/O接口地址。2.按功能设计程序,明确各程序之间的相互关系。3.用注释行说明程序,便于阅读和修改调试和修改。,52 顺序与循环程序设计,5.2.1 顺序程序设计(又称简单程序)既无分支,又无循环,按照顺序执行 可完成一定的基本功能,是编写复杂程序的基础,常用程序结构:顺序程序、循环程序、分支程序、查表程序、子程,例1:将一个字节内的两个BCD码拆开并变成ASCII码,存入两个RAM单元。BCD码放在内RAM的20H,转换后高半字节放到21H,低字节放22H。,BCDH BCDL,0011,0011,BCD码09对应的ASCII码为30H39H转换时,将20H中的BCD码拆开,高四位置为“0011”即可。,BCDH,BCDL,上页,下页,回目录,即:采用先把20H中低4位BCD码交换出来加以转换、存放,然后再把高4位BCD码交换至低4位加以转换、存放。,程序:,0011 BCDH,0000 0000,;两个BCD数送A,;BCDL数送22H,;完成转换,;BCDH数送A的低4位,;完成转换,;存数,BCDH BCDL,BCDL,0000,0011,0000,BCDH,0011,上页,下页,回目录,5.2.2 循环程序包含多次重复执行的程序段,循环结构使程序紧凑。,各个环节任务:一初始化部分(循环初态)循环准备工作。如:清结果单元、设指针、设循环控制变量初值等。,二循环体循环工作部分:需多次重复处理的工作。循环控制部分:1.修改指针和循环控制变量。2.检测循环条件:满足循环条件,继续循环,否则退出循环。三.结束部分 处理和保存循环结果。允许0次循环的循环结构:在循环工作之前检测循环条件。,简单循环结构:循环体中不套循环。,定时例2:试计算下列程序段执行时间。程序 指令执行周期 MOV R7,#64H 1TLOOP:NOP 1T NOP 1T DJNZ R7,LOOP 2T,解:上述程序显然属于循环程序,其算法结构如图所示。循环次数100次,根据每条指令的执行周期可得每次循环消耗1+1+2=4(机器周期),加上第一条指令,整个程序段共计消耗时间为(4100+1)T=401T,当晶振频率为6MHZ时,T=2s,故上述程序实际消耗802s。,多重循环循环体中套循环结构。以双重循环使用较多。,软件延时程序。用循环程序将指令重复多次执行,实现软件延时。,试计算延时程序的执行时间。源程序指令周期(M)指令执行次数,DELAY:MOV R6,#64H1I1:MOV R7,#0FFH1I2:DJNZ R7,I22 DJNZ R6,I12 RET2,延时时间计算:(设时钟f=12MHz,M=1s)t=(11+1100+2100255+2100+21)M=51.3 ms,11001002551001,习题:试计算延时程序的执行时间。源程序指令周期(M)指令执行次数,DELAY:MOV R6,#1001D1:MOV R7,#101D2:NOP1 DJNZ R7,D22 DJNZ R6,D12 RET2计算延时程序的执行时间(设时钟f=6MHz)。,53 分支程序设计,5.3.1 分支程序设计综述分支程序应用要点是正确使用转移指令,通常有如下3种指令。1.无条件转移:与以执行程序的结果无关,只要给出正确的转移目标地址或偏移量即可 2.条件转移:根据已执行程序对特殊或特定存储器的影响结果来决定程序的走向。3.散转:根据某种已输入的或运算的结果,是程序转到各个处理程序中,例3 设5AH单元中有一变量X,请编写计算下述函数式的程序,结果存入5BH单元,Y=3X,X 15,5.3.2 无条件/条件转移程序,ORG 200H MOV A,5AH ADD A,5AH;2XA MOV R1,A MOV A,5AH;重新把X装入A CJNE A,#10,L1L1:JC L2;X15 CJNE A,#10H,L3;与16比L3:JNC L4;X15转L4 MOV A,R1 ADD A,#10;10X15,Y2X10,MOV R0,A SJMP L4L2:MOV A,R1 ADD A,5AH;X10,Y=3X MOV R0,AL4:MOV 5BH,R0;存结果 SJMP$END,例4:空调机制冷时,若排出的空气温度比吸入的空气 温度低8则认为工作正常,否则便认为是故障,并设置故障标志。,解:,为了可靠的监控空调机的工作情况,做两次减法:第一次(40H)-(41H),若CY=1,则肯定有故障;第二次两个温度的差值减去8,若CY=1,则肯定有故障,程序的流程图如下:,上页,下页,回目录,首先定义一些工作单元,流程图:,上页,下页,回目录,故 障,正常,程序:,;A(40H)-(41H),;CY=1,则故障,;是则故障,;温度小于8?,;工作正常标志,;转出口,;设置故障标志,若CY1顺序执行,CY=1转移,CY=1转移,若CY1顺序执行,上页,下页,回目录,5.3.3 散转程序设计,例5 根据R3的内容,转向各个操作程序。R30,转入OPR0 R31,转入OPR1.R3n,转入OPRn 解:程序清单如下。MOV DPTR,TAB1;跳转表首地址送数据指针 MOV A,R3;R32 A(修正变址值)ADD A,R3 JNC NOAD;判有否进位 INC DPH;有进位则加到高字节地址NOAD:JMP ADPTR;转向形成的散转地址入口TAB1:AJMP OPR0;转移到OPR0 AJMP OPR1.AJMP OPRn,5.4 查表程序,上页,下页,回目录,对于复杂参数的计算如:,非线性参数,对数、指数、三角函数,微分、积分等,用汇编编程十分困难,甚至无法建立数学模型,用查表的方法简单容易,80C51指令系统中有两条指令具有极强的查表功能,(1)MOVC A,A+DPTR,作基址寄存器,作变址寄存器,长查表指令,寻址64KB,(2)MOVC A,A+PC,作基址寄存器,作变址,短查表指令页内查表指令,指向表格首址,指向表格的第 i 项,第i项加变址调整值,例6:一个十六进制数放在HEX单元的低四位,将其转换成ASCII码,查表程序:,解:,十六进制 09 的ASCII码为 30H39H,AF 的ASCII码为 41H46H,,利用查表指令 MOVC A,A+DPTR,MOVC A,A+PC,先用伪指令 DB 或 DW 把表格的数据存入ROM,上页,下页,回目录,来获得数据,ASCII码表格的首址为ASCIITAB,上页,下页,回目录,编程1:,0 1 2 3 4 5 6 7 8 9,A B C D E F,(A)=3,33H,(A)=15,46H,例1 设计一个将16进制数转换成ASCII码的子程序,设16进制数存放在R0的低4位,要求将转换后的ASCII码送回R0。,ORG 30HMOV A,R0ANL A,0FH;保留低4位ADD A,2;变址调整MOVC A,APC;查表获取ASCII码值MOV R0,ARETTAB:DB 30H,31H,32H,33H,34H,35HDB 36H,37H,38H,39H,41H,42H,43H,44H,45H,46H,5.5 子程序设计,一、子程序的概念,把能完成某种基本操作并具有相同操作的程序段单独 编成子程序。如:函数、运算、代码转换、延时等,利用调用子程序指令(ACALL或LCALL)和从子程序返回指令RET,使用子程序的优点,不必重复书写同样的程序,提高编程效率,程序的逻辑结构简单,便于阅读,缩短了源程序和目标程序的长度,节省了存储器空间,使程序模块化、通用化、便于交流共享资源,便于按某种功能调试,上页,下页,回目录,二、调用子程序的要点,子程序开头的标号段必须有一个标志,该标志既是子程序的名字又是其入口地址,以便主程序调用。,在主程序中利用指令ACALL或LCALL可转入子程序。该指令具有保护断点的功能,例如:调用延时子程序,LCALL(ACALL)DELY,子程序结尾必须使用一条从子程序返回指令RET,它具有恢复断点的功能,主程序,CALL断点,子程序,RET,1、子程序的结构,上页,下页,回目录,子程序特点:功能上有通用性,结构上有独立性,2、正确的参数传递,在调用一个子程序时,主程序应先把有关参数放到某些约定的位置(如累加器、工作寄存器等),子程序运行时,可以从约定的位置得到有关参数。子程序结束前,也应把处理结果送到约定位置,上页,下页,回目录,3、子程序的通用性,为了使程序具有一定的通用性,子程序的操作对象应尽量采用地址或寄存器形式,而不用立即数形式。,4、现场保护,现场保护:如果子程序使用的寄存器与主程序使用的寄存器 有冲突,在转入子程序前,特别是进行中断服务 子程序时,要进行现场保护。,保护内容:主程序使用的内部 RAM 内容,各工作寄存器内容,累加器 A 和 DPTR 以及 PSW 等寄存器内容。,保护方式:将要保护的单元压入堆栈。,上页,下页,回目录,中断保护时:还可以用 RS1 RS0 来选择其他通用寄存器组,以便保护主程序现场。,R0 R7,5.5.2 子程序设计,例1 用程序实现c a2b2。设a、b均小于10。a存在31H单元中,b存在32H单元,把c存入33H单元。解:因本题二次用到平方值,所以在程序中采用把求平方的程序段编为子程序的方法。依题意编写主程序和子程序如下:,地址 机器码 源程序 ORG 200H 200 75 81 3F MOV SP,3FH;设堆栈指针 203 E5 31 MOV A,31H;取a值 205 12 04 00 LCALL SQR;求a2 208 F9 MOV R1,A;a2值暂存R1 209 E5 32 MOV A,32H;取b值 20B 12 04 00 LCALL SQR;求b2 20E 29 ADD A,R1;求a2b2 20F F5 33 MOV 33H,A;存入33H,;子程序 地址 机器码 源程序 ORG 400H 400 04 SQR:INC A 401 83 MOVC A,APC 402 22 RET 403 1 4 9 16 TAB:DB 0,1,4,9,16 408 25 36 49 DB 25,36,4940B 64,81 DB 64,81,子程序的嵌套,子程序的嵌套:子程序中可调用其他子程序,例如:数据处理程序如下,上页,下页,回目录,多重嵌套的过程,*PC0L,*PC0H,*PC1L,*PC1H,*PC2H,*PC2L,主程序,LCALL SUB1,继续主程序,*PC0,断点入栈,LCALL SUB2,*PC1,断点入栈,LCALL SUB3,*PC2,断点入栈,RET,弹出断点,RET,弹出断点,RET,弹出断点,上页,下页,回目录,栈 底,子程序与主程序的概念是相对的,在一个子程序中又可调用其它子程序,这就是子程序的多重嵌套。,堆栈的设置是十分重要的,例1 多字节无符号数减法子程序NSUB,功能:n字节无符号数减法,出口:(R0)=差数高字节地址指针,上页,下页,回目录,5.6 综合编程举例,流程图:,程序:,上页,下页,回目录,例2 双字节无符号数快速乘法子程序MULD,功能:双字节无符号数乘法,积为32位,出口:(R0)=乘积的高字节地址指针,上页,下页,回目录,编程思路与手乘法相似:,被乘数,乘数,上页,下页,回目录,bdH,bdL,adH,adL,bcL,bcH,acL,acH,bdL,acH,相乘过程,上页,下页,回目录,程序,上页,下页,回目录,上页,下页,回目录,例3 P1.0端口输出1kHZ和2kHZ的变频音调,每隔1S交替变换一次。,DLV:MOV R2,08;1kHZ的持续时间DLV1:MOV R3,0FAH DLV2:CPL P1.0;输出1kHZ方波 LCALL D0.5ms;延时D0.5ms,省略 DJNZ R3,DLV2 DJNZ R2,DLV1;持续1s MOV R2,#16DLV3:MOV R3,#0FAHDLV4:CPL P1.0;输出2kHZ方波 LCALL D0.25ms DJNZ R3,DLV4 DJNZ R2,DLV3;持续1s SJMP DLV;反复循环,