Pic 8位单片机汇编指令识读
各大类单片机的指令系统是没有通用性的,它是由单片机生产厂家规定的,所以用户必须遵循厂家规定的标准,才能达到应用单片机的目的。
PIC 8位单片机共有三个级别,有相对应的指令集。基本级PIC系列芯片共有指令33条,每条指令是12位字长;中级PIC系列芯片共有指令35条,每条指令是14位字长;高级PIC系列芯片共有指令58条,每条指令是16位字长。其指令向下兼容。
在这里笔者介绍PIC 8位单片机汇编语言指令的组成及指令中符号的功能,以供初学者阅读相关书籍和资料时快速入门。
一、PIC汇编语言指令格式
PIC系列微控制器汇编语言指令与MCS-51系列单片机汇编语言一样,每条汇编语言指令由4个部分组成,其书写格式如下:
标号操作码助记符操作数1,操作数2;注释
指令格式说明如下:指令的4个部分之间由空格作隔离符,空格可以是1格或多格,以保证交叉汇编时,PC机能识别指令。
1 标号与MCS-51系列单片机功能相同,标号代表指令的符号地址。在程序汇编时,已赋以指令存储器地址的具体数值。汇编语言中采用符号地址(即标号)是便于查看、修改,尤其是便于指令转移地址的表示。标号是指令格式中的可选项,只有在被其它语句引用时才需派上标号。在无标号的情况下,指令助记符前面必须保留一个或一个以上的空格再写指令助记符。指令助记符不能占用标号的位置,否则该助记符会被汇编程序作标号误处理。
书写标号时,规定第一字符必须是字母或半角下划线“—”,它后面可以跟英文和数字字符、冒号(:)制符表等,并可任意组合。再有标号不能用操作码助记符和寄存器的代号表示。标号也可以单独占一行。
2 操作码助记符该字段是指令的必选项。该项可以是指令助记符,也可以由伪指令及宏命令组成,其作用是在交叉汇编时,“指令操作码助记符”与“操作码表”进行逐一比较,找出其相应的机器码一一代之。
3 操作数由操作数的数据值或以符号表示的数据或地址值组成。若操作数有两个,则两个操作数之间用逗号(,)分开。当操作数是常数时,常数可以是二进制、八进制、十进制或十六进制数。还可以是被定义过的标号、字符串和ASCⅡ码等。具体表示时,规定在二进制数前冠以字母“B”,例如B10011100;八进制数前冠以字母“O”,例如O257;十进制数前冠以字母“D”,例如D122;十六进制数前冠以“H”,例如H2F。在这里PIC 8位单片机默认进制是十六进制,在十六进制数之前加上Ox,如H2F可以写成Ox2F。
指令的操作数项也是可选项。
PIC系列与MCS-51系列8位单片机一样,存在寻址方法,即操作数的来源或去向问题。因PIC系列微控制器采用了精简指令集(RISC)结构体系,其寻址方式和指令都既少而又简单。其寻址方式根据操作数来源的不同,可分为立即数寻址、直接寻址、寄存器间接寻址和位寻址四种。所以PIC系列单片机指令中的操作数常常出现有关寄存器符号。有关的寻址实例,均可在本文的后面找到。
4 注释用来对程序作些说明,便于人们阅读程序。注释开始之前用分号(;)与其它部分相隔。当汇编程序检测到分号时,其后面的字符不再处理。值得注意:在用到子程序时应说明程序的入口条件、出口条件以及该程序应完成的功能和作用。
二、清零指令(共4条)
1 寄存器清零指令
实例:CLRW;寄存器W被清零
说明:该条指令很简单,其中W为PIC单片机的工作寄存器,相当于MCS-51系列单片机中的累加器A,CLR是英语Clear的缩写字母。
2 看门狗定时器清零指令。
实例:CLRWDT;看门狗定时器清零(若已赋值,同时清预分频器)
说明:WDT是英语Watchdog Timer的缩写字母。CLR见上述说明。注意该两条指令无操作数。
3 寄存器f清零指令。指令格式:CLRF f
实例:CLRF TMRO;对TMRO清零
说明:在PIC系列8位单片机中,常用符号F(或f)代表片内的各种寄程器和F的序号地址。F取值按PIC系列不同型号而不同,一般为Ox00~Ox1F/7F/FF。TMRO代表定时器/计数器TMRO,所以CLRF对寄程器清零,采用了直接寻址方式直接给出要访问的寄存器TMRO。
4 位清零指令。指令格式 BCF f,b
实例:BCF REG1,2;把寄存器REG1的D2位清零
说明:BCF是英语Bit Clear F的缩写。指令格式中的F,同上说明;符号b是表示PIC片内某个8位数据寄存器F的位号(或位地址),所以b的取值为0~7或D0~D7。实例中REG是Register的缩写。实例中的2代表指令格式中的b=2即寄存器REG1的D2位。
通过上述四条清零指令格式和实例,可以说明,学习PIC系列8位单片机的指令时应首先了解指令的助记符意义(功能),再有就是它的表达方式。初学者没有必要死记指令,重要是理解和实践。
本文关于指令的注释将与前述指令中的略有不同。前述指令注释时是对指令具体完成的功能给以说明,这种注释方法对初学者确实易于接受和理解,但是实际应用中的PIC产品汇编语言的注释通常是以程序要做什么(或指令的作用)而不是说指令的直接功能。鉴于上述原因,下述的指令注释将改变过去的注释方法,用程序应起的作用作注释。
10 寄程器半字节交换指令
指令格式:SWAPFf,d
说明:SWAPF是Swap f的合写。符号f、d的意义与前述的相同。该条指令的功能是寄存器f的高4位与低4位交换,即指令执行前,若寄存器f的8位状态为D7、D6、D5、D4、D3、D2、D1、D0,执行后的8位状态变为D3、D2、D1、D0、D7、D6、D5、D4,其结果存入W(d=0)或f(d=1)中。
实例:中断现场保护是中断技术中重要部分。由于PIC16C××指令系统中没有进栈PUSH和出栈POP指令,所以只能用其它指令来实现。因为在主程序中常常用到工作寄存器W和状态寄存器STATUS,所以中断现场保护常要保护寄存器W和STATUS。
下面是对PIC16C7×系列芯片中断现场保护的实例程序。
MOVWF W_TEMP ;将W内容存入到临时寄存器
W_TEMP中
SWAPF STATUS,W ;交换STATUS与W内容
MOVWF STATUS_TEMP ;将STATUS的内容存入到临
… 时寄存器STATUS_TEMP中
中断服务程序
…
SWAPF STATUS_TEMP,W;交换STATUS_TEMP与W
的内容
MOVWF STATUS 籗TATUS复原成原来的状态
SWAPF W_TEMP,F ;交换内容
SWAPF W_TEMP,W;W复原成原来的状态
说明:上述程序中各条指令的注释基本上都是以程序应达到的目的而注释的,对每条指令的功能几乎未涉及。这是初学者应特别注意的。
11 子程序调用指令(Subroutine Call)
指令格式:CALL k;k为立即地址
说明:子程序调用,不同型号芯片的实现方法不尽相同,其共同点是首先将返回地址((PC)+1)压栈保护,再转入所调用的子程序入口地址执行(与MCS-51指令功能相似)。
指令格式模式:HERE CALL DELAY;调用延时子程序
…
DELAY MOVLW 0x80;延时子程序
RETLW 0
说明:调用指令执行前,PC=地址HERE
调用指令执行后,PC=地址DELAY(标号),堆栈指针TOS=HERE+1(返回地址)。
实例:见下条指令的实例
12 寄存器内容取反指令
指令格式:COMFf,d
说明:COMF是Complement f的缩写。其中d=1时,操作(f)→f;d=0时,操作(f)→w。
功能:寄存器f内容取反后送入W(d=0)或f自身(d=1)。
实例: ORG 0x1FF
GOTO MAIN
ORG 0
DELAY …
MAIN MOVLW 0 ;主程序开始
TRTS 5 ;设置RA口为输出
BCF 5,0 ;置RA口0位为0
LOOP CALL DELAY;闪动延时
COMF 5 ;RA口求反(亮—灭—
亮……控制)
GOTO LOOP ;循环
…
说明:上述指令是一种PIC16C54 LED发光控制实验部分程序。其中延时子程序DELY未列出,但不影响本条指令的识读。程序中的主程序开始的三条指令,均已介绍过,紧跟着的CALL指令是调用执行子程序,其入口地址为标号DELAY。子程序执行结束后,又执行COMF 5的LED发光亮—灭…亮—灭……控制指令。后面一条GOTO LOOP指令是达到LED循环点亮目的。
13 面向位的操作指令(共4条,PIC高级产品多增一条)
该类指令除一条位清零外,另有一条寄存器f位b的置1指令和另外两条位跳步指令(PIC高级产品多增一条f的b位触发转换指令)。
(1)位置1指令。指令格式 BSFf,b
说明:BSF是Bit Set f的缩写。F和b的意义与前述相同,该条指令的功能是将寄存器f的b位置1。
(2)位测试、为零间跳指令。指令格式 BTFSC f,b
说明:BTFSC是Bit Test,Skip if Clear的缩写。指令功能是测试寄存器f位“b”,如为0,跳过下一条指令;为1顺序执行,即当f(b)=0时,就不执行当前指令而执行下一条指令(间跳),即用一条空指令NOP代替它,所以该条指令占用2个指令周期。
(3)位测试、为1间跳指令。指令格式 BTFSSf,b
说明:BTFSS是Bit Test,Skip if Set的缩写。其指令的逻辑功能与上条相反,位测试f(b)=1就间跳执行,f(b)=0顺序执行。
上面介绍的PIC 8位单片机汇编语言指令仅是部分指令,此外还有循环左、右移指令;W和寄存器f相“加”、相“与”指令和进入睡眠方式等指令。鉴于报纸版面的限制,不在这里一一介绍,
在前面的一系列文章中,我们详细学习了单片机中最基本的MCS-51系列。从本文开始,我们进入PIC单片机的学习部分,在接下来的文章中,ANY电子将带你详细学习PIC单片机的汇编语言以及PIC C语言,带你进入一个新的单片机世界。
首先,我们先来了解一下PIC单片机的指令系统,为了方便记忆,我们就从PIC单片机指令系统的来源开始这一系列的文章。需要注意的是,此处指令系统的来源由相关资料和书籍整理,仅供参考,以帮助理解记忆,尽快掌握PIC单片机的指令系统。
在前面的一系列文章中,我们详细学习了单片机中最基本的MCS-51系列。从本文开始,我们进入PIC单片机的学习部分,在接下来的文章中,ANY电子将带你详细学习PIC单片机的汇编语言以及PIC C语言,带你进入一个新的单片机世界。首先,我们先来了解一下PIC单片机的指令系统,为了方便记忆,我们就从PIC单片机指令系统的来源开始这一系列的文章。需要注意的是,此处指令系统的来源由相关资料和书籍整理,仅供参考,以帮助理解记忆,尽快掌握PIC单片机的指令系统。指令 指令缩写来源
ADDWF f,dADD W andF
ANDWF f,dAND WwithF
CLRF fCLeaRF
CLRW -CLeaRW
COMF f,dCOMplementF
DECF f,dDECrementF
DECFSZ f,dDECrementF,Skip if 0(Zero)
INCF f,dINCrementF
INCFSZ f,dINCrementF,Skip if 0(Zero)
IORWF f,dInclusiveOR WwithF
MOVF f,dMOVeF
MOVWF fMOV WtoF
NOP -NO Operation
RLF f,dRotateLeftFthrough carry
RRF f,dRotateRightFthrough carry
SUBWF f,dSUBtractWfromF
SWAPF f,dSWAPnibbles inF
XORWF f,d eXclusiveORWwithF
BCF f,bBitClearF
BSF f,bBitSetF
BTFSC f,bBitTestF,Skip ifClear
BTFSS f,bBitTestF,Skip ifSet
ADDLW kADDLiteral andW
ANDLW kANDLiteral withW
CALL kCALLsubroutine
CLRWDT -CLeaRWatchDogTimer
GOTO kGO TOaddress
IORLW kInclusiveORLiteral withW
MOVLW kMOVeLiteral toW
RETFIE -RETurnFromIntErrupt
RETLW kRETurn withLiteral inW
RETURN -RETURNfrom subroutine
SLEEP - go intoSLEEPmode
SUBLW kSUBtractLiteral fromW
XORLW k eXclusiveORLiteral withW其中,有朋友说,上面指令系统中的RETFIE -RETurnFromIntErrupt应理解为RETurnFromInterrupt with interruptEnable