《第四章语言程序设计课件.ppt》由会员分享,可在线阅读,更多相关《第四章语言程序设计课件.ppt(43页珍藏版)》请在三一办公上搜索。
1、第四章 汇编语言程序设计,提要,程序设计概述汇编语言源程序的编辑和汇编汇编语言程序设计,2022年12月4日,2,第1节 程序设计概述,1、程序设计语言简介2、汇编语言程序设计初步,2022年12月4日,3,1、程序设计语言简介,常用的编程语言是汇编语言和高级语言。1汇编语言用英文字符来代替机器语言,这些英文字符被称为助记符汇编语言:用助记符表示的指令。汇编语言源程序:用汇编语言编写的程序。优点:用汇编语言编写程序效率高,占用存储空间小,运行速度快,能编写出最优化的程序。缺点:可读性差,离不开具体的硬件,是面向“硬件”的语言通用性差。,2022年12月4日,4,1、程序设计语言简介,2高级语言
2、不受具体“硬件”的限制,优点:通用性强,直观、易懂、易学,可读性好。目前多数的51单片机用户使用C语言(C51)来进行程序设计,已公认为高级语言中高效简洁而又贴近51单片机硬件的编程语言。将C语言向单片机上移植,始于20世纪80年代的中后期。,汇编语言设计步骤,(1)分析题意,明确要求(2)确定算法(3)画程序流程图(4)分配内存工作单元(5)编写源程序(6)程序优化(7)上机调试、修改和最后确定源程序,4.2 汇编语言源程序的编辑和汇编,伪指令源程序的编辑和汇编,1、伪指令,(1)指令语句已在第3章介绍。每一指令语句在汇编时都产生一个指令代码(机器代码),执行该指令代码对应着机器的一种操作。
3、(2)伪指令语句是控制汇编(翻译)过程的一些控制命令。在汇编时没有机器代码与之对应。下面介绍伪指令语句。,1、伪指令,1ORG(ORiGin)汇编起始地址命令源程序的开始,用一条ORG伪指令规定程序的起始地址。如果不用ORG,则汇编得到的目标程序将从0000H地址开始。例如:ORG2000HSTART:MOVA,#00H 即规定标号START代表地址为2000H开始。在一源程序中,可多次用ORG指令,规定不同的程序段的起始地址。但是,地址必须由小到大排列,且不能交叉、重叠。,例如:ORG2000HORG2500HORG3000H这种顺序是正确的。若按下面顺序的排列则是错误的,因为地址出现了交叉
4、。ORG2500HORG2000HORG3000H,1、伪指令,2. END(END of Assembly)汇编终止命令源程序结束标志,终止源程序的汇编工作。整个源程序中只能有一条END命令,且位于程序的最后。如果END出现在程序中间,其后的源程序,将不进行汇编处理。,1、伪指令,3DB(Define Byte)定义数据字节命令格式:标号: DB 8位字节数据表用于从(标号)指定的地址开始,在程序存储器连续单元中定义字节数据。例如:ORG1000HDB-2,-4,100,30H,C,A,1、伪指令,4、DW(Define Word)定义字数据命令该命令用于从指定的地址开始,在程序存储器的连续
5、单元中定义16位的字数据。例如:ORG2000HDATA:DW1246H,7BH,10汇编后(2000H)=12H(2001H)=46H;第1个字(2002H)=00H(2003H)=7BH;第2个字(2004H)=00H(2005H)=0AH;第3个字,1、伪指令,5DS(Define Storage)定义存储区命令从指定地址开始,保留指定数目的字节单元作为存储区,供程序运行使用。例如:TABEL:DS10表示从TABEL代表的地址开始,保留10个连续的地址单元。又例如:ORG2000HDS10 H表示从2000H地址开始,保留16个连续地址单元。,2022年12月4日,14,1、伪指令,6
6、EQU(EQUate)标号赋值命令用于给标号赋值。赋值后,标号值在整个程序有效。例如:TEST:EQU 2000H表示TEST=2000H,汇编时,凡是遇到TEST时,均以2000H来代替。,2022年12月4日,15,2、源程序的编辑和汇编,1、源程序的编辑2、源程序的汇编,2022年12月4日,16,4.3汇编语言程序设计,顺序结构分支结构循环结构子程序结构,2022年12月4日,17,4.3.1顺序结构,例:两个无符号双字节数相加。 设被加数存放于内部RAM的40H(高位字节), 41H(低位字节), 加数存放于50H(高位字节), 51H(低位字节), 和数存入 40H和41H单元中。
7、,2022年12月4日,18,程序如下: START: CLR C ; 将Cy清零 MOV R0, 41H ; 将被加数地址送数据指针R0 MOV R1, 51H ; 将加数地址送数据指针R1 AD1: MOV A, R0 ; 被加数低字节的内容送入AADD A,R1 ; 两个低字节相加MOV R0, A ; 低字节的和存入被加数低字节中 DEC R0 ; 指向被加数高位字节 DEC R1 ; 指向加数高位字节 MOV A, R0 ; 被加数高位字节送入AADDC A, R1 ; 两个高位字节带Cy相加 MOV R0, A ; 高位字节的和送被加数高位字节,2022年12月4日,19,4.3.
8、2分支程序设计,2022年12月4日,20,(a) 单分支流程; (b) 多分支流程,例 设变量X存放在内部RAM 30H单元,函数值Y存入内部RAM 31单元。试编程,按照下式的要求给赋值。,2022年12月4日,21,2022年12月4日,22,开始,AX,A=0,A0,A=-1,A=1,存结果,结束,Y,N,N,Y,,;,:,:,,2022年12月4日,23,4.3.3循环程序设计,2022年12月4日,24,循环的组成,循环程序一般由四个主要部分组成: (1) 初始化部分: 为循环程序做准备, 如规定循环次数、 给各变量和地址指针预置初值。 (2) 处理部分: 为反复执行的程序段, 是
9、循环程序的实体, 也是循环程序的主体。 (3) 循环控制部分: 这部分的作用是修改循环变量和控制变量, 并判断循环是否结束, 直到符合结束条件时, 跳出循环为止。 (4) 结束部分: 这部分主要是对循环程序的结果进行分析、 处理和存放。,2022年12月4日,25,例:编写多字节无符号数加法程序设有两个多字节无符号数分别存放在内部RAM的DAT1和DAT2开始的区域中(低字节先存),字节个数放在R2中,求它们的和,并将结果存放在DAT1开始的区域中。,2022年12月4日,26,2022年12月4日,27,开始,循环初始化,读取被加数,两数相加,传送部分和到目的单元,指向下一个被加数和加数,全
10、部相加完毕,处理高字节进位,结束,N,Y,ORG 0400H MOV R0,#DAT1 MOV R1,#DAT2 CLR CLOOP:MOV A,R0 ADDC A,R1 MOV R0,A INC R0 INC R1 DJNZ R2,LOOP CLR A ADDC A,#0 MOV R0,A END,2022年12月4日,28,多重循环,例 5 秒延时程序。 延时程序与 MCS - 51 执行指令的时间有关, 如果使用 12 MHz晶振, 一个机器周期为 1 s, 计算出一条指令以至一个循环所需要的执行时间, 给出相应的循环次数, 便能达到延时的目的。5 秒延时程序如下:,2022年12月4日
11、,29,DELAY: MOV R5, 50 DEL0: MOV R6, 200#4990153 9980306 DEL1: MOV R7, 248 DEL2: DJNZ R7, $;DEL2 DJNZ R6, DEL1 DJNZ R5, DEL0 RET,2022年12月4日,30,4.3.4 子程序设计,子程序的概念 通常把那些基本操作功能编制为一个独立夫人程序段, 这些就是可供不同程序或同一程序反复调用的子程序。在程序中需要执行这种操作的地方放置一条调用指令, 当程序执行到调用指令, 就转到子程序中完成规定的操作, 并返回到原来的程序继 续执行下去。,2022年12月4日,31,子程序结构
12、与设计注意事项,子程序中必须有一条子程序返回指令(RET),其功能是当子程序执行完后能自动返回到主程序中去。注意事项:(1)子程序名(2)明确入口条件、出口条件(3)注意保护现场和恢复现场,2022年12月4日,32,子程序的调用与返回,子程序的调用 调用子程序的指令有“ACALL”和“LCALL”, “LCALL”:16位入口地址 “ACALL”:11位入口地址,另5位由PC提供执行调用指令时, 先将程序地址指针PC改变(“ACALL”加 2, “LCALL”加 3), 然后 PC值压入堆栈, 用新的地址值代替。执行返回指令时, 再将 PC值弹出。 ,2022年12月4日,33,子程序调用中
13、, 主程序应先把有关的参数存入约定的位置, 子程序在执行时, 可以从约定的位置取得参数, 当子程序执行完, 将得到的结果再存入约定的位置, 返回主程序后, 主程序可以从这些约定的位置上取得需要的结果, 这就是参数的传递。子程序的调用涉及到堆栈,在主程序中必须要正确设置堆栈指针。子程序嵌套是指在子程序执行过程中,还可以调用另一个子程序。,2022年12月4日,34,例4-13 用程序实现C=A*A+B*B。设A和B均小于10,A存在内部RAM31H单元,B存在内部RAM 32H,把C存入内部RAM 33H单元。解:本题中包含2个求平方值,把求平方设计为子程序。子程序名称:SQR功能:求小于10的
14、数的平方(查表法)入口参数A,出口参数A,2022年12月4日,35,主程序: ORG 0800H MOV SP,#60H MOV A,31H LCALL SQR MOV R1,A MOV A,32H LCALL SQR ADD A,R1 MOV 33H,A SJMP$,2022年12月4日,36,ORG 0900HSQR: ADD A,#01H MOVC A,A+PC RETTAB: DB 0,1,4,9,16 DB 25,36,49,64,81 END堆栈变化:画图说明,2022年12月4日,37,The End,习题:,4-6试编程将内部RAM 40H-60H单元内容传送到外部RAM以2
15、000H为首地址的存储区中4-7在外部RAM首地址为DATA的存贮器中,有10个字节的数据,试编程将每个字节的最高位无条件置“1”4-8 编写程序将外部RAM 3000H开始的13个单元中的数据隔一个传送到内部RAM30H开始的区域4-9编程将外部RAM地址为1000H-1030H的数据块全部搬迁到内部RAM 30H-60H中,并将原来数据全部清零。4-18设在外部RAM 2000H-2004H单元中,存放有5个压缩BCD码,试编程将它们转换成ASCII码,存放到以2005H为首地址的外部RAM中。4-21 根据图3-10,设计灯亮移位程序,要求8个发光二极管每次亮1个,点亮40ms。顺次循环
16、右移点亮,循环不止。4-22 根据图3-10,设计亮灯程序,要求8个发光二极管间隔分成2组,每组4个,2组交叉点亮,变换时间为100ms,反复循环不止。,2022年12月4日,39,2022年12月4日,40,该单片机系统的晶振频率为12MHz,3-14 已知(A)=5Bh,(R1)=40H,(40H)=C3H,(PSW)=81H,试写出各条指令单独执行结果,并说明程序状态字的状态。 (1) XCH A,R1 (2)XCHA,40H(3) XCHA,R1(4)XCHDA,R1(5) SWAPA(6)ADDA,R1(7) ADDA,40H(8)ADDA,#40H(9) ADDC A,40H(10
17、)SUBBA,40H(11)SUBB A,#40H3-18 编程完成下列操作(1)将外部RAM 1000H单元的所有位取反(2)将外部RAM 60H单元的高2位清零,低2位取反,其它位保持不变。,2022年12月4日,41,3-24 判断下列指令的正误,并说明原因(1)CLRA (2)CLRE0H(3)CLRACC(4)CLRACC.0 (5) CPL A(6) CPL E0H (7) CPLACC(8) CPL ACC.0,2022年12月4日,42,3-28 如图3-11所示,这是由89C51构建的系统,外部连接了4个按键S1S4及4个发光二极管LED1LED4,P1口的高4位用于接收按键的输入状态,低4位用于驱动发光二极管。请结合图示,编写程序,完成以下要求:(1)若S1闭合,则发光二极管LED1点亮;若S2闭合,则LED2点亮。以此类推,即发光二极管实时反映按键状态。(2)用4个发光二极管实现对按键键值的BCD编码显示。若S1闭合,键值为1,编码0001,LED1点亮;若S2闭合,键值为2,编码为0010,LED2点亮;若S3闭合,键值为3,编码0011,LED1、LED2同时点亮;若S4闭合,键值为4,编码0100,LED3点亮。,2022年12月4日,43,