您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > PIC汇编语言程序设计基础
第四章PIC汇编语言程序设计基础•4.0序论•4.1MPASM汇编器的使用•4.2汇编语言的语句格式•4.3常用伪指令•4.4程序格式和程序流程图•4.5RAM数据存储器的体选寻址问题•4.6顺序程序结构•4.7分支程序结构•4.8循环程序结构•4.9子程序结构•4.10程序的跨页跳转和跨页调用问题•4.11延时程序设计•4.12查表程序设计为什么要学习汇编语言1.汇编语言是唯一一种面向机器的、最贴近及其硬件的编程语言。学习汇编语言能够帮助深入了解单片机的构成、工作过程和原理。因此特别适合初学阶段的学习;2.汇编语言程序可以最有效的节省CPU的运行时间和数据存储空间,代码使用效率最高。在简单的控制场合是一种最佳选择;3.由于汇编语言是一种直接控制CPU的指令语言,所以可以产生精确的定时信号,这时其它语言所无法实现的;4.尽管C语言已经成为各类单片机重要的开发手段,但是汇编语言永远不会被淘汰,只有将汇编语言和C语言有机的结合起来才能高效的实现应用软件的设计。4.0序论•CPU所能识别的是由“0”或“1”组成的二进制的“机器语言”。如:“SLEEP”指令的机器语言:“00000001100011”。但机器语言不便于人们编写、阅读。•汇编语言是对机器语言的改进。使用了便于记忆、阅读的符号、字符串来表示指令的操作码、操作数和操作数地址。是一种符号语言,它与机器语言一一对应。•汇编语言CPU是不能识别的,因此必须使用一种工具将其“翻译”为机器语言,这个工具叫“汇编器”或“汇编程序”。使用“汇编器”或“汇编程序”帮助将汇编语言的源程序转换为机器语言,这一过程称之为“汇编”。•汇编语言的使用为我们提供了一种可以不涉及机器指令码和实际存储器地址的便捷条件。但是要想正确使用汇编语言编程必须了解“编译器”所约定的内容,掌握如:语句格式、标号格式、数据进制的表示方法、伪指令和汇编器的使用等等。•在下面的章节中将介绍MPASM编译器的使用、汇编语言的语句格式、几种常用伪指令、程序格式和流程图。返回4.1MPASM汇编器的使用•MPASM汇编器是美国microchip公司为其单片机开发、应用者设计的一套语言工具软件。它不仅能将汇编语言源程序“翻译”成机器语言,还能检查源程序中的语法错误或格式错误并向用户给出题示。•MPASM汇编器有两种版本:①DOS版本的MPASM.EXE;②WINDOWS的MPASMWIN.EXE。有关如何使用MPASM将在后面相关章节中介绍。返回4.2汇编语言的语句格式•为了使编译器能够顺利的对用户编制的汇编语言源程序进行代码转换,在编制源程序时必须依照汇编器的约定进行书写。•microchip公司提供的MPASM汇编器其汇编语言格式的一般格式由4个字段组成,这4个段不都是必要的,但顺序不能颠倒。标号操作码操作数;注释(label)(opcode)(operand)(commend)1.标号必须从左面第1列开始,后面至少用1个空格与操作码隔离(注意:标号后面没有冒号);2.在无标号时,操作码前至少要保留一个或一个以上的空格(建议使用“Tab”键分割标号列);3.操作码与操作数之间至少要保留一个或一个以上的空格,如果有两个操作数时两者之间要由逗号(半角)隔开(建议使用“Tab”键分割);4.注释由分号(英文半角)引导,在标号、操作码和操作数之后。标号也可以单独占一行单必需由分号引导。(一)标号1.在指令前的标号实际上就是该指令的符号地址。2.并不是每条指令都需加标号的,只有那些欲被其它语句引用的语句之前才需要加标号。子程序第一条语句的标号实际上就是该子程序的名称;3.标号可以单独作为作为一行;4.标号的第1个字符必须由字母或下划线“_”开始,并且从每一行的第1列开始写。标号最多可由32个字母、数字和其它符号组成。标号不能使用指令的助记符、寄存器名、或其它系统中已有固定用途的字符串(系统的保留字)。5.一个标号在系统中只能定义一次。(二)操作码1.在汇编语言语言源程序中,尽管其它3个字段有时是空的,但操作码字段无论在何时都不能是空的。2.操作码是指令的助记符,是指令功能的英文缩写,表示指令的操作类型、性质,是汇编语言语句中的“关键字”,因此是不能省略的。3.汇编器将操作码进行汇编时,将其与一个预先建立的操作码索引表相比较找出对应的机器码取而代之,这叫“代真”4.当操作码前无标号时,操作码前至少要留有一个空格以防汇编器将其误认为标号。(三)操作数•操作数是指令操作的对象,是数据或数据的地址。它们可以使用数值或标号形式表示。•其中,数值可以使用二进制、八进制、十进制和十六进制或ASCII字符值(参见讲义88页表4.2);而标号可以是在此前定义或赋值的代表数字或地址标号或字符串。•如果操作数有两个,中间应由逗号隔开。(四)注释•注释部分用于对指令进行注解和说明。虽然注释可有可无,但对于一个编程者来说,为了便于程序的阅读、交流、修改和调试,在一些关键的语句上加标注释是一种好的编程习惯;•注释由半角的引号“;”开始,它不是程序的功能部分,编译器对该部分不做任何处理。返回4.3常用伪指令•所谓伪指令就是“假指令”的意思,它不是为CPU识别的指令、没有对应的机器码。它是为编译器服务的指令,如确定指令的存储地址,为标号、字符串赋值等。•伪指令的使用使程序在书写、阅读上更方便。对于一些没有说明意义的数字、RAM地址可以通过伪指令换为有意义的字符来取代,使程序具有很好的可读性。如:在PIC的指令中不能直接引用寄存器的名字取代地址,只能通过EQU伪指令定义后引用其寄存器的符号。•伪指令只在汇编的过程中进行一些辅助工作,是程序设计人员向编译器发出的控制命令,告诉汇编器如何完成汇编过程和一些规定的操作,以及控制汇编的输入、输出和数据定位等。一旦汇编完成,伪指令就不存在了。•与指令类似,伪指令的格式也是由4个字符段组成。符号名伪指令助记符操作数;注释符号名:通常为寄存器名、变量名、常数名、标志位名或控制位名、复位矢量或中断矢量的一个字符串。同标号一样符号名必须从一行的第1列开始,后面与伪指令应至少保留一个空格。但不能向标号那样独占一行。(一)EQU---符号名赋值伪指令•格式:符号名EQUnn•说明:使EQU两边的值相等。其中nn是长度不同的二进制数(可以分别作为寄存器名、位地址、8位的数据或常数、13位的复位或中断矢量等)。一旦符号名被EQU赋值,其值就固定下来不能再重新改变。•举例:STATUSEQU03H;定义寄存器名RP0EQU05H;定义位地址TMR0_bEQU00H;定义定时器的初值常数•【举例】:在PIC指令系统中,没有寄存器寻址的方式,汇编程序也不允许直接使用寄存器的名字。所以与寄存器相关的操作只能通过“直接寻址”方式完成。【如】:将W中的数据送PORTC寄存器:MOVWF07H因此,编写PIC的程序清单时,在程序的开头可以使用QEU伪指令现将相关的寄存器名进行定义,然后在程序中就可以直接引用寄存器的名字。PORTCEQU07H;定义寄存器名∶MOVWFPORTC;将W中的数据送PORTC汇编时,编译器将用07H取代PORTC。•举例:经EQU伪指令定义后,汇编程序中直接使用寄存器的符号名来取代寄存器的地址,使程序具有更好的可读性。INDFEQU00HTMR0EQU01HPCLEQU02HSTATUSEQU03HRP0EQU05H;参见讲义48页RP1EQU06HPORTCEQU07H:::ORG0000HGOTOMAINORG0005HMAINBSFSTATUS,RP0BCFSTATUS,RP1;选择体MOVLW01H;立即数01H送WMOVWFPORTC;W内容送PORTC(二)ORG---程序起始地址定义伪指令•格式:ORGnnnn•说明:用于指定该伪指令后面的源程序在ROM中存放的起始地址。•nnnn为13位长的地址参数。•举例:ORG0005HMAINCLRWCALLSUB:MAIN是标号,也就是本行指令的符号地址。ORG伪指令又将该符号地址定义为单片机内部RAM的0005H单元,即CLRW的机器码存储在程序存储器ROM的0005H开始的单元中。(三)END---程序结束伪指令•格式:END•说明:该伪指令通知MPASM汇编器结束对源程序的汇编。•注意:在一个源程序中必须有一个END伪指令,且只能在程序的最后。(四)LIST---列表选项伪指令•格式:LIST[可选项,可选项,……可选项]•说明:用于设置汇编参数来控制汇编过程,或对打印输出文件进行格式化。该伪指令的所有选项都应在一行内完成。指令的可选项共有十余种,这里仅介绍2种。①P=〈设定单片机型号〉。例如:P=16F877②R=〈定义默认的数值进制〉。例如:R=DEC(十进制)或:R=HEX(十六进制)(五)INCLUDE---调入外部程序文件伪指令•格式:INCLUDE“文件名”•说明:用来告知汇编器,将一个预先编制好的外部程序文件包含进来。这样做可以减少重复劳动,提高编程效率。调入的外部程序文件通常是“定义文件”,即定义单片机的复位矢量、专用寄存器的地址及控制位和状态为地址等。返回4.4程序格式和程序流程图•虽然书写源程序时没有统一的要求,但是一个良好的格式风格非常重要。在此推出一种风格的格式供参考:;-------------------------------------------------------;符号定义和变量定义;-------------------------------------------------------INDFEQU00H;把后面程序指令要用到的TMR0EQU01H;寄存器单元地址用表义性很PCLEQU02H;强的符号名预先定义STATUSEQU03HFSREQU04HPORTAEQU05HTRISAEQU85HXEQU20H;对程序所需的变量预先定义YEQU21H;-------------------------------------------------------------;复位矢量和中断矢量的安排(PIC16F87X);-------------------------------------------------------------ORG0000H;复位矢量入口GOTOMAIN;转跳到主程序ORG0004H;中断矢量入口GOTOINT_BODY;跳转到中断服务程序;---------------------------------------------------------------;主程序区;---------------------------------------------------------------ORG0005H;主程序从0005H开始存放MAINCLRWCALLSUB……GOTOMAIN标号注释;----------------------------------------------------;子程序区和中断服务程序区;----------------------------------------------------SUBMOVLW01H;子程序……RETURN;子程序返回;INT_BODY;中断服务程序MOVLW0FFH……RETFIE;中断服务程序返回;-----------------------------------------------------END;全部程序结束从这个例子中,可以看出:①纵向上将程序划分为几个功能块,层次清晰,便于阅读;②横向上按4个字段划分并上下对齐程序框图的图形符号•用图形来表示程序的结构和流向叫程序的“流程图”。•流程图比程序本身更直观的体现出程序的特点。因此,在编制、书写程序本身之前应当首先画出流程图。•通过图形将程序的每一个操作及操作的顺序、分支的结构等等一目了然的展现出来。•在编写一个程序(特别是复杂的程序)事先通过流程图制定程序的结构、操作顺序等,然后将程序采用模块化,逐一编制、调式,最后完成,这是编程者必须
本文标题:PIC汇编语言程序设计基础
链接地址:https://www.777doc.com/doc-7301729 .html