IC8位单片机汇编语言常用指令的识读.docx
- 文档编号:28375608
- 上传时间:2023-07-10
- 格式:DOCX
- 页数:23
- 大小:31.14KB
IC8位单片机汇编语言常用指令的识读.docx
《IC8位单片机汇编语言常用指令的识读.docx》由会员分享,可在线阅读,更多相关《IC8位单片机汇编语言常用指令的识读.docx(23页珍藏版)》请在冰豆网上搜索。
IC8位单片机汇编语言常用指令的识读
PIC单片机指令集简介
PIC8位单片机共有三个级别,有相对应的指令集。
基本级PIC系列芯片共有指令33条,每条指令是12位字长;中级PIC系列芯片共有指令35条,每条指令是14位字长;高级PIC系列芯片共有指令58条,每条指令是16位字长。
其指令向下兼容。
一、PIC汇编语言指令格式
PIC系列微控制器汇编语言指令与MCS-51系列单片机汇编语言一样,每条汇编语言指令由4个部分组成,其书写格式如下:
标号 操作码助记符 操作数1,操作数2;注释
指令格式说明如下:
指令的4个部分之间由空格作隔离符,空格可以是1格或多格,以保证交叉汇编时,PC机能识别指令。
1标号 与MCS-51系列单片机功能相同,标号代表指令的符号地址。
在程序汇编时,已赋以指令存储器地址的具体数值。
汇编语言中采用符号地址(即标号)是便于查看、修改,尤其是便于指令转移地址的表示。
标号是指令格式中的可选项,只有在被其它语句引用时才需派上标号。
在无标号的情况下,指令助记符前面必须保留一个或一个以上的空格再写指令助记符。
指令助记符不能占用标号的位置,否则该助记符会被汇编程序作标号误处理。
书写标号时,规定第一字符必须是字母或半角下划线“—”,它后面可以跟英文和数字字符、冒号(:
)制符表等,并可任意组合。
再有标号不能用操作码助记符和寄存器的代号表示。
标号也可以单独占一行。
2操作码助记符 该字段是指令的必选项。
该项可以是指令助记符,也可以由伪指令及宏命令组成,其作用是在交叉汇编时,“指令操作码助记符”与“操作码表”进行逐一比较,找出其相应的机器码一一代之。
3操作数 由操作数的数据值或以符号表示的数据或地址值组成。
若操作数有两个,则两个操作数之间用逗号(,)分开。
当操作数是常数时,常数可以是二进制、八进制、十进制或十六进制数。
还可以是被定义过的标号、字符串和ASCⅡ码等。
具体表示时,规定在二进制数前冠以字母“B”,例如B10011100;八进制数前冠以字母“O”,例如O257;十进制数前冠以字母“D”,例如D122;十六进制数前冠以“H”,例如H2F。
在这里PIC8位单片机默认进制是十六进制,在十六进制数之前加上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是英语WatchdogTimer的缩写字母。
CLR见上述说明。
注意该两条指令无操作数。
3寄存器f清零指令。
指令格式:
CLRFf
实例:
CLRFTMRO;对TMRO清零
说明:
在PIC系列8位单片机中,常用符号F(或f)代表片内的各种寄程器和F的序号地址。
F取值按PIC系列不同型号而不同,一般为Ox00~Ox1F/7F/FF。
TMRO代表定时器/计数器TMRO,所以CLRF对寄程器清零,采用了直接寻址方式直接给出要访问的寄存器TMRO。
4位清零指令。
指令格式BCFf,b
实例:
BCFREG1,2;把寄存器REG1的D2位清零
说明:
BCF是英语BitClearF的缩写。
指令格式中的F,同上说明;符号b是表示PIC片内某个8位数据寄存器F的位号(或位地址),所以b的取值为0~7或D0~D7。
实例中REG是Register的缩写。
实例中的2代表指令格式中的b=2即寄存器REG1的D2位。
通过上述四条清零指令格式和实例,可以说明,学习PIC系列8位单片机的指令时应首先了解指令的助记符意义(功能),再有就是它的表达方式。
初学者没有必要死记指令,重要是理解和实践。
三、面向字节、常数与控制操作的指令
1传送立即数至工作寄存器W指令
指令格式:
MOVLWk;k表示常数、立即数和标号
说明:
MOVLW是MoveLiteraltow的缩写
实例:
MOVL0x1E;常数30送W
2I/O口控制寄存器TRIS设置指令
指令格式;TRIS f
说明;TRISf是LoadTRISRegister的缩写。
其功能是把工作寄存器W的内容送入I/O口控制寄存器f。
当W=0时,置对应I/O口为输出;W=1,置I/O口为输入。
实例:
MOVLW0x00;把00H送入W
TRISRA;置PICRA口为输出
MOVLW0xFF;把FFH送入W
TRISRB;置PICRB口为输入
说明:
这是PIC汇编语言中常用的几条指令,即设置某个I/O口(这里是RA口和RB口)为输入或输出的语句。
可见,识读指令时,一应充分理解语句格式的功能,二应前后联系阅读。
3W寄存器内容送寄存器f(W内容保持不变)指令
指令格式:
MOVWFf
说明:
MOVWF是MoveWtof的缩写
实例:
MOVLW0x0B;送0BH送W
MOVWF6;送W内容到RB口
说明:
第一条指令0x0B(常数11)送工作寄存器W,第二条指令,把W内容常数11送到寄存器F6中,查表F6即为RB口,所以PORT_B(B口)=0BH=D11
4寄存器f传送指令
指令格式:
MOVFf,d
说明:
MOVF是Movef的缩写。
F代表PIC中的某个寄存器。
指令中的d规定:
d=0时,f内容送W;d=1时,f内容送寄存器。
实例:
MOVF6,0;RB口内容送W
MOVWF8 ;RB口内容送f8
说明:
第一条指令中的6代表寄存器f=6,查寄存器表f=6为RB口;0代表d=0,代表选择的目标为寄存器W。
第二条指令中的8代表寄存器f=8。
所以两条指令结果是把RB口的内容送f8。
至于f8内容是多少?
还应在汇编语言开始时附加指令,这里从略。
5空操作指令
指令格式:
NOP
说明:
NOP是英语NoOperation的缩写。
NOP无操作数,所以称为空操作。
执行NOP指令只使程序计数器PC加1,所以占用一个机器周期。
实例:
MOVLW0xOF ;送OFH到W
MOVWFPORT_B;W内容写入B口
NOP ;空操作
MOVFPORT_B,W;读操作
说明:
该三条指令是一种对I/O口的B口连续操作的实例,其目的达到写入B口的内容要读出时,应保证写、读之间有个稳定时间,因此加入了空操作指令NOP。
6无条件跳转指令
指令格式:
GOTOk
说明:
执行该条指令时,将指令转移到指定的地址(跳转)。
指令中的k,常与程序中的标号联系起来。
实例:
见第9条指令中
7寄存器内容减1,结果为零的间跳指令
指令格式:
DECFSZf,d
说明:
DECFSZ是英语Decrementf,Skipofnot0的缩写。
符号f,d代表的意义,前述已作说明。
该条指令是指寄存器的内容减1存入W(d=0)或f(d=1)中。
若指令执行结果减1不为零,指令顺序执行;为零时,就间跳下一条指令后再执行(等效顺序执行一条空指令NOP),实际指令中,当d=1时,该项常被略去。
8寄存器内容加1,结果为零间跳指令
指令格式:
INCFSZf,d
说明:
INCFSZ是英语Incrementf,Skipof0的缩写。
该条指令与上一条(7)指令差别仅在于“1”上,即执行这条指令时,寄存器f内容加1,若结果不为零,则指令顺序执行;为零则指令间跳执行。
执行这条指令的其它逻辑关系与上条相同。
9子程序返回指令
指令格式:
RETLWk
说明:
RETLW是ReturnLiteraltoW的缩写。
该指令代表子程序返回,返回前先把8位立即数送W。
实例:
PIC某个汇编语言的延时子程序(摘要):
(1)BELYMOVLW0xC5;送延时常数0C5H入W
(2) MOVWFCOUNT2;0C5H送入计数器2
(3) CLRFCOUNT1;对计数器1清零
(4)LOOPINCFSZCOUNT1;计数器1加1计数器1加
1结果不为零,跳转循环
(5) GOTOLOOP ;
(6) DECTSZCPUNT2;计数2减1计数器2减1
结果不为零,跳转循环重
复执行第4条指令
(7) GOTOLOOP ;
(8) RETLW0 ;子程序执行结束返回
说明:
程序中的注释已分别对每条指令的功能作了说明,补充说明1当执行第(4)条加1指令结果为零时,就间跳转到执行第(6)条指令。
2当执行第(6)条减1指令结果为零时,就间跳转到第(8)条子程序返回,整个延时指令才算完成。
3计数器1或2代表PIC中某个寄存器,该寄存器由程序开始的伪指令赋值决定(关于伪指令今后将作专门介绍)。
本文关于指令的注释将与前述指令中的略有不同。
前述指令注释时是对指令具体完成的功能给以说明,这种注释方法对初学者确实易于接受和理解,但是实际应用中的PIC产品汇编语言的注释通常是以程序要做什么(或指令的作用)而不是说指令的直接功能。
鉴于上述原因,下述的指令注释将改变过去的注释方法,用程序应起的作用作注释。
10寄程器半字节交换指令
指令格式:
SWAPF f,d
说明:
SWAPF是Swapf的合写。
符号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×系列芯片中断现场保护的实例程序。
MOVWFW_TEMP ;将W内容存入到临时寄存器
W_TEMP中
SWAPFSTATUS,W ;交换STATUS与W内容
MOVWFSTATUS_TEMP;将STATUS的内容存入到临
… 时寄存器STATUS_TEMP中
中断服务程序
…
SWAPFSTATUS_TEMP,W;交换STATUS_TEMP与W
的内容
MOVWFSTATUS ;STATUS复原成原来的状态
SWAPFW_TEMP,F ;交换内容
SWAPFW_TEMP,W ;W复原成原来的状态
说明:
上述程序中各条指令的注释基本上都是以程序应达到的目的而注释的,对每条指令的功能几乎未涉及。
这是初学者应特别注意的。
11子程序调用指令(SubroutineCall)
指令格式:
CALLk;k为立即地址
说明:
子程序调用,不同型号芯片的实现方法不尽相同,其共同点是首先将返回地址((PC)+1)压栈保护,再转入所调用的子程序入口地址执行(与MCS-51指令功能相似)。
指令格式模式:
HERECALLDELAY;调用延时子程序
…
DELAYMOVLW0x80 ;延时子程序
RETLW0
说明:
调用指令执行前,PC=地址HERE
调用指令执行后,PC=地址DELAY(标号),堆栈指针TOS=HERE+1(返回地址)。
实例:
见下条指令的实例
12寄存器内容取反指令
指令格式:
COMF f,d
说明:
COMF是Complementf的缩写。
其中d=1时,操作(f)→f;d=0时,操作(f)→w。
功能:
寄存器f内容取反后送入W(d=0)或f自身(d=1)。
实例:
ORG 0x1FF
GOTOMAIN
ORG 0
DELAY…
MAINMOVLW0;主程序开始
TRTS5;设置RA口为输出
BCF5,0 ;置RA口0位为0
LOOP CALLDELAY;闪动延时
COMF5;RA口求反(亮—灭—
亮……控制)
GOTOLOOP;循环
…
说明:
上述指令是一种PIC16C54LED发光控制实验部分程序。
其中延时子程序DELY未列出,但不影响本条指令的识读。
程序中的主程序开始的三条指令,均已介绍过,紧跟着的CALL指令是调用执行子程序,其入口地址为标号DELAY。
子程序执行结束后,又执行COMF5的LED发光亮—灭…亮—灭……控制指令。
后面一条GOTOLOOP指令是达到LED循环点亮目的。
13面向位的操作指令(共4条,PIC高级产品多增一条)
该类指令除一条位清零外,另有一条寄存器f位b的置1指令和另外两条位跳步指令(PIC高级产品多增一条f的b位触发转换指令)。
(1)位置1指令。
指令格式BSF f,b
说明:
BSF是BitSetf的缩写。
F和b的意义与前述相同,该条指令的功能是将寄存器f的b位置1。
(2)位测试、为零间跳指令。
指令格式BTFSCf,b
说明:
BTFSC是BitTest,SkipifClear的缩写。
指令功能是测试寄存器f位“b”,如为0,跳过下一条指令;为1顺序执行,即当f(b)=0时,就不执行当前指令而执行下一条指令(间跳),即用一条空指令NOP代替它,所以该条指令占用2个指令周期。
(3)位测试、为1间跳指令。
指令格式BTFSS f,b
说明:
BTFSS是BitTest,SkipifSet的缩写。
其指令的逻辑功能与上条相反,位测试f(b)=1就间跳执行,f(b)=0顺序执行。
上面介绍的PIC8位单片机汇编语言指令仅是部分指令,此外还有循环左、右移指令;W和寄存器f相“加”、相“与”指令和进入睡眠方式等指令。
鉴于报纸版面的限制,不在这里一一介绍,今后将在程序的应用试验中再作补充说明。
成都 史为
知识竞赛试题:
13请把下列程序加注释,程序中的“5”代表RA(F5)口;“6”代表RB(F6)口。
CLRW ;MOVLWOFFH
TRIS5 TRIS 6
BCF5,1 BCF 50
BSF5,0 … 右排接左
各大类单片机的指令系统是没有通用性的,它是由单片机生产厂家规定的,所以用户必须遵循厂家规定的标准,才能达到应用单片机的目的。
PIC8位单片机共有三个级别,有相对应的指令集。
基本级PIC系列芯片共有指令33条,每条指令是12位字长;中级PIC系列芯片共有指令35条,每条指令是14位字长;高级PIC系列芯片共有指令58条,每条指令是16位字长。
其指令向下兼容。
在这里笔者介绍PIC8位单片机汇编语言指令的组成及指令中符号的功能,以供开始学习者阅读相关书籍和资料时快速入门。
一、PIC汇编语言指令格式 PIC系列微控制器汇编语言指令与MCS-51系列单片机汇编语言一样,每条汇编语言指令由4个部分组成,其书写格式如下:
标号 操作码助记符 操作数1,操作数2;注释 指令格式说明如下:
指令的4个部分之间由空格作隔离符,空格能是1格或多格,以保证交叉汇编时,PC机能识别指令。
1标号 与MCS-51系列单片机功能相同,标号代表指令的符号地址。
在程序汇编时,已赋以指令存储器地址的具体数值。
汇编语言中采用符号地址(即标号)是便于查看、修改,尤其是便于指令转移地址的表示。
标号是指令格式中的可选项,只有在被其它语句引用时才需派上标号。
在无标号的情况下,指令助记符前面必须保留一个或一个以上的空格再写指令助记符。
指令助记符不能占用标号的位置,不然该助记符会被汇编程序作标号误处理。
书写标号时,规定第一字符必须是字母或半角下划线“—”,它后面能跟英文和数字字符、冒号(:
)制符表等,并可任意组合。
再有标号不能用操作码助记符和寄存器的代号表示。
标号也能单独占一行。
2操作码助记符 该字段是指令的必选项。
该项能是指令助记符,也能由伪指令及宏命令组成,其作用是在交叉汇编时,“指令操作码助记符”与“操作码表”进行逐一比较,找出其相应的机器码一一代之。
3操作数 由操作数的数据值或以符号表示的数据或地址值组成。
若操作数有两个,则两个操作数之间用逗号(,)分开。
当操作数是常数时,常数能是二进制、八进制、十进制或十六进制数。
还能是被定义过的标号、字符串和ASCⅡ码等。
具体表示时,规定在二进制数前冠以字母“B”,例如B10011100;八进制数前冠以字母“O”,例如O257;十进制数前冠以字母“D”,例如D122;十六进制数前冠以“H”,例如H2F。
在这里PIC8位单片机默认进制是十六进制,在十六进制数之前加上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是英语WatchdogTimer的缩写字母。
CLR见上述说明。
注意该两条指令无操作数。
3寄存器f清零指令。
指令格式:
CLRFf 实例:
CLRFTMRO;对TMRO清零 说明:
在PIC系列8位单片机中,常用符号F(或f)代表片内的各种寄程器和F的序号地址。
F取值按PIC系列不一样型号而不一样,一般为Ox00~Ox1F/7F/FF。
TMRO代表定时器/计数器TMRO,所以CLRF对寄程器清零,采用了直接寻址方式直接给出要访问的寄存器TMRO。
4位清零指令。
指令格式BCFf,b 实例:
BCFREG1,2;把寄存器REG1的D2位清零 说明:
BCF是英语BitClearF的缩写。
指令格式中的F,同上说明;符号b是表示PIC片内某个8位数据寄存器F的位号(或位地址),所以b的取值为0~7或D0~D7。
实例中REG是Register的缩写。
实例中的2代表指令格式中的b=2即寄存器REG1的D2位。
通过上述四条清零指令格式和实例,能说明,学习PIC系列8位单片机的指令时应首先了解指令的助记符意义(功能),再有就是它的表达方式。
开始学习者没有必要死记指令,重要是理解和实践。
成都 史为 竞赛试题:
10有一RB(8位)寄存器,其工作状态RB=OxB8,对它执行指令:
BCFRB,4 执行后的RB=B ;Ox ;O 和D 。
11指令中的标号是可选项,在什么条件下可派上用场?
PIC8位单片机的汇编语言
要单片机完成一项基本任务,必须将任务分解成一些具体步骤,再要求它去逐项执行每个步骤,还要对它下命令。
该命令在单片机术语中称为“指令”(Inetruction)。
完成一项任务所需的所有指令的有序集合就称为“程序”(Programm)。
这些指令要预先一条一条顺序地放到单片机的程序存贮器中,单片机在运行时,片中的CPU从程序存贮器中逐条有序取出指令,执行指令,并将有关指令执行完毕,即可完成既定任务。
不同种类的单片机有不同的一套命令(即所谓“指令系统”)。
PIC系列的单片机其指令系统与51系列的完全不同。
PIC16F84有30余条指令构成的指令系统。
每条指令由14位(bit)构成,这些位是二进制码的0和1,如果要使16F84端口B的B0位输出高电平,以点亮一只发光二极管LED,而B口的其余各位仍保持低电平,则需要使单片机执行下列各条指令(机器码):
11000000000000
00000001100110
11000000000001
00000010000110
10100000000100
早先的技术人员就是用这样的二进制码来编写程序的。
上列程序,看起来像天书,很费解,但它完全能指挥单片机的运作。
因为单片机实际上是一种复杂的数字逻辑电路。
我们都知道,要数字电路运作,必须相应输入高、低电平,对正逻辑而言,高电平为1,低电平为0。
上述指令顺序在不同的数位上出现的0和1,经译码后,即可完成各种不同的运作,逐步完成单片机所要执行的任务,如点亮一个LED。
上述各条指令的写法,虽然是完全面向单片机,是用来直接指示单片机该如何运作的。
因此,这种由0、1组成的指令称为机器语言。
实际上,这种由二进码构成的指令集不但难读懂,而且用来编程也有困难。
因为程序往往不是从头到尾顺序执行,有时还需中途转移到其它单元执行一段程序后再返回来。
而指令是一条一条顺序存放在存贮器各个单元内的。
因此,如果要转移,需指明具体转到哪个单元,即要写出该单元的地址。
但在编写程序时,该程序有多长,具体要放到哪些单元中,都是未知数,又怎能具体指明要转到哪个单元呢?
由于用机器语言会使程序难写、难读,后来一种新型的语言形式——汇编语言就问世了。
使用这种语言写程序较方便,也比较容易读懂。
不过,和机器语言一样,不同类型的单片机有完全不同的汇编语言。
就如不同地区的人有不同的方言一样。
在汇编语言中,转移地址是用符号来表示的。
现在,我们把上面由机器语言写成的程序改写成由汇编语言构成的程序:
movlwB‘00000000’
trisPORTB
movlwB‘00000001’
movwfPORT
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- IC8 单片机 汇编语言 常用 指令