第4章汇编语言程序设计知识2.ppt

上传人:本田雅阁 文档编号:2909559 上传时间:2019-06-04 格式:PPT 页数:56 大小:332.52KB
返回 下载 相关 举报
第4章汇编语言程序设计知识2.ppt_第1页
第1页 / 共56页
第4章汇编语言程序设计知识2.ppt_第2页
第2页 / 共56页
第4章汇编语言程序设计知识2.ppt_第3页
第3页 / 共56页
第4章汇编语言程序设计知识2.ppt_第4页
第4页 / 共56页
第4章汇编语言程序设计知识2.ppt_第5页
第5页 / 共56页
点击查看更多>>
资源描述

《第4章汇编语言程序设计知识2.ppt》由会员分享,可在线阅读,更多相关《第4章汇编语言程序设计知识2.ppt(56页珍藏版)》请在三一文库上搜索。

1、第四章,汇编语言程序设计知识,主讲:康科锋,第四章 汇编语言程序设计及知识,4.1 编程的步骤 4.2 伪指令,4.3 编程的方法和技巧 4.4 汇编语言程序的基本结构,4.1 编程的步骤,1、分析问题,对需要解决的问题进行分析,以求对问题有正确的理解。 解决问题的任务是什么? 工作过程? 现有的条件,已知数据,对运算的精度和速 度方面的要求? 设计的硬件结构是否方便编程?,4.1 编程的步骤,2、确定算法, 算法是如何将实际问题转化成程序模块来处理。 在编程以前,先要对几种不同的算法进行分 析、比较,找出最适宜的算法。,4.1 编程的步骤,3、画程序流程图, 程序流程图是使用各种图形、符号、

2、有向线段等来说明程序 设计过程的一种直观的表示。 画流程图是程序结构设计是采用的一种重要手段。 流程图步骤分得越细致,编写程序是也越方便。 一个系统软件有总的流程图(主程序框图)和局部的流程图。 流程图常采用的图形和符号。,椭圆框,或桶形框,:表示程序的开始或结束。,矩形框,:表示要进行的工作。,菱形框,:表示要判断的事情,菱形框内的 表达式表示要判断的内容。,圆圈,:表示连接点,指向线,:表示程序的流向,流程图常采用的图形和符号,开始,将学生成绩存入 累加器A中,比较(A)与#60的大小 (A)=#60?,增加R1的值,打印学生成绩,(A)#60?,增加R2的值,结束,YES,YES,NO,

3、NO,4.1 编程的步骤,4、编写程序,用89C51汇编语言编写的源程序行(一条语句)包括四个部分,也叫四个字段: 标号:操作码操作数;注释 每个字段之间要用分隔符分隔,而每个字段内部不能使用分隔符。可以用作分隔符的符号:空格“ ”、冒号“:”、逗号“,”、分号“;”等。 例:LOOP:MOV A,#00H ;立即数00HA,4.1 编程的步骤,4、编写程序,标号:操作码操作数;注释,出现在助记符之前的,是由用户定义的一个字符串。 标号可以由赋值伪指令赋值,如果没有赋值,汇编程序把存放该指令目标码第一字节的存储单元的地址赋给该标号,所以,标号又叫指令标号。 一条指令的标号是该条指令的符号名字,

4、标号的值是汇编这条指令时指令的地址,代表16位长的ROM地址编码。 并不是每一条语句都需要标号,只有那些欲被引用的语句才需要。,(1)标号,4.1 编程的步骤,4、编写程序,标号:操作码操作数;注释,对于标号的限定: 最多可由31个字符构成,字符可以是英文字母(一般不区 分大小写)、阿拉伯数字和其他字符(“?”和“_”); 第一字符必须是非数字; 后面跟冒号“:”; 一个标号在程序中只能定义一次; 标号不能为指令助记符、伪指令、SFR名称等系统保留字。,(1)标号,4.1 编程的步骤,4、编写程序,标号:操作码操作数;注释,(2)操作码,操作码是必不可少的。 它用一组字母符号表示指令的操作码。

5、在89C51中,由指令助记符组成。 一般留出标号字段的空位,以便与标号相区别。,4.1 编程的步骤,4、编写程序,标号:操作码操作数;注释,(3)操作数,汇编语言指令可能要求或不要求操作数,所以这一字段可能有也可能没有。 若有两个操作数,操作数之间用逗号“,”分开。 操作数字段的内容复杂多样,可能包括:, 工作寄存器:由RS0和RS1规定的当前工作寄存器区中的R0R7。 特殊功能寄存器:21个特殊功能寄存器SFR的名字。 标号名: 赋值标号 由汇编指令EQU等赋值的标号; 指令标号 指令标号指示的指令的第一字节地址是该标号的值。 $:用来表示程序计数器的当前值。,4.1 编程的步骤,(3)操作

6、数, 符号, 可为二进制(B)、八进制(O)、十进制(D)、十六进制(H) 或字符串。,4.1 编程的步骤,(3)操作数, 数值, 汇编时,计算出表达式的值填入目标码。, 一般缺省情况下,汇编器默认的数值是十进制数值; 若常数以字符AF开头,必须在其前面加“0”作为引导,以便 与标号或符号名相区别。, 表达式,4.1 编程的步骤,4、编写程序,标号:操作码操作数;注释,(4)注释,注释部分不是汇编语言的功能部分,只是用语增加程序的可读性。 良好的注释是汇编语言程序编写中的重要组成部分。 由“;”或“/*/”表示。,5、上机调试,4.2 伪指令,伪指令不是真正的指令,它主要是为汇编程序服务的,在

7、汇编过程中起控制作用的指示性语句。无地址、无对应的机器码,在汇编时不产生目标程序。,ORG 汇编起始地址命令 END 汇编语言程序结束伪指令 EQU 赋值伪指令 DB 定义字节伪指令 DW 定义字伪指令 BIT 位地址符号伪指令 DATA 定义标号数值伪指令,1、ORG 汇编起始地址命令,格式:ORG 16位地址 功能:规定该伪指令后面程序的汇编地址,即汇编后生成目 标程序存放的起始地址。 例如: ORG 2000H START:MOV A,#64H 规定了START的地址是2000H,又规定了汇编后的第一条指令码从2000H开始存放。,注意:在一个源程序中,可以多次使用ORG指令,来规定不同

8、的程序段的起始地址。但是,地址必须由小到大排列,不能交叉、重叠。,4.2 伪指令,2、END 汇编结束命令,格式:END 功能:通知汇编程序结束汇编。在END之后所有的汇编指令均 不予以处理。,4.2 伪指令,3、EQU 赋值命令,格式:字符名称 EQU 项(数或汇编符号) 功能:把“项”赋给“字符名称”。 注意:字符名称不等于标号(其后没有冒号);其中的项,可以是数,也可以是汇编符号。EQU赋值过的符号名可以用作数据、代码地址、位地址或一个立即数。可以是8位的,也可以是16位的。,4.2 伪指令,为程序的阅读、修改 和调试带来方便,3、EQU 赋值命令,例如:,例1: A_ASCII EQU

9、 A ;A_ASCII分配字符“A”的ASCII MOV A,A_ASCII ;值(41H=65),例2: A10 EQU 10 DELY EQU 07EBH MOV A,A10 ;A10作为片内的一个直接地址 LCALL DELY ;DELY作为一个16位子程序的入口地址,4.2 伪指令,4、DATA 数据地址赋值命令,格式:字符名称 DATA 表达式 功能:与EQU类似,但有以下差别: EQU定义的字符名必须先定义后使用,而DATA定义的字 符名可以后定义先使用。 用EQU指令可以把一个汇编符号赋给一个名字,而DATA 只能把数据赋给字符名。 DATA伪指令在程序中用来定义数据地址。,4.

10、2 伪指令,5、DB 定义字节命令,格式:DB 项或项表 功能:通知汇编程序从当前ROM地址开始,保留一个字或字节 串的存储单元,并存入DB后的数据。 注意:项或项表可以是一个字节,用逗号隔开的字节串或括在 单引号中的ASCII字符串。,4.2 伪指令,ORG 2000H DB 0A3H LIST:DB 26H,03H STR: DB ABC ,经汇编后:(2000H)=A3H, (2001H)=26H, (2002H)=03H, (2003H)=41H, (2004H)=42H, (2005H)=43H, (41H,42H,43H分别为A,B,C的ASCII码),5、DB 定义字节命令,例如

11、:,4.2 伪指令,查表程序 片外程序存储器从0050H单元开始存放有10位学生的成绩, 根据累加器A中的学号,查出该学生的成绩。,ORG 0000H LJMP MAIN ORG 0030H MAIN: MOV A, #05H MOV DPTR, #CJTAB MOVC A, A+DPTR SJMP $ ORG 0050H CJTAB: DB 98H, 74H, 83H, 85H, 77H DB 65H, 92H, 68H, 84H, 70H END,6、DW 定义字命令,格式:DW 16位数据项或项表 功能:把DW后的16位数据项或项表从当前地址连续存放。 每项数值为16位二进制数,高8位先

12、放,低8位后存 放。DW用于定义一个地址表。,ORG 1500H TABLE:DW 7234H,8AH,10H,H ,(1500H)=72H, (1501H)=34H, (1502H)=00H, (1503H)=8AH,(1504H)=00H, (1505H)=10H。 (1506H)=00H,(1507H)=48H (H的ASCII值),经汇编后:,4.2 伪指令,例如:,双字节,7、DS 定义存储空间命令,ORG 1000H DS 08H DB 30H,8AH,格式:DS 表达式 功能:在汇编时,从指定地址开始保留DS之后表达式的值所 规定的存储单元以备后用。 例如:,汇编后,从1000H

13、保留8个单元,然后从1008H按DB命令给内存赋值,即(1008H)=30H, (1009H)=8AH,4.2 伪指令,8、BIT 定义存储空间命令,A1 BIT P1.0 A2 BIT 02H,汇编后,P1口第0位的位地址90H就赋给了A1, 而A2的值则为02H。,格式:字符名 BIT 位地址 功能:把BIT后的位地址值赋给字符名。其中字符名不是标号, 其后没有冒号,但字符名是必须的。 例如:,4.2 伪指令,1、模块化的程序设计方法 2、编程技巧,4.3 编程的方法和技巧,1、模块化的程序设计方法,4.3 编程的方法和技巧,单个模块结构的程序功能单一,易于编写、调试和修改。 便于分工,从

14、而可使多个程序员同时进行程序的编写和调试工作,加快软件研制进度。 程序可读性好,便于功能扩充和版本升级。 对程序的修改可局部进行,其它部分可以保持不变。 对于使用频繁的子程序可建立子程序库,便于多个模块调用。,(1)程序功能模块化的优点,1、模块化的程序设计方法,4.3 编程的方法和技巧,每个模块应具有独立的功能,能产生一个明确的结果,即单模块的功能高内聚性。 模块之间的控制耦合应尽量简单,数据耦合应尽量少,即模块间的低耦合性。控制耦合是指模块进入和退出的条件及方式,数据耦合是指模块间的信息交换方式、交换量的多少及交换频繁程度。 模块长度适中。20条100条的范围较合适。,(2)划分模块的原则

15、,2、编程技巧,4.3 编程的方法和技巧,尽量采用循环结构和子程序。 尽量少用无条件转移指令。 对于通用的子程序,考虑到其通用性,除了用于存放子程序入口参数的寄存器外,子程序中用到的其他寄存器的内容应压入堆栈(返回前再弹出),即保护现场。 在中断处理程序中,除了要保护处理程序中用到的寄存器外,还要保护标志寄存器。 用累加器传递入口参数或返回参数比较方便,在子程序中,一般不必把累加器内容压入堆栈。,4.4 汇编语言程序的基本结构,1、顺序程序 2、分支程序 3、循环程序,4.4 汇编语言程序的基本结构,1、顺序程序,顺序程序是最简单的程序结构,也称直线程序。 程序按顺序一条一条地执行指令。这类程

16、序是所有复杂程序的基础。 要写出高质量的程序还是需要掌握一定的技巧,需要熟悉指令系统,正确地选择指令,最大限度地优化程序。,例: “两个BCD码相加” 完成:片内数据存储器30H、31H单元和40H、41H单元 存放有两个4位BCD码,将其相加,结果放在 50H、51H单元中。,05,47,50,E8,56,2F,31H,30H,41H,40H,51H,50H,ORG 0000H LJMP MAIN ORG 3000H MAIN:MOV A,31H ADD A, 41H DA A MOV 51H, A ;低字节相加 MOV A, 30H ADDC A, 40H DA A MOV 50H, A

17、;高字节相加 SJMP $,开始,低字节相加, 和放到51H中,高字节相加,加CY 和放到50H中,结束,例: “拆分字节程序” 完成:将片内RAM 20H单元的 内容拆分成两段,每段 4位,并将它们分别存 入21H与22H单元 中,将这两个单元 中空余高位补“0”。,ORG 0000H LJMP MAIN ORG 2000H START:MOV 21H, 20H ANL 21H, #0FH ;在21H做逻辑 “与”,清高4位 MOV A, 20H SWAP A ;在A中进行高、 低字节互换 ANL A, #0FH MOV 22H, A,4.4 汇编语言程序的基本结构,2、分支程序,程序分支是

18、通过条件转移指令实现的,即根据条件对程序的执行进行判断、满足条件则进行程序转移,不满足条件就顺序执行程序。 分支程序又分为单分支和多分支结构。 多分支程序是首先把分支程序按序号排列,然后按序号值进行转移。,在MCS-51指令系统中,通过条件判断实现单分支程序转移的指令有:JZ、JNZ、CJNE、DJNZ等。此外还有以位状态作为条件进行程序分支的指令,如JC、JNC、JB、JNB、JBC等。使用这些指令可以完成0、1、正、负,以及相等、不相等作为各种条件判断依据的程序转移。,4.4 汇编语言程序的基本结构,JMP_128:MOV A,R3 RL A MOV DPTR,#JMPTAB JMP A+

19、DPTR JMPTAB:AJMP ROUT00 AJMP ROUT01 AJMP ROUT7F,例: 128种分支转移程序。 功能:根据入口条件转移到128个目的地址。 入口:(R3)=转移目的地址的序号00H7FH。 出口:转移到相应子程序入口。,128个子程序首址,;A循环左移一位,相当于2,说明: 此程序要求128个转移目的地址(ROUT00 ROUT7FH)必须驻留在与绝对转移指令AJMP相同的一个2KB存储区内。 RL指令对变址部分乘以2,因为每条AJMP指令占两个字节。,例: 比较片内数据存储器30H 和31H单元的两个无符 号数的大小,将较大 者存入32H单元。,开始,(A)(3

20、0H),(A) (31H)?,(31H)? CY=0?,(A)(31H),(32H)(A),结束,n,Y,y,N,ORG 0000H LJMP MAIN ORG 0030H MAIN: XA EQU 30H XB EQU 31H XC EQU 32H MOV A, XA CJNE A, XB, COMP COMP: JNC BIG MOV A, XB BIG: MOV XC, A SJMP $ END,4.4 汇编语言程序的基本结构,3、循环程序,在程序运行时,有时需要连续重复执行某段程序,可以使用循环程序。其结构包括四部分: 置循环初值 循环体(循环工作部分) 修改控制变量 循环控制部分 其

21、组织方式如图4-2所示。,(a)组织方式1,(b)组织方式2,图4-2 循环组织方式流程图,(1)置循环初值,4.4 汇编语言程序的基本结构,3、循环程序,对于循环程序中所使用的工作单元,在循环开始时应置初值。,例如,工作寄存器设置计数初值,累加器 A清0,以及设置地址指针、长度等。,(2)循环体(循环工作部分),4.4 汇编语言程序的基本结构,3、循环程序,重复执行的程序段部分,分为循环工作部分和循环控制部分。,循环控制部分每循环一次,检查结束条件, 当满足条件时,就停止循环,往下继续执行 其他程序。,(3)修改控制变量,4.4 汇编语言程序的基本结构,3、循环程序,在循环程序中,必须给出循

22、环结束条件。 常见的是计数循环,当循环了一定的次数后,就停止循环。 在单片机中,一般用一个工作寄存器Rn作为计数器,对该计数器赋初值作为循环次数。每循环一次,计数器的值减1,即修改循环控制变量,当计数器的置件为0时,就停止循环。,(4)循环控制部分,4.4 汇编语言程序的基本结构,3、循环程序,根据循环结束条件,判断是否结束循环。,89C51可采用DJNZ指令来自动修改控制变 量并能结束循环。,若循环程序的循环体中不再包含循环程序,即为单重循环程序。如果在循环体中还包含循环程序,那么这种现象称为循环嵌套。 注意:多重循环程序中,只允许外重循环嵌套内重循环程序,不允许循环互相相交,也不允许从循环

23、程序的外部跳入循环程序的内部。,4.4 汇编语言程序的基本结构,3、循环程序,例: 从22H单元开始有一无符号数据块,其长度为20H单元, 求出数据块中最大值,并存入21H单元。,源程序: ORG 2000H MOV R2,20H MOV R1,#22H CLR A LP: CLR C SUBB A,R1 ;比较A与(R1) JNC NEXT MOV A,R1 ;大数放A SJMP NEXT1 NEXT: ADD A,R1 ;恢复A中数,思考:如何在该例的基础上改为求最小值?,NEXT1: INC R1 DJNZ R2,LP MOV 21H,A LP1: SJMP LP1 END,例:比较片内

24、数据存储器30H和31H单元的两个无符号数的 大小,将较大者存入32H单元。,源程序: ORG 0000H LJMP MAIN ORG 0030H MAIN: MOV 30H, #12H MOV 31H, #34H MOV A, 30H CJNE A, 31H, COMP COMP: JNC BIG MOV A, 31H BIG: MOV 32H, A SJMP $ END,例:编写程序,将30H、31H、32H单元中的3个数按从小到大 的顺序排列,结果仍存放在这3个单元,开始,30H内容送入A中,把A的值送30H,结束,YES,YES,NO,NO,比较(A)与31H的大小 CY=1?,30H

25、32H内容存入 数值,交换A与31H值,比较(A)与32H的大小 CY=1?,YES,NO,交换A与32H值,比较(A)与32H的大小 CY=1?,31H内容送入A中,交换A与32H值,把A的值送31H,ORG 0000H LJMP 0030H ORG 0030H MOV 30H,#12H MOV 31H,#8H MOV 32H,#5H MOV A, 30H CJNE A, 31H, LD1 LD1: JC LD2 ;(A)=31H时A与31H内容交换 LD2: CJNE A, 32H, LD3 LD3: JC LD4 ;A=31H时A与31H内容交换,LD4: MOV 30H, A ;把最小数存入30H MOV A, 31H ;开始下一次比较 CJNE A, 32H, LD5 LD5: JC LD6 ;A=32H时A与31H内容交换 LD6: MOV 31H,A ; END,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1