华东交通大学徐春辉制作单片微机原理及应用华东交通大学徐春辉制作2013年8月华东交通大学徐春辉制作第5章51系列单片机汇编语言程序设计及仿真调试华东交通大学徐春辉制作内容提要本章介绍汇编语言程序设计的有关知识,重点介绍利用51系列单片机汇编语言实现主要的程序结构及基本功能程序的设计。然后通过一些实例进一步介绍汇编语言程序设计的方法和技巧。最后介绍汇编语言源程序的仿真调试及开发工具KeilµVision的使用。学习要点了解汇编语言编程的基础知识。了解汇编语言程序设计的基本步骤和方法。掌握单片机汇编语言的顺序、分支、循环、查表及子程序的结构。掌握码制转换、查表、散转、算术运算等常用程序的编制方法。掌握集成开发环境KeilµVision的基本操作,能应用其调试程序。。华东交通大学徐春辉制作5.1汇编语言程序设计基础5.2汇编语言源程序的基本结构5.351系列单片机汇编语言实用程序设计举例5.4程序调试与集成开发环境软件KeilµVision第5章目录华东交通大学徐春辉制作55.1汇编语言程序设计基础5.1.1机器语言、汇编语言与高级语言1.机器语言计算机能直接识别和执行的是二进制代码形式的机器指令,而这类指令的集合就是计算机的机器语言,或称指令系统。机器语言是面向计算机系统的。机器语言是最底层的程序设计语言,其他语言编写的程序最终都要转换为机器语言的形式。用机器语言编写的程序称为目标程序或机器语言程序。由于机器语言可以被计算机直接识别和执行,因而其执行速度最快。华东交通大学徐春辉制作62.汇编语言汇编语言是用助记符(英文字母缩写)来表示的面向机器的程序设计语言,每条助记符指令都有相对应的机器码,即汇编语言是机器语言的符号表示。图5-1源程序与目标程序的关系华东交通大学徐春辉制作73.高级语言高级语言(如C++等)克服了汇编语言的缺点,是一种面向问题或过程的语言。它是一种接近于自然语言和数学算法的语言,与机器的硬件无关,用户编程时不必仔细了解所用计算机的具体性能和指令系统。高级语言不但直观、易学、易懂,而且通用性强,可以在不同的计算机上运行,因此可移植性好。但是用高级语言编写的程序是不能直接执行的,需要由编译程序或解释程序将它们翻译成对应的目标程序,机器才能接受和执行。华东交通大学徐春辉制作85.1.2汇编语言的语句和格式1.汇编语言的语句汇编语言的语句有两种基本类型:指令语句和指示性语句。(1)指令语句指令语句由指令系统中的指令构成。每一指令语句在汇编时都产生一个相应的指令代码(机器码),执行该指令代码对应着机器的一种操作。(2)指示性语句指示性语句由伪指令构成,是控制汇编(翻译)过程的一些控制命令。在汇编时没有机器代码与之对应。华东交通大学徐春辉制作92.汇编语言语句的格式汇编语言语句一般由4个字段组成,即标号、操作码、操作数和注释,它们之间应用分隔符隔开,常用的分隔符有空格“”、冒号“:”和分号“;”,而且空格的数目可以不止一个。汇编语言语句的格式如下:[标号:]操作码[操作数][;注释]上述格式中,[]中的项为任选项,其中标号与操作码之间用“:”分隔,操作码与操作数之间用空格分隔,操作数与注释之间用“;”分隔,有多个操作数时,操作数和操作数之间用“,”分隔。华东交通大学徐春辉制作10例如,标号:操作码操作数;注释LOOP:MOVA,30H;(30H)→A华东交通大学徐春辉制作11上述4个字段应该遵守的基本语法规则如下。(1)标号字段标号是语句所在地址的标志符号,有了标号,该语句才能被程序中的其他语句所访问。有关标号规定如下:①标号由1~8个ASCII码字符组成,第一个字符必须是字母。②同一标号在一个程序中只能定义一次,不能重复定义。③不能使用汇编语言已经定义的符号作为标号,如指令助记符、伪指令及寄存器的符号名称等。④标号的有无,取决于本程序中的其他语句是否访问该条语句。如无其他语句访问,则该语句前不需要标号。华东交通大学徐春辉制作12(2)操作码字段操作码是指令的助记符,表示指令的性质,用于指示CPU执行何种操作。操作码是汇编语言指令中唯一不能空缺的部分。华东交通大学徐春辉制作13(3)操作数字段操作数字段用于存放指令的操作数或操作数的地址。在本字段中,操作数的个数因指令的不同而不尽相同。通常有单操作数、双操作数和无操作数三种情况。如果是双操作数,则操作数之间要以逗号隔开。在操作数的表示中,有以下几种情况需要注意:①十六进制、二进制和十进制形式的操作数表示多数情况下,操作数或操作数的地址是采用十六进制形式来表示的,此时需加后缀H。在某些特殊场合用二进制表示,此时加后缀B,若操作数采用十进制形式,则需加后缀D,也可省略。如果十六进制操作数以数码A~F开头,则需在它前面加一个0,以便汇编时把它和作为字符的A~F区别开。华东交通大学徐春辉制作14②工作寄存器和特殊功能寄存器的表示当操作数为工作寄存器或特殊功能寄存器时,允许用工作寄存器和特殊功能寄存器的代号表示。例如,工作寄存器用R7~R0表示,累加器用A(或ACC)表示。另外,工作寄存器和特殊功能寄存器也可用其地址来表示,如累加器A可用其地址E0H来表示。③操作数可以是参与运算的数或数的地址,有以下几种表示方法:立即数:#data和#data16。直接地址:direct,如30H;伪指令定义的符号地址,如SUM;表达式,如SUM+1,特殊功能寄存器的名字等。华东交通大学徐春辉制作15(4)注释字段注释是为便于读者的阅读和理解而对语句或程序段的说明,汇编时不被翻译成机器码,机器也不执行。华东交通大学徐春辉制作165.1.3伪指令伪指令是在“机器汇编”过程中,用来对汇编过程进行某种控制或者对符号和标号进行赋值。这些指令不属于指令系统中的指令,汇编时也不产生机器代码,因此称为“伪指令”。利用伪指令可以告诉“汇编程序”如何进行汇编,比如程序应放在何处、标号地址的具体取值等。华东交通大学徐春辉制作171.ORG(汇编起始地址伪指令)ORG用来定义汇编以后的目标程序的起始地址。其格式如下:[标号:]ORGaddr16例如:ORG2000HSTART:MOVA,#34HORG规定了标号START的地址为2000H,也就是说该程序应从2000H开始存放。在一个汇编语言源程序中,可以多次使用ORG命令,以规定不同程序段的起始地址,地址一般应从小到大且不能重复。如果在程序开始处未定义ORG命令,则程序的起始地址默认为0000H。华东交通大学徐春辉制作182.END(汇编结束伪指令)END用来表示汇编语言源程序结束,它只能出现在程序的末尾,且只有一个。其指令格式如下:[标号:]END指令的标号通常可以省略。在机器汇编时,汇编程序检测到该语句时便确认汇编语言源程序全部结束,对其后的指令不再进行汇编。华东交通大学徐春辉制作193.EQU(赋值伪指令)EQU用来对程序中出现的标号进行赋值。其格式如下:字符名称EQU数或汇编符号在机器汇编时,汇编语言会自动将EQU后面的数或汇编符号赋给左侧的字符名称。例如,AAEQUR1;AA等同于R1K1EQU40H;K1代表40H使用该指令必须注意以下几点:(1)该指令中的字符名称不是转移指令中出现的标号,而是出现在操作数中的字符名称。(2)EQU伪指令中的字符名称必须先定义后使用。(3)EQU定义的字符名称不能出现在表达式中,例如语句MOVA,A10+1是错误的。华东交通大学徐春辉制作204.DATA(数据地址赋值伪指令)DATA对数据地址或代码地址赋予规定的字符名称。其格式如下:标号名称DATA表达式DATA伪指令的功能与EQU有些类似,可以将一个表达式的值赋给一个字符名称,但它与EQU指令有如下区别:(1)表达式可以是一个数据或地址,但不可以是汇编符号(如R0~R7)。(2)DATA语句定义的字符名称可以先使用后定义,故该语句放在程序的开头或末尾皆可。华东交通大学徐春辉制作215.DB、DW、DS(定义字节、字、空间伪指令)DB:从指定的地址单元开始,存放若干字节。DW:从指定的地址单元开始,存放若干字(16位二进制数,高8位在前,低8位在后)。DS:从指定的地址单元开始,保留若干单元备用。指令格式如下:[标号:]DB字节常数;用逗号分隔开的若干项,每项都是一个字节)[标号:]DW字常数;用逗号分隔开的若干项,每项都是一个字)[标号:]DS表达式;其值表示保留的单元个数)华东交通大学徐春辉制作22【例5-1】分析下段程序。ORG2000HDS08HDB30H,8AH,10,‘B’DW54H,1F80H解:该程序的DS伪指令定义8个存储单元(2000H~2007H)备用;DB伪指令定义了从地址2008H开始的4个单元的内容;DW伪指令定义了后续4个单元的内容。结果如下:(2008H)=30H,(2009H)=8AH(200AH)=0AH,(200BH)=42H(200CH)=00H,(200DH)=54H(200EH)=1FH,(200FH)=80H华东交通大学徐春辉制作236.BIT(位地址符号伪指令)BIT用来将位地址赋给字符名称。其格式为:字符名称BIT位地址例如:KEYBITP1.0;将P1.0的位地址赋给符号名KEYSTBIT0D7H;将位地址为D7H的位定义为符号名注意:位地址既可以是绝对地址,也可以是符号地址。另外,用BIT定义的“符号名”一经定义便不能重新定义和改变。华东交通大学徐春辉制作245.1.4汇编语言源程序的汇编汇编是将汇编语言源程序翻译成目标程序的过程,分为“人工汇编”和“机器汇编”。机器汇编是通过翻译程序来完成的,但在条件不具备的情况下也可以通过人工查表的方法来汇编。1.第一次汇编首先通过查表查出每条指令的机器码,然后根据ORG规定的地址确定每条指令所在的地址单元,形成目标程序。对程序中出现的转移指令标号和地址偏移量,仍然采用原来的符号暂不处理,而伪指令定义的符号地址应用实际值代入。华东交通大学徐春辉制作252.第二次汇编计算转移指令中的标号地址,计算方法见下面的例子。【例5-2】对下面的源程序进行人工汇编。解:第一步——查表,结果如下:地址目标程序源程序ORG2000H2000H7F09START:MOVR7,#09H2002H7831MOVR0,#31H2004HE6MOVA,@R02005H08LOOP:INCR02006H26ADDA,@R02007HDFLOOPDJNZR7,LOOP2009HF530MOV30H,A200BH80HALTHALT:SJMPHALTEND华东交通大学徐春辉制作26第二步——计算转移指令中的地址偏移量:(1)LOOP:DJNZR7,LOOP指令中的条件成立时,程序发生转移,即从地址2009H转移到2005H,故地址偏移量rel=2005H2009H=04H,以补码形式表示为LOOP=FCH。(2)HALT:SJMPHALT执行之后,相当于从地址200DH转移到200BH,即地址偏移量rel=200BH-200DH=-02H,以补码形式表示为HALT=FEH。将计算结果代入上述目标程序的标号即完成汇编。华东交通大学徐春辉制作275.1.5汇编语言程序设计的一般步骤汇编语言程序设计大致可分成以下几步:(1)明确设计要求。(2)确定算法。(3)绘制程序流程图。(4)按程序流程图编写源程序。(5)上机调试。(6)优化程序。华东交通大学徐春辉制作285.2汇编语言源程序的基本结构再复杂的程序也是由简单程序组合起来的,掌握了程序的基本结构就拥有了程序设计的基本能力。单片机汇编语言源程序包括:顺序、分支、循环及子程序4种基本结构。5.2.1顺序结构顺序结构程序是一种最简单、最基本的程序(也称为简单程序),其特点是按程序编写的顺序依次执行,程序流向不变。顺序结构程序是所有复杂程序的基础及基本组成部分。华东交通大学徐春辉制作29【例5-3】将片内RAM的20H单元中的压缩BCD码拆成两个ACSII码存入21H、22H单元。低4位存在21H单元,高4位存在22H单元。解:(1)确定算法:首先将压缩BCD