资源预览内容
第1页 / 共91页
第2页 / 共91页
第3页 / 共91页
第4页 / 共91页
第5页 / 共91页
第6页 / 共91页
第7页 / 共91页
第8页 / 共91页
第9页 / 共91页
第10页 / 共91页
亲,该文档总共91页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第4章 AT89S51汇编语 言程序设计1 12第4章 目录录4.1 汇编语汇编语 言程序设计设计 概述4.1.1 单片机编程语言4.1.2 汇编语 言语句和格式4.1.3 伪指令4.2 汇编语汇编语 言源程序的汇编汇编4.2.1 手工汇编4.2.2 机器汇编24.3 AT89S51汇编语汇编语 言程序设计举设计举 例4.3.1 子程序的设计4.3.2 查表程序设计4.3.3 关键字查找程序设计4.3.4 数据极值查找程序设计4.3.5 数据排序程序设计4.3.6 分支转移程序设计4.3.7 循环程序设计3内容概要汇编语言能直接控制单片机硬件的编程语言。因此,要求程序设计者要 “软、硬结合” 。本章介绍汇编语言程序设计的基本知识,以及一些基本的程序设计。4.1 汇编语言程序设计概述程序是指令的有序集合。单片机运行就是执行指令序列的过程。编写这一指令序列的过程称为程序设计。44.1.1 单片机编程语言常用的编程语言是汇编语言和高级语言。1汇编语言用英文字符来代替机器语言,这些英文字符被称为助记符汇编语言:用助记符表示的指令。汇编语言源程序:用汇编语言编写的程序。“汇编”:汇编语言源程序需转换(翻译)成为二进制代码表示的机器语言程序,才能识别和执行。完成“翻译”的程序称为汇编程序。经汇编程序“汇编”得到的以“0”、“1”代码形式表示的机器语言程序称为目标程序。5 5优点:用汇编语言编写程序效率高,占用存储空间小,运行速度快,能编写出最优化的程序,缺点:可读性差,离不开具体的硬件,是面向“硬件”的语言通用性差。2高级语言不受具体“硬件”的限制,优点:通用性强,直观、易懂、易学,可读性好。目前多数的51单片机用户使用C语言(C51)来进行程序设计,已公认为高级语言中高效简洁而又贴近51单片机硬件的编程语言。将C语言向单片机上移植,始于20世纪80年代的中后期。6 6经过十几年努力,C51已成为单片机的实用高级编程语言。尽管目前已有不少设计人员使用C51来进行程序开发,但在对程序的空间和时间要求较高的场合,汇编语言仍必不可少。在这种场合下,可使用C语言和汇编语言混合编程。在很多需要直接控制硬件且对实时性要求较高的场合,则更是非用汇编语言不可。掌握汇编语言并能进行程序设计,是学习和掌握单片机程序设计的基本功之一。4.1.2 汇编语言语句和格式两种基本语句:指令语句和伪指令语句。7 7(1)指令语句已在第3章介绍。每一指令语句在汇编时都产生一个指令代码(机器代码),执行该指令代码对应着机器的一种操作。(2)伪指令语句是控制汇编(翻译)过程的一些控制命令。在汇编时没有机器代码与之对应。下面介绍指令语句格式。伪指令语句将在4.1.3节介绍。8汇编语言语句是符合典型的汇编语言的四分段格式:标号字段和操作码字段之间要有冒号“:”分隔;操作码字段和操作数字段间的分界符是空格;双操作数之间用逗号相隔;操作数字段和注释字段之间的分界符用分号“;”。任何语句都必须有操作码字段,其余各段为任选项。9标号字段(LABLE)操作码字段(OPCODE)操作数字段(OPRAND)注释字段(COMMENT)9【例4-1】下面是一段程序的四分段书写格式。标号字段 操作码字段 操作数字段 注释字段START:MOVA,#00H ;0AMOVR1,#10 ;10R1MOVR2,#00000011B ;03HR2LOOP: ADDA,R2 ;(A)+(R2)ADJNZR1,LOOP ;R1减1不为零,则跳LOOP处NOPHERE:SJMPHERE上述4个字段应该遵守的基本语法规则如下。10101标号字段语句所在地址的标志符号,才能被访问。如标号“START”和“LOOP”等。有关标号规定如下:(1)标号后必须跟冒号“:”。(2)标号由18个ASCII码字符组成,第一个字符必须是字母。(3)同一标号在一个程序中只能定义一次,不能重复定义。(4)不能使用汇编语言已经定义的符号作为标号,如指令助记符、伪指令以及寄存器的符号名称等。(5)标号的有无,取决于本程序中的其他语句是否访1111问该条语句。如无其他语句访问,则该语句前不需标号。2操作码字段操作码字段规定了语句执行的操作,操作码是汇编语言指令中唯一不能空缺的部分。3操作数字段指令的操作数或操作数地址。在本字段中,操作数的个数因指令的不同而不同。通常有单操作数、双操作数和无操作数三种情况。如果是多操作数,则操作数之间要以逗号隔开。12操作数表示时,几种情况需注意:(1)十六进制、二进制和十进制形式的操作数表示多数情况,操作数或操作数地址是采用十六进制形式来表示的。则需加后缀“H”。在某些特殊场合用二进制表示,需加后缀“B”若操作数采用十进制形式,则需加后缀“D”,也可省略。若十六进制操作数以字符AF开头,需在它前面加一个 “0”,以便汇编时把它和字符AF区别开。1313(2)工作寄存器和特殊功能寄存器的表示当操作数为工作寄存器或特殊功能寄存器时,允许用工作寄存器和特殊功能寄存器的代号表示。例如,工作寄存器用R7R0,累加器用A(或Acc)表示。另外,工作寄存器和特殊功能寄存器也可用其地址来表示,如累加器A可用其地址E0H来表示。4注释字段用于解释指令或程序的含义,对可读性非常有用。使用时须以分号开头,长度不限,一行写不下可换行书写,但注意也要以分号开头。1414汇编时,遇到“;” 就停止“翻译”。因此,注释字段不会产生机器代码。4.1.3 伪指令在汇编语言源程序中应有向汇编程序发出的指示信息,告诉它如何完成汇编工作,这是通过伪指令来实现。伪指令不属于指令系统中的汇编语言指令,它是程序员发给汇编程序的命令,也称为汇编程序控制命令。只有在汇编前的源程序中才有伪指令。 “伪”体现在汇编后,伪指令没有相应的机器代码产生。伪指令具有控制汇编程序的输入/输出、定义数据和符号、条件汇编、分配存储空间等功能。1515不同汇编语言的伪指令有所不同,但基本内容相同。介绍常用的伪指令。1ORG(ORiGin)汇编起始地址命令源程序的开始,用一条ORG伪指令规定程序的起始地址。如果不用ORG,则汇编得到的目标程序将从0000H地址开始。例如:ORG2000HSTART:MOVA,#00H即规定标号START代表地址为2000H开始。在一源程序中,可多次用ORG指令,规定不同的程序段的起始地址。但是,地址必须由小到大排列,且不能交叉、16重叠。例如:ORG2000H ORG2500H ORG3000H 这种顺序是正确的。若按下面顺序的排列则是错误的,因为地址出现了交叉。ORG2500H ORG2000H ORG3000H 17172. END(END of Assembly)汇编终止命令源程序结束标志,终止源程序的汇编工作。整个源程序中只能有一条END命令,且位于程序的最后。如果END出现在程序中间,其后的源程序,将不进行汇编处理。3EQU(EQUate)标号赋值命令用于给标号赋值。赋值后,标号值在整个程序有效。例如:TEST: EQU 2000H表示TEST=2000H,汇编时,凡是遇到TEST时,均以2000H来代替。18184DB(Define Byte)定义数据字节命令用于从指定的地址开始,在程序存储器连续单元中定义字节数据。例如:ORG 2000HDB30H,40H,24,“C“,“B“汇编后(2000H)=30H(2001H)=40H(2002H)=18H(十进制数24)(2003H)=43H(字符“C”的ASCII码)(2004H)=42H(字符“B”的ASCII码)1919 格式:格式: DB 功能:功能:把把项或项表的数值存入从标号开始的项或项表的数值存入从标号开始的 连续单元,其中项或项表可以是一个字节连续单元,其中项或项表可以是一个字节的的数数 或以引号括起来的字符串。或以引号括起来的字符串。ORG 1000HORG 1000H DatDat: DB 11h,-1,: DB 11h,-1,A,BCDA,BCDEND END该指令只能为程序存储器赋初值, 不能为其他存储器赋初值,尤其尤其不能为 内部数据存储器赋初值。1000H1000H11H11H FFHFFH 41H41H 42H42H程序存储器程序存储器43H43H 44H44H补码补码ASCIIASCII码码 205DW(Define Word)定义数据字命令该命令用于从指定的地址开始,在程序存储器的连续单元中定义16位的数据字(或地址)。例如:ORG 2000HDW1246H,7BH,10汇编后(2000H)=12H (2001H)=46H ;第1个字(2002H)=00H(2003H)=7BH ;第2个字(2004H)=00H (2005H)=0AH ;第3个字216DS(Define Storage)定义存储区命令从指定地址开始,保留指定数目的字节单元作为存储区,供程序运行使用。例如:TABEL:DS10表示从TABEL代表的地址开始,保留10个连续的地址单元。又例如:ORG2000HDS10 HLOOP: MOV A 30表示从2000H地址开始,保留16个连续地址单元。2222注意:DB、DW和DS命令只能对程序存储器有效,不能对数据存储器使用。7BIT 位定义命令用于给字符名称赋以位地址,位地址可以是绝对位地址,也可是符号地址。例如:QABIT P1.6功能是把P1.6的位地址赋给变量QA。4.2 汇编语言源程序的汇编“汇编”?汇编可分为手工汇编和机器汇编两类。23234.2.1 手工汇编通过查指令的机器代码表(表3-2),逐个把助记符指令“翻译”成机器代码,再进行调试和运行。手工汇编遇到相对转移偏移量的计算时,较麻烦,易出错,只有小程序或受条件限制时才使用。实际中,多采用“汇编程序”来自动完成汇编。24244.2.2 机器汇编用微型计算机上的软件(汇编程序)来代替手工汇编。在微机上用编辑软件进行源程序编辑,然后生成一个ASCII码文件,扩展名为 “.ASM”。在微机上运行汇编程序,译成机器码。机器码通过微机的串口(或并口)传送到用户样机(或在线仿真器),进行程序的调试和运行。有时,在分析某些产品的程序的机器代码时,需将机器代码翻译成汇编语言源程序,称为“反汇编”。2525【例4-2】 表4-1是一段源程序的汇编结果,可查表3-2,手工汇编,来验证下面的汇编结果是否正确。机器码从1000H单元开始存放。26264.3 AT89S51汇编语言程序设计举例介绍常用的汇编语言程序的设计。4.3.1 子程序的设计将那些需多次应用的、完成相同的某种基本运算或操作的程序段从整个程序中独立出来,单独编成一个程序段,需要时进行调用。这样的程序段称为子程序。优点:采用子程序可使程序结构简单,缩短程序的设计时间,减少占用的程序存储空间。子程序在程序设计中非常重要,读者应熟练掌握子程序的设计方法。27271子程序的设计原则和应注意的问题编写子程序应注意以下问题:(1)子程序的入口地址,前必须有标号。(2)主程序调用子程序,是通过调用指令来实现。有两条子程序调用指令: 绝对调用指令ACALL addr11。双字节,addr11指出了调用的目的地址,PC中16位地址中的高5位不变,被调用的子程序的首地址与绝对调用指令的下一条指令的高5位地址相同,即只能在同一个2KB区内。 长调用指令LCALL addr16。三字节,addr16为直接调用的目的地址,子程序可放在64KB程序存储器区任意位置。2828(3)子程序结构中必须用到堆栈,用来进行断点和现场的保护。(4)子程序返回主程序时,最后一条指令必须是RET指令,功能是把堆栈中的断点地址弹出送入PC指针中,从而实现子
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号