1、第4章(2) MCS-51汇编语言程序设计,汇编语言是面向机器硬件的语言,要求程序设计者 对MCS-51单片机具有很好的“软、硬结合”的功底。 本章介绍程序设计的基本知识及如何使用汇编语言 来进行基本的程序设计。 4.1 机器语言、汇编语言和高级语言 用于程序设计的语言基本上分为3种:机器语言、汇编语言和高级语言。 1.机器语言 二进制代码表示的指令、数字和符号简称为机器语 言不易懂,难记忆,易出错。,2汇编语言 英文助记符表示的指令称为符号语言或汇编语言,将 汇编语言程序转换成为二进制代码表示的机器语言程 序称为汇编程序。经汇编程序“汇编(翻译)”得到的机器语言程序称 为目标程序,原来的汇编
2、语言程序称为源程序。 汇编语言特点: 面向机器的语言,程序设计员须对MCS-51的硬件有相当深入的了解。 助记符指令和机器指令一一对应,用汇编语言编写的程序效率高,占用存储空间小,运行速度快,用汇编语言能编写出最优化的程序。,能直接管理和控制硬件设备(功能部件),它能处理中断,也能直接访问存储器及I/O接口电路。 汇编语言和机器语言都脱离不开具体机器的硬件,均是面向“机器”的语言,缺乏通用性。 3高级语言 不受具体机器的限制,使用了许多数学公式和数学计算上的习惯用语,非常擅长于科学计算。常用的如BASIC、FORTRAN以及C语言等。 高级语言优点:通用性强,直观、易懂、易学,可读性好。 使用
3、C语言(C51)、PL/M语言来进行MCS-51的应用程序设计。 对于程序的空间和时间要求很高的场合,汇编语言仍是必不可缺的。,C语言和汇编语言混合编程 在很多需要直接控制硬件的应用场合,则更是非用汇编语言不可 使用汇编语言编程,是单片机程序设计的基本功之一 4.2 汇编语言语句格式及基本规则,4.1.2 汇编语言语句格式及基本规则 MCS-51的汇编语言的四分段格式如下: 标号字段 操作码字段 操作数字段 注释字段 规则: (1)标号字段和操作字码段之间要有冒号“:”相隔; (2)操作码字段和操作数字段间的分界符是空格; (3)双操作数之间用逗号相隔; (4)操作数字段和注释字段之间的分界符
4、用分号“;”相隔。 操作码字段为必选项,其余各段为任选项。 例4-1 下面是一段汇编语言程序的四分段书写格式,标号字段 操作码字段 操作数字段 注释字段START: MOV A,#00H ;0AMOV R1,#10 ;10R1MOV R2,#00000011B ;3R2LOOP:ADD A,R2 ;(A)+(R2)ADJNZ R1,LOOP;R1内容减1不 为零,则循环NOPHERE: SJMP HERE 基本语法规则: 1标号字段 是语句所在地址的标志符号,(1)标号后边必须跟以冒号“:” (2)由18个ASCII字符组成 (3)同一标号在一个程序中只能定义一次 (4)不能使用汇编语言已经定
5、义的符号作为标号 2操作码字段 是汇编语言指令中唯一不能空缺的部分。汇编程序就是根据这一字段来生成机器代码的。 3操作数字段 通常有单操作数、双操作数和无操作数三种情况。如果是双操作数,则操作数之间,要以逗号隔开。 (1)十六进制、二进制和十进制形式的操作数表示,采用十六进制形式来表示 ,某些特殊场合才采用二进制或十进制的表示形式 。 十六进制,后缀“H” 。 二进制,后缀“B” 。 十进制,后缀“D”,也可省略。 若十六进制的操作数以字符AF中的某个开头时,则需在它前面加一个 “0”,以便在汇编时把它和字符AF区别开来。 (2)工作寄存器和特殊功能寄存器的表示 采用工作寄存器和特殊功能寄存器
6、的代号来表示,也可用其地址来表示。 例如,累加器可用A(或Acc)表示。也可用0E0H来表示,0E0H为累加器A的地址。,(3)美元符号$的使用 用于表示该转移指令操作码所在的地址。例如,如下指令:JNB F0, $ 与如下指令是等价的:HERE:JNB F0,HERE 再如:HERE:SJMP HERE 可写为:SJMP $ 4注释字段,必须以分号“;”开头,换行书写,但必须注意也要以分号“;”开头。 汇编时,注释字段不会产生机器代码。,4.3 汇编语言程序设计步骤 (1)分析问题,确定算法 (2)根据算法,画出程序框图 (3)分配内存工作区及有关端口地址 (4)编写程序 养成在程序的适当位
7、置上加上注释的好习惯。 (5)上机调试 编写完毕的程序,必须“汇编”成机器代码,才能调试和运行,调试与硬件有关程序还要借助于仿真开发工具并与硬件连接。,汇编语言源程序的汇编汇编语言源程序 “翻译”成机器代码(指令代码)的过程称 为“汇编”。汇编可分为手工汇编和机器汇编两类:1 手工汇编人工查表翻译指令。但遇到的相对转移指令的偏移量的计 算,要根据转移的目标地址计算偏移量,不但麻烦,且容易出 错。 2 机器汇编用编辑软件进行源程序的编辑。编辑完成后,生成一个ASCII 码文件,扩展名为“.ASM”。然后在微计算机上运行汇编程序, 把汇编语言源程序翻译成机器代码。 交叉汇编汇编后的机器代码是在另一
8、台计算机(这里是单片机)上运行。,MCS-51单片机的应用程序的完成,应经过三个步骤; (1)在微计算机上,运行编辑程序进行源程序的输入 和编辑; (2)对源程序进行交叉汇编得到机器代码; (3)通过微计算机的串行口(或并行口)把机器代码传送到用户样机(或在线仿真器)进行程序的调试和运行。,第(1)步,只需在微计算机上使用通用的编辑软件即可完成。 第(2)步的交叉汇编所用的汇编程序可在购买单片机的仿真开发工具时,由厂商提供。 第(3)步骤的实现要借助于单片机仿真开发工具进行。 反汇编分析现成产品的程序,要将二进制的机器代码语言程序翻译成汇编语言源程序。 例4-2 下面是一段源程序的汇编结果,读
9、者可通过查第3章的表3-3至表3-7 ,进行手工汇编,来验证下面的汇编结果是否正确。见表4-1(P75),4.4 汇编语言实用程序设计 1 汇编语言程序的基本结构形式 常采用以下几种基本结构:顺序结构、分支结构和循环结构,再加上广泛使用的子程序和中断服务子程序。1顺序结构 2分支结构程序中含有转移指令,无条件分支,有条件分支。有条件分支又分为:单分支结构和多分支结构。 3循环结构 4子程序5中断服务子程序,2 子程序的设计 一、子程序设计原则和应注意的问题一种能完成某一特定任务的程序段。其资源要为所有调用程序共享。因此,子程序在结构上应具有独立性和通用性,在编写子程序时应注意以下问题:1子程序
10、的第一条指令的地址称为子程序的入口地址。该指令前必须有标号。2主程序调用子程序两条子程序调用指令:(1)绝对调用指令:ACALL addr11,(2)长调用指令:LCALL addr16 3注意设置堆栈指针和现场保护 4最后一条指令必须是RET指令 5子程序可以嵌套,即子程序可以调用子程序 6在子程序调用时,还要注意参数传递的问题 二、 子程序的基本结构MAIN: ;MAIN为主程序或调用程序标号LCALL SUB ;调用子程序SUB,SUB:PUSH PSW ;现场保护PUSH ACC ;子程序处理程序段POP ACC ;现场恢复POP PSW ; RET ;最后一条指令必须为RET,例1
11、利用MCS-51系统编写一个用软件实现的50ms延时子程序 ,其中系统晶振为fosc=12MHZ。 解:1个机器周期=12/fosc=1us DEL: MOV R7 , #200 ; 1个机器周期 DEL1: MOV R6 , #123 ; 1个机器周期 NOP ;1个机器周期 DEL2: DJNZ R6 , DEL2 ; 2个机器周期 2*R6DJNZ R7, DEL1 ; 2个机器周期 RET ; 2个机器周期,子程序执行机器周期数为1+R7 *(1+1+2*R6 +2)+2=1+200*(1+1+2*123+2)+2=50003 子程序执行时间=机器周期数*1us=50003*1us=5
12、0003 us =50ms,例2 某单片机系统硬件接线图见图3-9,用单片机P1口控制8个发光管LED1LED8间隔0.5S循环点亮。编写控制程序。,ORG 0100HMOV A,#0FEH START:MOV P1,AMOV R1 , 10 AA1: LCALL DELAY50msDJNZ R1 , AA1RL ALJMP START DELAY50ms: MOV R7 , #200 DEL1: MOV R6 , #123NOP DEL2: DJNZ R6 , DEL2DJNZ R7, DEL1RETEND,主程序,子程序,例3:要求在单片机P1.0口产生0.5KHZ方波 ( 晶振12MHZ
13、),编写控制程序。 解:0.5KHZ方波,分析:方波周期2000ms , 定时 1000ms编程思路: 让P1.0口每隔1000ms取反一次。1000ms由调用20次一个延时50ms子程序实现。,ORG 0030H START: CPL P1.0MOV R2 ,#20 WW1: LCALL DELAY50msDJNZ R2 , WW1 LJMP START,DELAY50ms: MOV R7 , #200 DEL1: MOV R6 , #123NOP DEL2: DJNZ R6 , DEL2DJNZ R7, DEL1RETEND,分析:方波周期2000ms , 定时 1000ms编程思路: 让
14、P1.0口每隔1000ms取反一次。1000ms由调用20次一个延时50ms子程序实现。,作业: 1、在P1.1口产生1KHZ方波,编写控制程序 。 (12MHZ晶振) 2、P1口接8个发光管,每隔一秒依次循环点亮. ,要求画硬件图,编写控制程序 (12MHZ晶振)。,例4、 从50个字节的无序表TAB4中查找一个关键字A。若在表中查到的关键字,则把其在表中位置放入R2R3寄存器中,若在表中未查到的此关键字,则把R2R3寄存器请零。 解、关键字查找程序设计分顺序检索和对分检索,下面采用顺序检索方法。顺序检索为从第1项开始逐项顺序查找,判断所取数据是否与关键字相等。,ORG 1000HMOV 30H,#H;关键字H送30H单元MOV R1,#50 ;查找次数送R1MOV A,#0MOV DPTR,#TAB4 ;表首地址送DPTRLOOP:PUSH ACCMOVC A, A+DPTR ;查表结果送ACJNE A,30H,LOOP1;A不等于关键 ;字则转LOOP1,