第三章EM78指令系统3.1.EM78指令概述EM78156&EM78P156单片机共有的58条指令,其宽度为13位。每一个指令码可分割成两部份,第一部分为标示指令功能的运算码(OPCODE),第二部份則指出运算时所需之參数,亦即运算码(OPERAND)。而指令的类型大致可分为下列四种:(1)控制型指令(controloperation):如INT...等等。(2)面向寄存器(字节操作)型指令(registeroriented):如MOVA,Reg_B;moveReg_BtoAADDReg_B,A;addReg_BwithA,and;saveinReg_B...等等。(3)位操作型指令(bitoriented):如BC,JBS...等等。(4)常数型指令(constantoperation):如MOVA,@0x55;move0x55toAXOR@0xFF;XorAwith0xFF一般而言,EM78系列八位微控制器除一个指令需两个周期之外,其他的指令只需一个指令周期,除了对PC(ProgramCounter)做“写”的指令,需二个指令周期,如(MOVPC,A)。3.2.EMC汇编语言指令集符号解说:1.符号‘R’:代表一般用途寄存器中的其中一个。2.符号‘B’:代表一般用途寄存器中的某一位。3.符号‘K’:代表8位或10位的常数或内容。4.符号‘A’:代表累加寄存器。3.2.1.面向寄存器(字节操作)型指令(26条)助记符号指令动作标志影响指令周期语言描述ADDA,RA+R-AZ,C,DC1ADDADDR,AA+R-RZ,C,DC1ADDANDA,RA&R-AZ1ANDANDR,AA&R-RZ1ANDCLRR0-RZ1ClearRegisterCLRA0-AZ1CleartheAregisterCOMR/R-RZ1ComplementR助记符号指令动作标志影响指令周期语言描述COMAR/R-AZ1ComplementR,PlaceinADAAA寄存器调整为BCD值C1DecimalAdjustDECRR-1-RZ1DecrementRDECARR-1-AZ1DecrementR,PlaceinADJZRR-1-R结果为零就跳过下一个指令1DecrementR,Skipif0DJZARR-1-A结果为零就跳过下一个指令1DecrementR,PleaseinAregister,Skipif0INCRR+1-RZ1IncrementRINCARR+1-AZ1IncrementR,PleaseinAJZRR+1-R,结果为零就跳过下一个指令1IncrementR,Skipif0JZARR+1-A,结果为零就跳过下一个指令1IncrementR,PlaceintheAregiser,Skipif0MOVR,AA-R1MoveDataMOVA,RR-AZ1MoveDataMOVR,RR-RZ1MoveDataORA,RAORR-AZ1InclusiveORORR,AAORR-RZ1InclusiveORSUBA,RR-A-AZ,C,DC1SubtractSUBR,AR-A-RZ,C,DC1SubtractXORA,RAXORR-AZ1ExclusiveORXORR,AAXORR-RZ1ExclusiveOR3.2.2.面向位操作类指令(10条)助记符号指令动作标志影响指令周期语言描述BCR,B0-R(B)1BitClearBSR,B1-R(B)1BitSetJBCR,B如果R(B)=0,则跳过下一个指令1BitTest,SkipifClearJBSR,B如果R(B)=1,则跳过下一个指令1BitTest,SkipifSetRLCRR(N)-R(N+1)R(7)-CC-R(0)C1RotateLeftRthroughCarryRLCARR(N)-A(N+1)R(7)-CC-A(0)C1RotateLeftRthroughCarry,PlaceintheARegisterRRCRR(N)-R(N-1)R(0)-CC-R(7)C1RotateRightRthroughCarry助记符号指令动作标志影响指令周期语言描述RRCARR(N)-A(N-1)R(0)-CC-A(7)C1RotateRightRthroughCarry,PlaceintheARegisterSWAPRR(0-3)-R(4-7)R(4-7)-R(0-3)1SwapRSWAPARR(0-3)-A(4-7)R(4-7)-A(0-3)1SwapR3.2.3.常数操作和控制类指令(22条)助记符号指令动作标志影响指令周期语言描述ADDA,KA+K-AZ,C,DC1ADDANDA,KA&K-AZ1ANDCALLKPC+1-[SP](PAGE,K)-PC1SubroutineCallCONTRCONT-A1MoveCONTtotheAregisterCONTWA-CONT1MoveAtoCONTDISI禁止中断1DisableInterruptENI使能中断1EnableInterruptINTPC+1-[SP]001H-PC1SoftwareinterruptIORRIOCR-A1MoveIOCRtotheAregisterIOWRA-IOCR1MoveAtoIOCRJMPK(PAGE,K)-PC1UnconditionalBranchMOVA,KK-A1MoveDataNOP1NoOperationORA,KAORK-AZ1InclusiveORRET[堆栈顶端]-PC1ReturnfromSubroutineRETI[堆栈顶端]-PC,使能中断1ReturnfromInterruptRETLKK-A,[堆栈顶端]-PCReturnImmediateDatatotheARegisterSLEP0-WDT,振荡器停止振荡T,P1IntoSleepmodeSUBA,KK-A-AZ,C,DC1SubtractTBLPC+A-PCZ,C,DC2TableLookUpWDTC0-WDTT,P1ClearWatchdogTimerXORA,KAXORK-AZ1ExclusiveOR3.3.EM78指令寻址方式关于对寄存器的存取,必须要先说明寄存器的位址,说明暂存的位址的方式称做寻址方式,EM78的寻址方式有两种,一种为直接寻址,一种为间接寻址。3.3.1.立即数寻址这种方式就是操作数为立即数,可直接从指令中获取。例:MOVA,@0x16;将常数0x16送给寄存器A3.3.2.直接寻址若是使用者要存取寄存器的内容,可以在运算码上直接描述。l例:将寄存器0X20的内容,COPY到寄存器0X21中。MOVA,0X20MOV0X21,A3.3.3.间接寻址这种寻址方式是通过寄存器R4来实现的,R4的bit0-5是用来选择寄存器(地址:00-06,0F-3F)若是使用者所需要存取的寄存器,有位址相邻的特性,使用间接寻址是很方便的。l例:写一个程序,將寄存器0X20~0X3F的值都填0。;设定A=0X20。;设定间接寻址寄存器(0X04);的內含值为0X20;清除0X04所指的寄存器。;递增间接寻址寄存器(0X04);设定A=0X04寄存器的值。;比较间接寻址的位址是否;以到0X3F。若是则结束。;否则在继续。MOVA,@0X20MOV0X04,AAGAIN:CLR0INC0X04MOVA,0X04XORA,0X3FJBS0X03,2JMPAGAINEND:3.3.4.位寻址这种位寻址是对寄存器中的任一位(bit)进行操作。例:BS0x12,2;将寄存器0x12的第2位置为“1”。3.4.EM78指令说明ADDAdd语法ADDA,R编码0001110rrrrrrr操作內容A+R--A受影响的标志Z,C,DC﹔零标志﹐进位标志和辅助进位标志都会受影响说明將A寄存器的內含值加上R寄存器的內含值﹐並且把结果载入A寄存器中。语法ADDR,A编码0001111rrrrrrr操作內容A+R--R受影响的标志Z,C,DC﹔零标志﹐进位标志和辅助标志都会受影响说明將A寄存器的內含值加上R寄存器的內含值﹐並且把结果载入R寄存器中。语法ADDA,k编码11111kkkkkkkk操作內容K+A--A受影响的标志Z,C,DC﹔零标志﹐进位标志和辅助标志都会受影响说明將A寄存器的內含值加上立即值K﹐並且把结果载入A寄存器中。举例说明下两行指令敘述为A=R11+R12.MOVA,0x11ADDA,0x12;A=R11+R12下两行指令敘述为R10=R11+R12.MOVA,0x11MOV0x10,AMOVA,0x12ADD0x10,A;R10=R11+R12下两行指令敘述为A=0x01+0x01.MOVA,@0x01;A=0x01ADDA,@0x01;A=0x02ANDAnd语法ANDA,R编码0001010rrrrrrr操作內容A&R--A受影响的标志Z﹔零标志说明將A寄存器和R寄存器AND在一起﹐并将结果存入A寄存器。语法ANDR,A编码0001011rrrrrrr操作內容A&R--R受影响的标志Z﹔零标志说明將A寄存器和R寄存器AND在一起﹐并将结果存入R寄存器。语法ANDA,K编码11010kkkkkkkk操作內容A&K--A受影响的标志Z﹔零标志说明將A寄存器和立即值K﹐AND在一起﹐并将结果存入A寄存器。举例说明將port6和R10registerAND起來,并将结果输出到port6MOVA,0x6;從port6输入内容ANDA,0x10;把内容和R10做ANDMOV0x6,A;将结果输出到port6R10=R11ANDR12MOVA,0x11MOV0x10,AMOVA,0x12AND0x10,A;R10=R11ANDR12BCBitClear语法BCR,b编码0100bbbrrrrrrr操作內容0--R(b)受影响的标志无说明R寄存器的位“b”被清为0。举例说明MOVA,@0x0fMOV0x10,A;R10=00001111BC0x10,3;R10=00000111BSBitSet语法BSR,b编码0101bbbrrrrrrr操作內容1--R(b)受影响的标志无说明R寄存器的位“b”被设成1。举例说明將狀态寄存器的零标志設成1。BS0x3,2CALLSubroutineCall语法CALLk编码100kkkkkkkkkk操作內容PC+1--[TopofStack]k--PC(9::0)R3(7::5)--PC(12::10)受影响的标志无说明当呼叫一个子程序时﹐首先会將下一个指令的执行位址存入堆栈中﹐接下來将子程序的进入位址载入程序计数器中。举例说明HERE:CALLSUBRTNCONT:MOVA,@10执行CALL指令之前PC=addressHERE执行CALL指令之后PC=addressSUBRTN[TopofStack]=addressCONTCLRACleartheAregister语法CLRA编码0000010000000操作內容0--A﹔A寄存器清除为0受影响的标志1--Z﹔零标志设成1说明清除A寄存器﹐同時设定Z标志举例说明CLRA;清除A寄存器﹐同時設定Z标志CLRClearRegister语法CLRR编码0000011rrrrrrr操作內容0--R﹔R寄存器清除为0受影响的标志1--Z﹔零标志設成1说明清除R寄存器﹐并设定零标志。举例说明CLR0x10;清除0x10寄存器COMAComplementR,PlaceinA语法COMAR编码0010010rrrrrrr操作內容--A受影响的标志Z﹔零标志说明将所指定的寄存器取补数﹐再放入A寄存器中。从port6输入一个值﹐将其取补数之后在由port6输出。MOVA,0x6MOV0x10,ACOMA0x10MOV0x6,ACOMComplementR语法COMR编码0010011rr