第4章AT89S51汇编语言程序设计

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第四章汇编语言程序设计汇编语言程序设计概述汇编语言源程序格式伪指令汇编语言程序设计基础4.1.1程序设计语言计算机程序设计语言是指计算机能够理解和执行的语言。程序设计语言的种类很多,归纳起来有三种:机器语言、汇编语言和高级语言。编程时采用哪种语言由程序设计语言的特点和适用场合决定。机器语言、汇编语言和高级语言比较一览表名称特点缺点优点适用场合机器语言用机器码书写指令不易被人们识别和读写。难写、难读、难交流计算机可以直接识别和执行无汇编语言用符号书写指令(用助记符表示操作码,特殊符号表示操作数)机器不能直接识别;程序员必须了解机器的结构和指令系统,不易推广和普及;不能移植,不具备通用性易为人们识别、记忆和读写时间、空间要求严格控制系统高级语言用以英语为基础的语句编程机器不能直接识别;执行时间长易于推广和交流;不依赖于机器,具有通用性科学运算和数据处理1、高级语言程序转换为机器语言程序的过程称为编译过程,通过编译程序实现。2、汇编语言源程序转换为机器语言目的程序的过程称为汇编过程,通过手工查表或汇编程序实现。3、用汇编程序将汇编语言源程序转换为机器语言时,汇编语言源程序的格式必须正确,程序员还要了解伪指令。4.1.2汇编语言语句和格式两种基本语句:指令语句和伪指令语句。(1)指令语句——每一条指令语句在汇编时都产生一个指令代码(机器代码),执行该指令代码对应着机器的一种操作。(2)伪指令语句——是控制汇编(翻译)过程的一些控制命令。在汇编时没有机器代码与之对应。汇编语言源程序格式如下:1、汇编语言源程序由一条一条汇编语句组成。2、每条汇编语句独占一行。3、典型的汇编语句由四部分组成:标号:操作码操作数;注释汇编语言源程序格式汇编语言源程序是用汇编语言编写的用户程序。指令系统中的指令标号1、标号是指指令的符号地址。2、一般情况下可以省略,只用在转移的目的指令前。3、它必须符合以下规定:(1)标号由1~8个ASCII码字符组成,第一个字符必须是字母。(2)同一程序内,不能有相同的标号。(3)不能使用汇编语言已经定义的符号作为标号,如指令助记符、伪指令以及寄存器的符号名称等。(4)标号必须以冒号结束。(5)标号的有无,取决于本程序中的其他语句是否访问该条语句。如无其他语句访问,则该语句前不需标号。下列字符能否做标号:LOOP123ACCPOVADD1DECJNZ操作码——说明语句的功能,汇编语句中必不可少的部分。操作数——说明操作的对象。1、操作数有二种表示方法:操作数和操作数地址操作数可以用D、B、H、ASCII码、表达式来表示。若十六进制的操作数以字符A~F开头时,需在它前面加一个“0”,以便在汇编时把它和字符A~F区别开来。内RAM:地址可以用B、H、D表示。SFR和工作寄存器:可用特殊功能寄存器名或工作寄存器名表示,也可用其地址来表示。外RAM:用@DPTR表示。2、操作数存在与否由指令决定:1个、2个、3个或没有。如有2个或3个,各操作数之间用逗号隔开。注释1、注释用于说明语句的功能,增加程序的可读性。2、可有可无,如果有,则必须以分号开头,若一行不够,可以另起一行,新行必须以分号开头。例4-1下面是一段汇编语言程序的四分段书写格式标号字段操作码字段操作数字段注释字段START:MOVA,#00H;0→AMOVR1,#10;10→R1MOVR2,#00000011B;3→R2LOOP:ADDA,R2;(A)+(R2)→ADJNZR1,LOOP;R1内容减1不为零循环NOPHERE:SJMPHERE4.1.3伪指令在汇编语言源程序中应有向汇编程序发出的指示信息,告诉它如何完成汇编工作,这是通过伪指令来实现。伪指令不属于指令系统中的汇编语言指令,它是程序员发给汇编程序的命令,也称为汇编程序控制命令。只有在汇编前的源程序中才有伪指令。“伪”体现在汇编后,伪指令没有相应的机器代码产生。伪指令具有控制汇编程序的输入/输出、定义数据和符号、条件汇编、分配存储空间等功能。不同汇编语言的伪指令有所不同,但基本内容相同。常用的伪指令:ORGENDEQUDBDWDSBITORG(汇编起始命令)功能:规定下面的目标程序的起始地址。格式:[标号:]ORG16位地址。说明:1、括号内是选项,可以没有。2、一般在一个汇编语言源程序的开始,都用一条ORG伪指令来规定程序存放的起始位置,故称为汇编起始命令。3、在一个源程序中,可以多次使用ORG指令,以规定不同的程序段的起始位置。所规定的地址应该是从小到大,且不允许有重叠,即不同的程序段之间不能有重叠。一个源程序若不用ORG指令开始,则从0000H开始存放目标码。例如:ORG2000HSTART:MOVA,#00H……即规定标号START代表地址为2000H开始。例如:ORG2000HORG2500H…………ORG2500HORG2000H…………ORG3000HORG3000H…………END(汇编结束命令)功能:汇编到此结束。格式:[标号:]END说明:1、END是汇编语言源程序的结束标志,在END以后所写的指令,汇编程序都不予处理。2、一个源程序只能有一个END命令。在同时包含有主程序和子程序的源程序中,也只能有一个END命令。EQU(EQUate)标号赋值命令用于给标号赋值。赋值后,标号值在整个程序有效。例如:TEST:EQU2000H表示TEST=2000H,汇编时,凡是遇到TEST时,均以2000H来代替。DB(DefineByte)定义数据字节命令用于从指定的地址开始,在程序存储器连续单元中定义字节数据。例如:ORG2000HDB30H,40H,24,C,B汇编后:(2000H)=30H,(2001H)=40H,(2002H)=18H(十进制数24),(2003H)=43H(字符“C”的ASCII码)(2004H)=42H(字符“B”的ASCII码)DB功能是从指定单元开始定义(存储)若干字节,十进制数自然转换成十六进制数,字母按ASCII码存储。DW(DefineWord)定义数据字命令该命令用于从指定的地址开始,在程序存储器的连续单元中定义16位的数据字。例如:ORG2000HDW1246H,7BH,10汇编后:(2000H)=12H;第1个字(2001H)=46H(2002H)=00H;第2个字(2003H)=7BH(2004H)=00H;第3个字(2005H)=0AHDS(DefineStorage)定义存储区命令从指定地址开始,保留指定数目的字节单元作为存储区,供程序运行使用。例如:TABEL:DS10表示从TABEL代表的地址开始,保留10个连续的地址单元。例如:ORG2000HDS10H表示从2000H地址开始,保留16个连续地址单元。注意:DB、DW和DS命令只能对程序存储器有效,不能对数据存储器使用。BIT位定义命令用于给字符名称赋以位地址,位地址可以是绝对位地址,也可是符号地址。例如:QABITP1.6功能是把P1.6的位地址赋给变量QA。4.2汇编语言源程序的汇编汇编可分为手工汇编和机器汇编两类。手工汇编——通过查指令的机器代码表,逐个把助记符指令“翻译”成机器代码,再进行调试和运行。手工汇编遇到相对转移偏移量的计算时,较麻烦,易出错,只有小程序或受条件限制时才使用。实际中,多采用“汇编程序”来自动完成汇编。4.2.2机器汇编用微型计算机上的软件(汇编程序)来代替手工汇编。在微机上用编辑软件进行源程序编辑,然后生成一个ASCII码文件,扩展名为“.ASM”。在微机上运行汇编程序,译成机器码。机器码通过微机的串口(或并口)传送到用户样机(或在线仿真器),进行程序的调试和运行。有时,在分析某些产品的程序的机器代码时,需将机器代码翻译成汇编语言源程序,称为“反汇编”。一段源程序的汇编结果,机器码从1000H单元开始存放。25E025F04.3汇编语言程序设计举例一、汇编语言程序设计的一般步骤分析课题确定算法画流程图编写程序上机调试二、程序结构按程序的走向可以将程序分成4种结构:顺序结构分支结构循环结构子程序在应用程序的设计中,几乎没有一个程序只经过一次编写就完全成功的,所以必须经过上机调试。4.3.1简单程序简单程序是指一种无分支的直接程序,即CPU从第一条指令开始依次执行每一条指令,直到最后一条指令。这种程序虽然比较简单,但也能完成一定的功能,并且往往也是构成复杂程序的基础。拆字程序拼字程序求和程序拆字程序例:将30H单元中存放的一个两位的BCD拆开并存入31H和32H单元单元,高字节存入32H单元。解:分析命题确定算法画流程图编写程序上机调试32H31H30H89H09H08H分别屏蔽高4位与低4位,再将高4位交换MOVA,30HANLA,#0F0HSWAPAMOV32H,AMOV31H,30HANL31H,#0FHSJMP$开始将30H单元的内容送A将A中高、低4位交换将A中内容存入32H单元屏蔽30H单元内容的高4位屏蔽A中内容的低4位将30H单元内容存入31H单元结束拼字程序例:将30H和31H单元中存放的2个一字节BCD码组合成一个2位的BCD码存入32H单元,31H单元中的数为低4位。解:分析命题确定算法画流程图编写程序上机调试32H31H30H04H07H47H将30H单元的高4与低4交换,再与31H单元相或MOVA,30HSWAPAORLA,31HMOV32H,ASJMP$开始将30H单元的内容送A将A中高、低4位交换将A中内容与31H单元内容相或将A中内容存入32H单元结束MOVA,30HADDA,32HMOV40H,AMOVA,31HADDCA,33HMOV41H,AMOVA,#00HADDCA,#0MOV42H,ASJMP$求和程序例:设2个16位二进制数存于以30H为首址的连续单元中,求二者的和,并将和存于以40H为首址的区域。(低字节在前)解:分析命题确定算法画流程图编写程序上机调试(30H)+(32H)送40H单元;(31H)+(33H)+Cy送41H单元;Cy+0送42H单元开始(30H)+(32H)送40H单元(31H)+(33H)+Cy送41H单元Cy+0送42H单元结束4.3.2子程序的设计将需多次应用的、完成相同的某种基本运算或操作的程序段从整个程序中独立出来,单独编成一个程序段,需要时进行调用。这样的程序段称为子程序。优点:采用子程序可使程序结构简单,缩短程序的设计时间,减少占用的程序存储空间。子程序在程序设计中非常重要,读者应熟练掌握子程序的设计方法。编写子程序时应注意以下问题:1.子程序的第一条指令的地址称为子程序的入口地址。该指令前必须有标号。2.主程序调用子程序——两条子程序调用指令:(1)绝对调用指令:ACALLaddr11。双字节,addr11指出了调用的目的地址,PC中16位地址中的高5位不变,被调用的子程序的首地址与绝对调用指令的下一条指令的高5位地址相同,即只能在同一个2KB区内。(2)长调用指令:LCALLaddr16。三字节,addr16为直接调用的目的地址,子程序可放在64KB程序存储器区任意位置。3.注意设置堆栈指针和现场保护。4.最后一条指令必须是RET指令。5.子程序可以嵌套,即子程序可以调用子程序。6.在子程序调用时,还要注意参数传递的问题。子程序的基本结构典型的子程序的基本结构如下:MAIN:……;MAIN为主程序入口标号LCALLSUB;调用子程序SUB……子程序SUB:PUSHPSW;现场保护PUSHAccPOPAcc;现场恢复,注意要先进后出POPPSWRET;最后一条指令必须为RET注意:上述子程序结构中,现场保护与现场恢复不是必需的,要根据实际情况而定。子程序处理程序段4.3.3查表程序设计查表程序是一种常用程序,避免复杂的运算或转换过程,可完成数据补偿、修正、计算、转换等各种功能,具有程序简单、执行速度快等优点。查表是根据自变量x,在表格寻找y,使y=f(x)。单片机中,数据表格存放于程序存储器内,在执行查表指令时,

1 / 77
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功