单片机原理及应用李林功著第03章 指令系统_第1页
单片机原理及应用李林功著第03章 指令系统_第2页
单片机原理及应用李林功著第03章 指令系统_第3页
单片机原理及应用李林功著第03章 指令系统_第4页
单片机原理及应用李林功著第03章 指令系统_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第03章指令系统与汇编语言程序设计3.1指令格式 3.2寻址方式 3.3数据传送类指令 3.4算术运算类指令

3.5逻辑运算类指令 3.6控制转移类指令 3.7位操作类指令

MCS-51单片机指令系统1.按指令所占的字节数可分为:(1)单字节指令(49条)(2)双字节指令(46条)(3)三字节指令(16条)2.按指令的执行时间可分为:(1)单周期指令(65条)(2)双周期指令(44条)(3)四周期指令(2条)3、按指令的功能可分为:(1)数据传送类指令(29条)(2)算术运算类指令(24条)(3)逻辑运算类指令(24条)(4)控制转移类指令(17条)(5)位操作类指令(17条)3.1MCS-51单片机指令格式 [标号:]操作码助记符[目的操作数][,源操作数][;注释]例如:AA:ADDA,﹟10H;将累加器A的内容与10H相加,结果存入累加器A AA为标号,是这条指令的标志,其值是该条指令的首地址;

ADD为操作码,说明要进行加法运算;目的操作数为累加器A;源操作数为﹟10H;“;”后面为注释部分。

MCS-51单片机指令中常用的符号规定:1)A(ACC)——累加器。2)B——专用寄存器,用于乘法和除法指令中。3)C——进位标志或进位位,或布尔处理机中的累加位(器)4)DPTR——数据指针,可用作16位地址寄存器。5)Rn(n=0~7)——当前寄存器组的8个工作寄存器R0~R7,由PSW中的RS1、RS0决定当前使用的寄存器组。6)Ri(i=0或1)——可用于间接寻址的两个寄存器R0、R1。7)#data——8位立即数8)#data16——16位立即数。9)rel——以补码形式表示的8位相对偏移量,范围为-128~127,主要用在相对寻址的指令中。10)addr16和addr11——分别表示16位直接地址和11位直接地址。即存放操作数的存储器地址。11)direct——表示内部数据存贮器单元的地址或特殊功能寄存器SFR的地址,对SFR而言,既可使用它的物理地址,也可直接使用它的名字。12)bit——表示内部RAM和SFR中的某些具有位寻址功能的位地址。SFR中的位地址可以直接出现在指令中,为了阅读方便,往往也可用SFR的名字和所在的数位表示。如:表示PSW中的奇偶校验位,可写成D0H,也可写成PSW.0的形式。13)@——间接寻址中工作寄存器的前缀符号。14)(X)——X单元中的内容。15)((X))——以X单元的内容为地址的存储器单元内容,即(X)作地址,该地址单元的内容用((X))表示。16)$——当前指令的地址。17)/——“/”表示对该位操作数取反,但不影响该位的原值。18)→——“→”表示操作流程,将箭尾一方的内容送入箭头所指的另一方单元中。3.2MCS-51单片机寻址方式1立即数寻址

立即寻址方式是指操作数包括在指令字节中,紧跟在操作码的后面,作为指令的一部分与操作码一起存放在程序存储器中。符号"#"为立即数前缀【例】:MOVA,#52H;A←52HMOVDPTR,#5678H;DPTR←5678H2寄存器寻址

指令指定寄存器的名字,寄存器的内容为操作数【例】:MOVA,R0 ;A←(R0)

可用于寄存器寻址的寄存器有: (1)四组工作寄存器R0~R7共32个。 (2)部分特殊功能寄存器A、B、DPTR等。3寄存器间接寻址

指令指定寄存器的名字,寄存器的内容为操作数的存储器地址。标志为寄存器名字前加“@”符号。不同的存储空间要用不同的寄存器,规定如下:片内(128B)间接用Ri,即@R1,@R0片外(64KB)间接用DPTR,即@DPTR片外(低256B)可用@DPTR或@R1,@R0

注意:寄存器间接寻址方式不能用于对特殊功能寄存器SFR的寻址,堆栈操作(PUSH,POP)为隐含的SP间接寻址。【例】:MOVDPTR,#3456H;DPTR←3456HMOVXA,@DPTR;A←((DPTR))

假设(3456H)=99H,指令运行后(A)=99H。4直接寻址指令中直接给出操作数的存储器地址,操作数在存储器中。

【例】:MOVA,52H ;A←(52H)基址寄存器加变址寄存器的间接寻址

三条变址指令MOVCA,@A+PC;A←((A)+(PC))MOVCA,@A+DPTR;A←((A)+(DPTR))JMP@A+DPTR;PC←(A)+(DPTR)前两条指令是在程序存储器中取操作数;第三条指令是要获得程序的跳转地址,实现程序的转移。5变址寻址【例】:MOVA,#22H MOVDPTR,#63A0H MOVCA,@A+DPTR;A←((A)+(DPTR))6相对寻址相对寻址以程序计数器PC的当前值作为基地址,与指令中给出的相对偏移量rel进行相加,把所得之和作为程序的转移地址.。在使用相对寻址时要注意以下两点:

(1)当前PC值是指相对转移指令的存储地址加上该指令的字节数。(2)偏移量rel是有符号的单字节数,以补码表示,其取值范围是-128~+127(00H~FFH)。 目标地址=当前PC值+rel=指令存储地址+指令字节数+rel【例】:SJMP08H;PC←PC+2+08H

设该指令首地址为2000H,PC+2=2002H。因此程序转向(PC)+2+rel=2000H+2+08H=200AH单元。7位寻址

位寻址是在指令中直接给出操作数的位地址。①直接位地址【例】:MOVC,0D5H ;PSW的位5(位地址D5H)②点操作符.【例】:MOVC,PSW.5 MOVC,0D0H.5

③位名称表示形式【例】:MOVC,F0④用户位定义

LEDBITP1.1MOVLED,C寻址方式与寻址空间寻址方式利用的变量

寻址空间1立即寻址#data程序存储器2寄存器寻址R0~R7﹑A﹑B﹑DPTR工作寄存器和部分SFR3寄存器间接寻址@R0﹑@R1﹑SP片内RAM低128B@R0﹑@R1﹑@DPTR片外RAM或外部I/0口4直接寻址direct片内RAM低128B和SFR5变址寻址@A+PC﹑@A+DPTR程序存储器6相对寻址PC+偏移量程序存储器相对PC当前值256B7位寻址bit片内位寻址区和部分SFR存储空间与寻址方式内部00H~1FH工作寄存器寄存器、直接、间接内部20H~2FH位空间位、直接、间接内部30H~7FH用户RAM直接、间接内部80H~FFH特殊功能寄存器SFR直接、位(部分)外部RAM间接外部ROM程序存储器变址、相对3.3数据传送类指令助记符有:MOV,MOVX,MOVC,XCH,XCHD,PUSH,POP,SWAP。格式:MOV[目的操作数],[源操作数]功能:目的操作数←源操作数中的数据源操作数可以是:A、Rn、direct、@Ri、#data目的操作数可以是:A、Rn、direct、@Ri注意:一般不影响标志,只有一种堆栈操作可能直接修改程序状态字PSW。另外,如果目的操作数为ACC,将会影响奇偶标志P。指令功能标志位解释POVACCYMOVA,directA←(direct)√×××直接地址单元地址中的内容送到累加器AMOVA,#dataA←#data√×××立即数送到累加器A中MOVA,RnA←(Rn)√×××Rn中的内容送到累加器A中MOVA,@RiA←((Ri))√×××Ri内容指向的地址单元中的内容送到累加器A1.以累加器A为目的操作数的传送指令(4条)

【例】:设外部RAM(2023H)=0FH,执行以下程序段:

MOVDPTR,#2023H;DPTR←2023H MOVXA,@DPTR ;A←((DPTR)) MOV30H,A ;30H←(A) MOVA,#00H ;A←00H MOVX@DPTR,A ;((DPTR))←(A)

程序段执行后,(DPTR)=2023H,(30H)=0FH,(A)=00H,(2023H)=00H,表示把片外RAM2023H单元的内容0FH送到内部RAM的30H单元,然后把外部RAM2023H单元和累加器A清0。 若采用R0和R1间接寻址,必须把高8位地址先送到P2口,上述程序段将改为:

MOVP2,#20H ;P2←20H MOVR0,#23H ;R0←23H MOVXA,@R0 ;A←(2023H) MOV30H,A ;30H←(A) MOVA,00H ;A←00H MOVX@R0,A ;2023H←(A)2.以寄存器Rn为目的操作数的传送指令(3条)注意:没有以下指令MOVRn,Rn;MOVRn,@Ri;MOV@Ri,Rn指令功能标志位解释POVACCYMOVRn,directRn←(direct)××××直接地址单元中的内容送到寄存器Rn中MOVRn,#dataRn←#data××××立即数送到寄存器Rn中MOVRn,ARn←(A)××××累加器A中的内容送到寄存器Rn中

【例】:设内部RAM(30H)=40H,(40H)=10H,(10H)=00H,(P1)=0CAH,分析以下程序执行后,各单元、寄存器、P2口的内容。

MOVR0,#30H ;R0←30H MOVA,@R0 ;A←((R0)) MOVR1,A ;R1←(A) MOVB,@R1 ;B←((R1)) MOV@R1,P1 ;((R1))←(P1) MOVP2,P1 ;P2←(P1) MOV10H,#20H ;(10H)←20H执行上述指令后,(R0)=30H;(R1)=(A)=40H;(B)=10H;(40H)=(P1)=(P2)=0CAH;(10H)=20H。3.以直接地址为目的操作数的传送指令(5条)注意:MOVdirect1,direct2,翻译成机器码时,源地址在前,目的地址在后。例MOV20H,30H翻译为:853020H指令功能标志位解释POVACCYMOVdirect,directdirect←(direct)××××直接地址单元中的内容送到直接地址单元MOVdirect,#datadirect←#data××××立即数送到直接地址单元MOVdirect,Adirect←(A)××××累加器A的内容送到直接地址单元MOVdirect,Rndirect

←(Rn)××××寄存器Rn的内容送到直接地址单元MOVdirect,@Ridirect←((Ri))××××寄存器Ri中的内容指定的存储单元中的数据送到直接地址单元4.以间接地址为目的操作数的传送指令(3条)指令功能标志位解释POVACCYMOV@Ri,direct(Ri)←(direct)××××直接地址单元中的内容送到以Ri中的内容为地址的RAM单元MOV@Ri,#data(Ri)←#data××××立即数送到以Ri中的内容为地址的RAM单元MOV@Ri,A(Ri)←(A)××××累加器A中的内容送到以Ri中的内容为地址的RAM单元5.查表指令(2条)指令功能标志位解释POVACCYMOVCA,@A+DPTRA←((A)+(DPTR))√×××DPTR的内容加上A的内容作为存储器地址,将该地址单元中的内容送到累加器A中MOVCA,@A+PCPC←(PC)+1A←((A)+(PC))√×××PC的内容加上1,再加上A的内容作为存储器地址,将该地址单元中的内容送到累加器A中

【例】:编一查表程序将内部ROM40H单元内的数(0~9)的平方存入内部RAM50H单元。

MOVA,40H;40H单元的数送A MOVDPTR,#TAB;DPTR指向表头

MOVCA,@A+DPTR ;查表

MOV50H,A;结果存50H SJMP$;等待

TAB:DB0,1,4,9,……81

【例】:编一查表程序将内部RAM40H单元内的数(0~9)的平方存入内部RAM50H单元。

00219=3^300204=2^200191=1^100180=0^00017SJMP$0016MOV50H,A0014MOVCA,@A+DPTR0012MOVDPTR,#TAB0010MOVA,40H地址……指令……TABROM平方数据表50H…………40H2RAM6.累加器A与片外数据存储器的传送指令(4条)指令功能标志位解释POVACCYMOVX@DPTR,A(DPTR)←(A)√×××累加器中的内容送到数据指针指向的片外RAM地址中MOVXA,@DPTRA←((DPTR))√×××数据指针指向的片外RAM地址中的内容送到累加器A中MOVXA,@RiA←((Ri))√×××寄存器Ri指向的片外RAM地址中的内容送到累加器A中MOVX@Ri,A(Ri)←(A)√×××累加器中的内容送到寄存器Ri指向的片外RAM地址中注意:在堆栈指令中只能用ACC,不能用A,属于直接寻址。7.堆栈操作类指令(2条)指令功能标志位解释POVACCYPUSHdirectSP←(SP)+1,SP←(direct)××××堆栈指针首先加1,直接寻址单元中的数据送到堆栈指针SP所指的单元中POPdirectdirect←(SP),SP←(SP)-1××××堆栈指针SP所指的单元数据送到直接寻址单元中,堆栈指针SP减1.

【例】:进入中断服务程序时,常把程序状态寄存器PSW、累加器A、数据指针DPTR进栈保护。设当前SP为60H。则程序段

MOVSP,#60H PUSHPSW PUSHACC PUSHDPL PUSHDPH执行后,SP内容修改为64H,而61H、62H、63H、64H单元中依次存入PSW、A、DPL、DPH的内容。65H64HDPH63HDPL62HACC61HPSW60H……40HRAMSP堆栈区

【例】:在中断服务程序结束之前,用下列程序段恢复数据。

POPDPH POPDPL POPACC POPPSW指令执行之后,SP内容修改为60H,而64H、63H、62、61H单元的内容依次弹出到DPH、DPL、A、PSW中。保护数据时,进栈、出栈的次序一定要符合“先进后出”的原则。8.交换指令(5条)指令功能标志位解释POVACCYXCHA,Rn(A)←→(Rn)√×××累加器与工作寄存器Rn的内容互换XCHA,@Ri(A)←→((Ri))√×××累加器与工作寄存器Ri所指的存储单元中的内容互换XCHA,direct(A)←→(direct)√×××累加器与直接地址单元中的内容互换XCHDA,@Ri(A3-0)←→((Ri)3-0)√×××累加器与工作寄存器Ri所指的存储单元中的内容低半字节互换SWAPA(A3-0)←→(A7-4)×累加器中的内容高低半字节互换【例】:设(R0)=30H,(A)=65H,(30H)=8FH执行指令:XCHA,@R0 ;(R0)=30H,(A)=8FH, (30H)=65HXCHDA,@R0 ;(R0)=30H,(A)=6FH, (30H)=85HSWAPA ;(A)=56H指令功能标志位解释POVACCYMOVDPTR,#data16DPH←#dataH,DPL←#dataL××××16位常数的高8位送到DPH,低8位送到DPL9.16位数据传送指令(1条)

【例】:将片内RAM30H单元与40H单元中的内容互换。 方法1(直接地址传送法):

MOV31H,30H MOV30H,40H MOV40H,31H SJMP $

方法2(间接地址传送法):

MOVR0,#40H MOVR1,#30H MOVA,@R0 MOVB,@R1 MOV@R1,A MOV@R0,B SJMP$

方法3(字节交换传送法):

MOVA,30H XCHA,40H MOV30H,A SJMP$

方法4(堆栈传送法):

PUSH30H PUSH40H POP30H POP40H SJMP$3.4算术运算类指令算术运算指令共有24条算术运算主要是执行加、减、乘、除法四则运算;加1、减1操作及BCD码的运算调整利用进位标志C,可进行多字节无符号整数运算利用溢出标志,还可以对带符号数进行补码运算除加1、减1指令外,这类指令都对PSW有影响

MnemonicDescriptionByteCycleADDA,RnAddstheregistertotheaccumulator11ADDA,directAddsthedirectbytetotheaccumulator22ADDA,@RiAddstheindirectRAMtotheaccumulator12ADDA,#dataAddstheimmediatedatatotheaccumulator22ADDCA,RnAddstheregistertotheaccumulatorwithacarryflag11ADDCA,directAddsthedirectbytetotheaccumulatorwithacarryflag22ADDCA,@RiAddstheindirectRAMtotheaccumulatorwithacarryflag12ADDCA,#dataAddstheimmediatedatatotheaccumulatorwithacarryflag22SUBBA,RnSubtractstheregisterfromtheaccumulatorwithaborrow11SUBBA,directSubtractsthedirectbytefromtheaccumulatorwithaborrow22SUBBA,@RiSubtractstheindirectRAMfromtheaccumulatorwithaborrow12SUBBA,#dataSubtractstheimmediatedatafromtheaccumulatorwithaborrow221.加法指令(4条)指令功能标志位解释POVACCYADDA,#dataA←(A)+#data√√√√累加器A中的内容与立即数#data相加,结果存在A中ADDA,directA←(A)+(direct)√√√√累加器A中的内容与直接地址单元中的内容相加,结果存在A中ADDA,RnA←(A)+(Rn)√√√√累加器A中的内容与工作寄存器Rn中的内容相加,结果存在A中ADDA,@RiA←(A)+((Ri))√√√√累加器A中的内容与工作寄存器Ri所指向地址单元中的内容相加,结果存在A中

各标志位的形成方法:如果位7有进位输出,则置位CY,否则清CY;如果位3有进位输出,则置位AC,否则清AC;

OV=CY7⊕CY6。若累加器A中1的个数为奇数,则P=1,否则,P=0。

CYACF0RS1RS0OV--P【例】:设(A)=85H,(R1)=30H,(30H)=0AFH,执行指令:

ADDA,@R1 10000101

+10101111 100110100执行结果为:(A)=34H,CY=1,AC=1,OV=1,P=1

对于加法,溢出只能发生在两个加数符号相同的情况。在进行带符号数的加法运算时,溢出标志OV=1表示有溢出发生(即和大于+127或小于~128)。指令功能标志位解释POVACCYADDCA,directA←(A)+(direct)+(CY)√√√√累加器A中的内容与直接地址单元的内容连同进位位相加,结果存在A中ADDCA,#dataA←(A)+#data+(CY)√√√√累加器A中的内容与立即数连同进位位相加,结果存在A中ADDCA,RnA←(A)+(Rn)+(CY)√√√√累加器A中的内容与工作寄存器Rn中的内容、连同进位位相加,结果存在A中ADDCA,@RiA←(A)+((Ri))+(CY)√√√√累加器A中的内容与工作寄存器Ri指向的地址单元中的内容、连同进位位相加,结果存在A中2.带进位加法指令(4条)3.带借位减法指令(4条)指令功能标志位解释POVACCYSUBBA,directA←(A)-(direct)-(CY)√√√√累加器A中的内容减去直接地址单元中的内容再减借位位,结果存在A中SUBBA,#dataA←(A)-#data-(CY)√√√√累加器A中的内容减立即数再减借位位,结果存在A中SUBBA,RnA←(A)-(Rn)-(CY)√√√√累加器A中的内容减工作寄存器中的内容再减借位位,结果存在A中SUBBA,@RiA←(A)-((Ri))-(CY)√√√√累加器A中的内容减工作寄存器Ri指向的地址单元中的内容再减借位位,结果存在A中

在减法运算中CY=1表示有借位,CY=0则无借位。OV=1表明带符号数相减时,从一个正数减去一个负数结果为负数,或者从一个负数中减去一个正数结果为正数的错误情况。在进行减法运算前,如果不知道借位标志位C的状态,则应先对CY进行清零操作。如果要进行不带借位减法,只需把CY先清零

【例】: 设(A)=0C9H,(R3)=54H,(CY)=1,执行指令:

SUBBA,R3 11001001 -00000001 11001000 -0101010001110100

结果:(A)=74H,Cy=0,AC=0,OV=1,P=0在乘法运算时,如果OV=1,说明乘积大于FFH,否则OV=0,但进位标志位CY总是等于0。【例】:若(A)=80H=128,(B)=32H=50,执行指令:

MULAB

结果:(B)=19H,(A)=00H,OV=1,CY=04.乘法指令(1条)指令功能标志位解释POVACCYMULABBA←(A)×(B)√√×√累加器A中的内容与寄存器B中的内容相乘,乘积低8位存在A、高8位存B除法运算总是使进位标志位CY等于0。如果OV=1,表明寄存器B中的内容为00H,那么执行结果为不确定值,表示除法有溢出。【例】:设(A)=0BFH,(B)=32H,执行指令:

DIVAB结果:(A)=03H,(B)=29H,CY=0,OV=05.除法指令(1条)指令功能标志位解释POVACCYDIVABA←(A)÷(B)的商B←(A)÷(B)的余数√√×√累加器A中的内容除以寄存器B中的内容,所得到的商存A,余数存B中6.加1指令(5条)指令功能标志位解释POVACCYINCAA←(A)+1××××累加器A中的内容加1,结果存在A中INCdirectdirect←(direct)+1××××直接地址单元中的内容加1,结果送回原地址单元INC@Ri(Ri)←((Ri))+1××××寄存器的内容指向的地址单元中的内容加1,结果送回原地址单元中INCRnRn←(Rn)+1××××寄存器Rn的内容加1,结果送回原地址单元中INCDPTRDPTR←(DPTR)+1××××数据指针的内容加1,结果送回数据指针中在INCdirect指令中,如果直接地址是I/O口,其功能是先读入I/O锁存器的内容,然后在CPU进行加1操作,再输出到I/O口中,这就是“读—修改—写”操作。加1指令不影响标志。如果原寄存器的内容为FFH,执行加1后,结果就会是00H。但不会影响标志。减1操作不影响标志位。实现“读—修改—写”操作7.减1指令(4条)指令功能标志位解释POVACCYDECAA←(A)-1××××累加器A中的内容减1,结果送回累加器A中DECdirectdirect←(direct)-1××××直接地址单元中的内容减1,结果送回直接地址单元中DEC@Ri(Ri)←((Ri))-1××××寄存器Ri指向的地址单元中的内容减1,结果送回原地址单元中DECRnRn←(Rn)-1××××寄存器Rn中的内容减1,结果送回寄存器Rn中在进行BCD码运算时,这条指令总是跟在ADD或ADDC指令之后,其功能是对执行加法运算后存于累加器A中的结果进行调整。注意:DAA

只能用于加法运算8.十进制调整指令(1条)指令标志位解释POVACCYDAA√√√√对累加器A中的BCD码运算结果进行调整【例】:有两个BCD数36与45相加,结果应为BCD码81,程序如下:

MOVA,#36H ADDA,#45H DAA

加法指令执行后得结果7BH;第三条指令对累加器A中的结构进行十进制调整,低4位(为0BH)大于9,因此要加6,最后得到调整的BCD码为81。3.5逻辑运算类指令逻辑运算指令共有24条有与、或、异或、求反、左右移位、清0等逻辑操作有直接、寄存器和寄存器间址等寻址方式。1.清零指令(1条)指令功能标志位解释

POVACCYCLRAA←0√×××累加器A中的内容清02.求反指令(1条)指令功能标志位解释POVACCYCPLAA←()××××累加器A中的内容按位取反

【例】:

MOVA,#04H ;(A)=04RLA ;(A)=08 RRA ;(A)=04逻辑左移一位相当于乘2,逻辑右移一位相当于除2。4逻辑与操作指令(6条)指令功能标志位解释POVACCYANLA,directA←(A)∧(direct)√×××累加器A中的内容和直接地址单元中的内容执行与逻辑操作。结果存在累加器A中ANLA,#dataA←(A)∧#data√×××累加器A的内容和立即数执行与操作。结果存在累加器A中ANLA,RnA←(A)∧(Rn)√×××累加器A的内容和寄存器Rn中的内容执行与逻辑操作。结果存在累加器A中ANLA,@RiA←(A)∧((Ri))√×××累加器A的内容和工作寄存器Ri指向的地址单元的内容执行与操作。结果存在累加器A中ANLdirect,Adirect←(direct)∧(A)××××直接地址单元中的内容和累加器A的内容执行与逻辑操作。结果存在直接地址单元中ANLdirect,#datadirect←(direct)∧#data××××直接地址单元中的内容和立即数执行与逻辑操作。结果存在直接地址单元中5.逻辑或操作指令(6条)指令功能标志位解释POVACCYORLA,directA←(A)∨(direct)√×××累加器A中的内容和直接地址单元中的内容执行逻辑或操作。结果存在累加器A中ORLA,#dataA←(A)∨#data√×××累加器A的内容和立即数执行逻辑或操作。结果存在累加器A中ORLA,RnA←(A)∨(Rn)√×××累加器A的内容和寄存器Rn的内容执行逻辑或操作。结果存在累加器A中ORLA,@RiA←(A)∨((Ri))√×××累加器A的内容和工作寄存器Ri指向的地址单元中的内容执行逻辑或操作。结果存在累加器A中ORLdirect,Adirect←(direct)∨(A)××××直接地址单元中的内容和累加器A的内容执行逻辑或操作。结果存在直接地址单元中ORLdirect,#datadirect←(direct)∨#data××××直接地址单元中的内容和立即数执行逻辑或操作。结果存在直接地址单元中6.逻辑异或操作指令(6条)指令功能标志位解释POVACCYXRLA,directA←(A)(direct)√×××累加器A中的内容和直接地址单元中的内容执行逻辑异或操作。结果存在寄存器A中XRLA,@RiA←(A)((Ri))

√×××累加器A的内容和工作寄存器Ri指向的地址单元中的内容执行逻辑异或操作。结果存在累加器A中XRLA,#dataA←(A)#data√×××累加器A的内容和立即数执行逻辑异或操作。结果存在累加器A中XRLA,RnA←(A)(Rn)√×××累加器A的内容和寄存器Rn中的内容执行逻辑异或操作。结果存在累加器A中XRLdirect,Adirect←(direct)(A)××××直接地址单元中的内容和累加器A的内容执行逻辑异或操作。结果存在直接地址单元中XRLdirect,#datadirect←(direct)#data××××直接地址单元中的内容和立即数执行逻辑异或操作。结果存在直接地址单元中【例】:利用逻辑运算指令,可以模拟各种硬件逻辑电路。如下图所示的组合逻辑电路,试编写一程序模拟其功能。设输入信号放在X、Y、Z单元中,输出信号放在F单元。参考程序如下:MOVA,X ;A←(X)ANLA,Y ;A←(A)∧(Y)MOVR1,A ;A内容暂存MOVA,Y ;A←(Y)XRLA,Z ;A←(Y)(Z)

CPLA ;A←ORLA,R1 ;得到输出MOVF,A ;存输出SJMP$3.6控制转移类指令控制转移指令共17条可对64kB程序空间地址单元进行访问的长调用、长转移指令,也有可对2kB字节进行访问的绝对调用和绝对转移指令,还有短相对转移及无条件转移指令这些指令都不会影响标志位。

1.无条件转移指令(4条)指令功能标志位解释POVACCYLJMPaddr16长转移PC←(PC)+3PC←addr16××××给程序计数器赋予新值(16位地址)AJMPaddr11绝对转移PC←(PC)+2,PC10-0←addr11××××程序计数器赋予新值(11位地址),(PC15-11)不改变SJMPrel短转移PC←(PC)+2+rel××××当前程序计数器先加上2再加上偏移量赋予程序计数器JMP@A+DPTR间接转移PC←(A)+(DPTR)××××累加器的值加上数据指针的值赋予程序计数器2.条件转移指令(8条)指令功能标志位解释POVACCYJZrel(A)=0,PC←(PC)+2+rel××××若累加器中的内容为0,则转移到偏移量所指向的地址,否则程序顺序执行JNZrel(A)≠0,PC←(PC)+2+rel××××若累加器中的内容不为0,则转移到偏移量所指向的地址,否则程序顺序执行CJNEA,direct,rel(A)≠(direct),PC←(PC)+3+rel×××√若累加器中的内容不等于直接地址单元的内容,则转移到偏移量所指向的地址,否则程序顺序执行CJNEA,#data,rel(A)≠#data,PC←(PC)+3+rel×××√累加器中的内容不等于立即数,则转移到偏移量所指向的地址,否则程序顺序执行CJNERn,#data,rel(Rn)≠#data,PC←(PC)+3+rel×××√工作寄存器Rn中的内容不等于立即数,则转移到偏移量所指向的地址,否则程序顺序执行CJNE@Ri,#data,rel((Ri))≠#data,PC←(PC)+3+rel×××√工作寄存器Ri指向地址单元中的内容不等于立即数,则转移到偏移量所指向的地址,否则程序顺序执行DJNZRn,relRn←(Rn)-1,(Rn)≠0,PC←(PC)+2+rel××××工作寄存器Rn减1不等于0,则转移到偏移量所指向的地址,否则程序顺序执行DJNZdirect,reldirect←(direct)-1,(direct)≠0,PC←(PC)+3+rel××××直接地址单元中的内容减1不等于0,则转移到偏移量所指向的地址,否则程序顺序执行

【例】:将外部数据RAM中地址单元在256字节范围内的一个数据块传送到内部数据RAM中,两者的首地址分别为DATA1和DATA2,遇到传送的数据为0时停止。 解:外部RAM向内部RAM的数据传送一定要借助于累加器A,利用累加器判零转移指令正好可以判别是否要继续传送或者终止。

MOVR0,#DATA1 ;外部数据块首地址

MOVR1,#DATA2 ;内部数据块首地址

LOOP:MOVXA,@R0 ;外部数据送给A HERE:JZHERE ;为0则终止

MOV@R1,A ;不为0传送内部RAM数 据

INCR0 ;修改地址指针

INCR1 SJMPLOOP ;继续循环3.子程序调用指令(4条)指令功能标志位解释POVACCYLCALLaddr16PC←(PC)+3,SP←(SP)+1,(SP)←(PC7-0),SP←(SP)+1,(SP)←(PC15-8),(PC)←addr16××××长调用指令,可在64kB空间调用子程序。先保护PC当前值,然后转移到目标地址ACALLaddr11PC←(PC)+2,SP←(SP)+1,(SP)←(PC7-0),SP←(SP)+1,(SP)←(PC15-8),(PC10-0)←addr11××××绝对调用指令,可在2kB空间调用子程序RETPC15-8

←(SP),SP←(SP)-1,PC7-0

←(SP),SP←(SP)-1××

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论