2010-6-271第四章汇编语言程序设计通过前面的学习,我们已经了解了单片机内部的通过前面的学习,我们已经了解了单片机内部的通过前面的学习,我们已经了解了单片机内部的通过前面的学习,我们已经了解了单片机内部的结构,结构,结构,结构,MCS-51MCS-51MCS-51MCS-51指令系统的寻址方式、各类指令的格式指令系统的寻址方式、各类指令的格式指令系统的寻址方式、各类指令的格式指令系统的寻址方式、各类指令的格式及功能。及功能。及功能。及功能。下面我们就是要如何利用下面我们就是要如何利用下面我们就是要如何利用下面我们就是要如何利用MCS-51MCS-51MCS-51MCS-51的指令系统,来的指令系统,来的指令系统,来的指令系统,来编写高效、充分利用其特点的程序。编写高效、充分利用其特点的程序。编写高效、充分利用其特点的程序。编写高效、充分利用其特点的程序。2010-6-272§§§§4.14.14.14.1概述概述概述概述4.1.14.1.14.1.14.1.1程序设计语言程序设计语言程序设计语言程序设计语言1.1.1.1.机器语言机器语言机器语言机器语言2.2.2.2.汇编语言汇编语言汇编语言汇编语言3.3.3.3.高级语言高级语言高级语言高级语言2010-6-2734.1.24.1.24.1.24.1.2编制程序的步骤编制程序的步骤编制程序的步骤编制程序的步骤1.1.1.1.任务分析(硬件、软件系统分析)任务分析(硬件、软件系统分析)任务分析(硬件、软件系统分析)任务分析(硬件、软件系统分析)2.2.2.2.确定算法和工作步骤;确定算法和工作步骤;确定算法和工作步骤;确定算法和工作步骤;3.3.3.3.程序总体设计和流程图绘制程序总体设计和流程图绘制程序总体设计和流程图绘制程序总体设计和流程图绘制关于流程图符号:关于流程图符号:关于流程图符号:关于流程图符号:开始、结束开始、结束开始、结束开始、结束----------------圆角矩形圆角矩形圆角矩形圆角矩形工作任务工作任务工作任务工作任务----------------矩形矩形矩形矩形判断分支判断分支判断分支判断分支----------------菱形菱形菱形菱形程序流向程序流向程序流向程序流向----------------程序连接程序连接程序连接程序连接----------------开始结束2010-6-2744.4.4.4.分配内存,确定程序与数据区存放地址;分配内存,确定程序与数据区存放地址;分配内存,确定程序与数据区存放地址;分配内存,确定程序与数据区存放地址;5.5.5.5.编写源程序;编写源程序;编写源程序;编写源程序;6.6.6.6.调试、修改,最终确定程序。调试、修改,最终确定程序。调试、修改,最终确定程序。调试、修改,最终确定程序。2010-6-2754.1.34.1.34.1.34.1.3方法技巧方法技巧方法技巧方法技巧1.1.1.1.模块化设计(按功能分:显示、打模块化设计(按功能分:显示、打模块化设计(按功能分:显示、打模块化设计(按功能分:显示、打印、输入、发送等)印、输入、发送等)印、输入、发送等)印、输入、发送等)2.2.2.2.尽量采用循环及子程序结构(节省内存)尽量采用循环及子程序结构(节省内存)尽量采用循环及子程序结构(节省内存)尽量采用循环及子程序结构(节省内存)2010-6-2764.1.44.1.44.1.44.1.4汇编语言的规范汇编语言的规范汇编语言的规范汇编语言的规范1.1.1.1.汇编语言源程序由以下两种指令构成汇编语言源程序由以下两种指令构成汇编语言源程序由以下两种指令构成汇编语言源程序由以下两种指令构成�汇编语句(指令语句)汇编语句(指令语句)汇编语句(指令语句)汇编语句(指令语句)�伪指令(指示性语句)伪指令(指示性语句)伪指令(指示性语句)伪指令(指示性语句)2.2.2.2.汇编语句的格式:汇编语句的格式:汇编语句的格式:汇编语句的格式:标号标号标号标号::::操作码操作码操作码操作码操作数操作数操作数操作数;注释;注释;注释;注释数据表示形式:数据表示形式:数据表示形式:数据表示形式:二进制(二进制(二进制(二进制(BBBB)、十六进制)、十六进制)、十六进制)、十六进制(H)(H)(H)(H)、十进制、十进制、十进制、十进制(D(D(D(D或省略或省略或省略或省略))))、、、、ASCIIASCIIASCIIASCII码(以单引号标识)码(以单引号标识)码(以单引号标识)码(以单引号标识)2010-6-2773.3.3.3.伪指令:控制汇编用的特殊指令,这些指令不属伪指令:控制汇编用的特殊指令,这些指令不属伪指令:控制汇编用的特殊指令,这些指令不属伪指令:控制汇编用的特殊指令,这些指令不属于指令系统,不产生机器代码。于指令系统,不产生机器代码。于指令系统,不产生机器代码。于指令系统,不产生机器代码。2010-6-278常用的伪指令�ORGORGORGORG(Origin)(Origin)(Origin)(Origin)定位目的程序的起始地址。定位目的程序的起始地址。定位目的程序的起始地址。定位目的程序的起始地址。格式:格式:格式:格式:ORGORGORGORG表达式表达式表达式表达式如:如:如:如:ORG0000HORG0000HORG0000HORG0000H•注:表达式必须为注:表达式必须为注:表达式必须为注:表达式必须为16161616位地址值。位地址值。位地址值。位地址值。�ENDENDENDEND汇编语言程序结束伪指令。汇编语言程序结束伪指令。汇编语言程序结束伪指令。汇编语言程序结束伪指令。注:注:注:注:一定放在程序末尾!一定放在程序末尾!一定放在程序末尾!一定放在程序末尾!2010-6-279常用的伪指令�EQUEQUEQUEQU((((EQUEQUEQUEQUateateateate))))赋值伪指令。赋值伪指令。赋值伪指令。赋值伪指令。格式:格式:格式:格式:字符名称字符名称字符名称字符名称EQUEQUEQUEQU数值或汇编符号数值或汇编符号数值或汇编符号数值或汇编符号例:例:例:例:AAAAAAAAEQUEQUEQUEQU30H30H30H30HK1K1K1K1EQUEQUEQUEQU40H40H40H40HMOVAMOVAMOVAMOVA,,,,AAAAAAAA;;;;((((30H30H30H30H))))→→→→AAAAMOVAMOVAMOVAMOVA,,,,K1K1K1K1;;;;((((40H40H40H40H))))→→→→AAAA2010-6-2710常用的伪指令�DBDBDBDB((((DDDDefineefineefineefineBBBByteyteyteyte))))从指定单元开始定义(存储)若干个字节的数从指定单元开始定义(存储)若干个字节的数从指定单元开始定义(存储)若干个字节的数从指定单元开始定义(存储)若干个字节的数据或据或据或据或ASCIIASCIIASCIIASCII码字符,常用于定义数据常数表。码字符,常用于定义数据常数表。码字符,常用于定义数据常数表。码字符,常用于定义数据常数表。格式:格式:格式:格式:DBDBDBDB字节常数或字节常数或字节常数或字节常数或ASCIIASCIIASCIIASCII字符字符字符字符例例例例::::ORGORGORGORG1000H1000H1000H1000HDBDBDBDB34H34H34H34H,,,,0DEH0DEH0DEH0DEH,,,,’’’’AAAA’’’’,,,,’’’’BBBB’’’’DBDBDBDB0AH0AH0AH0AH,,,,0BH0BH0BH0BH,,,,202020202010-6-2711常用的伪指令�DWDWDWDW((((DDDDefineefineefineefine))))从指定单元开始定义(存储)若干个字的数据从指定单元开始定义(存储)若干个字的数据从指定单元开始定义(存储)若干个字的数据从指定单元开始定义(存储)若干个字的数据或或或或ASCIIASCIIASCIIASCII码字符。码字符。码字符。码字符。格式:格式:格式:格式:DWDWDWDW字常数字常数字常数字常数或或或或ASCIIASCIIASCIIASCII字符字符字符字符例:例:例:例:ORG2000HORG2000HORG2000HORG2000HDWDWDWDW1234H1234H1234H1234H,,,,’’’’BBBB’’’’DWDWDWDW0AH0AH0AH0AH,,,,202020202010-6-2712常用的伪指令�BITBITBITBIT位地址符号指令。位地址符号指令。位地址符号指令。位地址符号指令。把位地址赋于规定的字符名称。把位地址赋于规定的字符名称。把位地址赋于规定的字符名称。把位地址赋于规定的字符名称。格式格式格式格式::::字符名称字符名称字符名称字符名称BITBITBITBIT位地址位地址位地址位地址例:例:例:例:ABCABCABCABCBITBITBITBITP1.1P1.1P1.1P1.1QQQQQQQQBITBITBITBITP3.2P3.2P3.2P3.22010-6-2713§§§§4.24.24.24.2汇编语言程序编辑和汇编汇编语言程序编辑和汇编汇编语言程序编辑和汇编汇编语言程序编辑和汇编1.1.1.1.编辑(源程序,以编辑(源程序,以编辑(源程序,以编辑(源程序,以.ASM.ASM.ASM.ASM扩展名存盘);扩展名存盘);扩展名存盘);扩展名存盘);2.2.2.2.汇编(手工或汇编(手工或汇编(手工或汇编(手工或机器汇编机器汇编机器汇编机器汇编););););如:教材如:教材如:教材如:教材p50p50p50p50习题习题习题习题9999((((MOVA,#88H;MOVA,#88H;MOVA,#88H;MOVA,#88H;机器码机器码机器码机器码74,88H74,88H74,88H74,88H))))又如:又如:又如:又如:地址地址地址地址目标码目标码目标码目标码源程序源程序源程序源程序ORG1000HORG1000HORG1000HORG1000H1000H747FMOVA,#7FH1000H747FMOVA,#7FH1000H747FMOVA,#7FH1000H747FMOVA,#7FH1002H7944MOVR1,#44H1002H7944MOVR1,#44H1002H7944MOVR1,#44H1002H7944MOVR1,#44HENDENDENDEND2010-6-2714§§§§4.34.34.34.3程序设计基础与举例程序设计基础与举例程序设计基础与举例程序设计基础与举例4.3.1顺序结构程序org1000hstart:movdptr,#tablemova,20hmovca,@a+dptrmov21h,asjmp$org2000htable:db0,1,4,9,16,25end例1:变量存在内部RAM的20H单元中,其取值范围:0~5,编成,查表法求其平方值2010-6-2715开始表格首地址送DPTR变量送A(20H)A查平方表(A+DPTR)A结束结果送21H单元:A21H2010-6-2716例例例例2222:将:将:将:将20202020HHHH单元的压缩单元的压缩单元的压缩单元的压缩((((PackedPackedPackedPacked))))BCDBCDBCDBCD码拆成两个码拆成两个码拆成两个码拆成两个ACSIIACSIIACSIIACSII码存入码存入码存入码存入21212121HHHH、、、、22H22H22H22H单元。单元。单元。单元。内部RAM22H21H20H693639BCD012...9ASCII30H31H32H...39H2010-6-2717方法1(20H)→A10H→BA/B,AA/B,AA/B,AA/B,A中为高4444位BCDBCDBCDBCD码,B