第三章 EM78指令系统及程序设计.docx
《第三章 EM78指令系统及程序设计.docx》由会员分享,可在线阅读,更多相关《第三章 EM78指令系统及程序设计.docx(34页珍藏版)》请在冰豆网上搜索。
![第三章 EM78指令系统及程序设计.docx](https://file1.bdocx.com/fileroot1/2023-7/1/999b0297-2f3c-40ea-acaa-50fec04e830f/999b0297-2f3c-40ea-acaa-50fec04e830f1.gif)
第三章EM78指令系统及程序设计
第三章EM78指令系统
3.1.EM78指令概述
EM78156&EM78P156单片机共有的58条指令,其宽度为13位。
每一个指令码可分割成两部份,第一部分为标示指令功能的运算码(OPCODE),第二部份則指出运算时所需之參数,亦即运算码(OPERAND)。
而指令的类型大致可分为下列四种:
(1)控制型指令(controloperation):
如
INT...等等。
(2)面向寄存器(字节操作)型指令(registeroriented):
如
MOVA,Reg_B
;moveReg_BtoA
ADDReg_B,A
;addReg_BwithA,and
;saveinReg_B
...等等。
(3)位操作型指令(bitoriented):
如
BC,JBS...等等。
(4)常数型指令(constantoperation):
如
MOVA,@0x55;move0x55toA
XOR@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,R
A+R->A
Z,C,DC
1
ADD
ADDR,A
A+R->R
Z,C,DC
1
ADD
ANDA,R
A&R->A
Z
1
AND
ANDR,A
A&R->R
Z
1
AND
CLRR
0->R
Z
1
ClearRegister
CLRA
0->A
Z
1
CleartheAregister
COMR
/R->R
Z
1
ComplementR
助记符号
指令动作
标志影响
指令周期
语言描述
COMAR
/R->A
Z
1
ComplementR,PlaceinA
DAA
A寄存器调整为BCD值
C
1
DecimalAdjust
DECR
R-1->R
Z
1
DecrementR
DECAR
R-1->A
Z
1
DecrementR,PlaceinA
DJZR
R-1->R结果为零就跳过下一个指令
1
DecrementR,Skipif0
DJZAR
R-1->A结果为零就跳过下一个指令
1
DecrementR,PleaseinAregister,Skipif0
INCR
R+1->R
Z
1
IncrementR
INCAR
R+1->A
Z
1
IncrementR,PleaseinA
JZR
R+1->R,结果为零就跳过下一个指令
1
IncrementR,Skipif0
JZAR
R+1->A,结果为零就跳过下一个指令
1
IncrementR,PlaceintheAregiser,Skipif0
MOVR,A
A->R
1
MoveData
MOVA,R
R->A
Z
1
MoveData
MOVR,R
R->R
Z
1
MoveData
ORA,R
AORR->A
Z
1
InclusiveOR
ORR,A
AORR->R
Z
1
InclusiveOR
SUBA,R
R-A->A
Z,C,DC
1
Subtract
SUBR,A
R-A->R
Z,C,DC
1
Subtract
XORA,R
AXORR->A
Z
1
ExclusiveOR
XORR,A
AXORR->R
Z
1
ExclusiveOR
3.2.2.面向位操作类指令(10条)
助记符号
指令动作
标志影响
指令周期
语言描述
BCR,B
0->R(B)
1
BitClear
BSR,B
1->R(B)
1
BitSet
JBCR,B
如果R(B)=0,则跳过下一个指令
1
BitTest,SkipifClear
JBSR,B
如果R(B)=1,则跳过下一个指令
1
BitTest,SkipifSet
RLCR
R(N)->R(N+1)
R(7)->C
C->R(0)
C
1
RotateLeftRthroughCarry
RLCAR
R(N)->A(N+1)
R(7)->C
C->A(0)
C
1
RotateLeftRthroughCarry,PlaceintheARegister
RRCR
R(N)->R(N-1)
R(0)->C
C->R(7)
C
1
RotateRightRthroughCarry
助记符号
指令动作
标志影响
指令周期
语言描述
RRCAR
R(N)->A(N-1)
R(0)->C
C->A(7)
C
1
RotateRightRthroughCarry,PlaceintheARegister
SWAPR
R(0-3)->R(4-7)
R(4-7)->R(0-3)
1
SwapR
SWAPAR
R(0-3)->A(4-7)
R(4-7)->A(0-3)
1
SwapR
3.2.3.常数操作和控制类指令(22条)
助记符号
指令动作
标志影响
指令周期
语言描述
ADDA,K
A+K->A
Z,C,DC
1
ADD
ANDA,K
A&K->A
Z
1
AND
CALLK
PC+1->[SP]
(PAGE,K)->PC
1
SubroutineCall
CONTR
CONT->A
1
MoveCONTtotheAregister
CONTW
A->CONT
1
MoveAtoCONT
DISI
禁止中断
1
DisableInterrupt
ENI
使能中断
1
EnableInterrupt
INT
PC+1->[SP]
001H->PC
1
Softwareinterrupt
IORR
IOCR->A
1
MoveIOCRtotheAregister
IOWR
A->IOCR
1
MoveAtoIOCR
JMPK
(PAGE,K)->PC
1
UnconditionalBranch
MOVA,K
K->A
1
MoveData
NOP
1
NoOperation
ORA,K
AORK->A
Z
1
InclusiveOR
RET
[堆栈顶端]->PC
1
ReturnfromSubroutine
RETI
[堆栈顶端]->PC,使能中断
1
ReturnfromInterrupt
RETLK
K->A,
[堆栈顶端]->PC
ReturnImmediateDatatotheARegister
SLEP
0->WDT,振荡器停止振荡
T,P
1
IntoSleepmode
SUBA,K
K-A->A
Z,C,DC
1
Subtract
TBL
PC+A->PC
Z,C,DC
2
TableLookUp
WDTC
0->WDT
T,P
1
ClearWatchdogTimer
XORA,K
AXORK->A
Z
1
ExclusiveOR
3.3.EM78指令寻址方式
关于对寄存器的存取,必须要先说明寄存器的位址,说明暂存的位址的方式称做寻址方式,EM78的寻址方式有两种,一种为直接寻址,一种为间接寻址。
3.3.1.立即数寻址
这种方式就是操作数为立即数,可直接从指令中获取。
例:
MOVA,@0x16;将常数0x16送给寄存器A
直接寻址
若是使用者要存取寄存器的内容,可以在运算码上直接描述。
●例:
将寄存器0X20的内容,COPY到寄存器0X21中。
MOVA,0X20
MOV0X21,A
3.3.2.间接寻址
这种寻址方式是通过寄存器R4来实现的,R4的bit0-5是用来选择寄存器(地址:
00-06,0F-3F)
若是使用者所需要存取的寄存器,有位址相邻的特性,使用间接寻址是很方便的。
●例:
写一个程序,將寄存器0X20~0X3F的值都填0。
;设定A=0X20。
;设定间接寻址寄存器(0X04)
;的內含值为0X20
;清除0X04所指的寄存器。
;递增间接寻址寄存器(0X04)
;设定A=0X04寄存器的值。
;比较间接寻址的位址是否
;以到0X3F。
若是则结束。
;否则在继续。
MOVA,@0X20
MOV0X04,A
AGAIN:
CLR0
INC0X04
MOVA,0X04
XORA,0X3F
JBS0X03,2
JMPAGAIN
END:
3.3.3.位寻址
这种位寻址是对寄存器中的任一位(bit)进行操作。
例:
BS0x12,2;将寄存器0x12的第2位置为“1”。
3.4.EM78指令说明
ADD
Add
语法
ADDA,R
编码
0
0011
10rr
rrrrr
操作內容
A+R-->A
受影响的标志
Z,C,DC﹔零标志﹐进位标志和辅助进位标志都会受影响
说明
將A寄存器的內含值加上R寄存器的內含值﹐並且把结果载入A寄存器中。
语法
ADDR,A
编码
0
0011
11rr
rrrrr
操作內容
A+R-->R
受影响的标志
Z,C,DC﹔零标志﹐进位标志和辅助标志都会受影响
说明
將A寄存器的內含值加上R寄存器的內含值﹐並且把结果载入R寄存器中。
语法
ADDA,k
编码
1
1111
kkkk
kkkk
操作內容
K+A-->A
受影响的标志
Z,C,DC﹔零标志﹐进位标志和辅助标志都会受影响
说明
將A寄存器的內含值加上立即值K﹐並且把结果载入A寄存器中。
举例说明
下两行指令敘述为A=R11+R12.
MOVA,0x11
ADDA,0x12;A=R11+R12
下两行指令敘述为R10=R11+R12.
MOVA,0x11
MOV0x10,A
MOVA,0x12
ADD0x10,A;R10=R11+R12
下两行指令敘述为A=0x01+0x01.
MOVA,@0x01;A=0x01
ADDA,@0x01;A=0x02
AND
And
语法
ANDA,R
编码
0
0010
10rr
rrrrr
操作內容
A&R-->A
受影响的标志
Z﹔零标志
说明
將A寄存器和R寄存器AND在一起﹐并将结果存入A寄存器。
语法
ANDR,A
编码
0
0010
11rr
rrrrr
操作內容
A&R-->R
受影响的标志
Z﹔零标志
说明
將A寄存器和R寄存器AND在一起﹐并将结果存入R寄存器。
语法
ANDA,K
编码
1
1010
kkkk
kkkk
操作內容
A&K-->A
受影响的标志
Z﹔零标志
说明
將A寄存器和立即值K﹐AND在一起﹐并将结果存入A寄存器。
举例说明
將port6和R10registerAND起來,并将结果输出到port6
MOVA,0x6;從port6输入内容
ANDA,0x10;把内容和R10做ANDMOV0x6,A;将结果输出到port6
R10=R11ANDR12
MOVA,0x11
MOV0x10,A
MOVA,0x12
AND0x10,A;R10=R11ANDR12
BC
BitClear
语法
BCR,b
编码
0
100b
bbrr
rrrrr
操作內容
0-->R(b)
受影响的标志
无
说明
R寄存器的位“b”被清为0。
举例说明
MOVA,@0x0f
MOV0x10,A;R10=00001111
BC0x10,3;R10=00000111
BS
BitSet
语法
BSR,b
编码
0
101b
bbrr
rrrrr
操作內容
1-->R(b)
受影响的标志
无
说明
R寄存器的位“b”被设成1。
举例说明
將狀态寄存器的零标志設成1。
BS0x3,2
CALL
SubroutineCall
语法
CALLk
编码
1
00kk
kkkk
kkkk
操作內容
PC+1-->[TopofStack]
k-->PC(9:
:
0)
R3(7:
:
5)-->PC(12:
:
10)
受影响的标志
无
说明
当呼叫一个子程序时﹐首先会將下一个指令的执行位址存入堆栈中﹐接下來将子程序的进入位址载入程序计数器中。
举例说明
HERE:
CALLSUBRTN
CONT:
MOVA,@10
执行CALL指令之前
PC=addressHERE
执行CALL指令之后
PC=addressSUBRTN
[TopofStack]=addressCONT
CLRA
CleartheAregister
语法
CLRA
编码
0
0000
1000
0000
操作內容
0-->A﹔A寄存器清除为0
受影响的标志
1-->Z﹔零标志设成1
说明
清除A寄存器﹐同時设定Z标志
举例说明
CLRA;清除A寄存器﹐同時設定Z标志
CLR
ClearRegister
语法
CLRR
编码
0
0000
11rr
rrrrr
操作內容
0-->R﹔R寄存器清除为0
受影响的标志
1-->Z﹔零标志設成1
说明
清除R寄存器﹐并设定零标志。
举例说明
CLR0x10;清除0x10寄存器
COMA
ComplementR,PlaceinA
语法
COMAR
编码
0
0100
10rr
rrrrr
操作內容
-->A
受影响的标志
Z﹔零标志
说明
将所指定的寄存器取补数﹐再放入A寄存器中。
从port6输入一个值﹐将其取补数之后在由port6输出。
MOVA,0x6
MOV0x10,A
COMA0x10
MOV0x6,A
COM
ComplementR
语法
COMR
编码
0
0100
11rr
rrrrr
操作內容
.-->R
受影响的标志
Z﹔零标志
说明
将R暂存取补数﹐再存入R寄存器中。
举例说明
将0x10寄存器的內含值﹐取补数。
MOVA,@0x11
MOV0x10,A;R10=0x11
COM0x10;R10=0xEE
DAA
DecimalAdjust
语法
DAA
编码
0
0000
0001
0001
操作內容
if[A<3:
:
0>>9].OR.[DC=1]
thenA<3:
:
0>+6->A<3:
:
0>;
if[A<7:
:
4>>9].OR.[C=1]
thenA<7:
:
4>+6->A<7:
:
4>;
受影响的标志
C进位标志
说明
DAA用来调整在累加器中的8位的2进位数值﹐使累加器中的数值变成10进位的表示法﹐分別用两个4位來表示十位及个位。
举例说明
做一个十进位加法运算6+9
MOVA,@0x6
MOV0x10,A
MOVA,@0x9
ADDA,0x10;A=0xf
DAA;A=15H(packedBCD)
DECA
DecrementR,PlaceinA
语法
DECAR
编码
0
0001
10rr
rrrrr
操作內容
R-1-->A
受影响的标志
Z零标志
说明
递减R寄存器的值﹐并且将结果存入A寄存器中。
举例说明
说明如何作一个计数16次的循环
STATUS==3﹔状态寄存器
Z_FLAG==2﹔零标志在状态暂存中是BIT2
MOVA,@0x10
MOV0x10,A
LOOP:
DECA0x10
MOV0x10,A
JBSSTATUS,Z_FLAG
JMPLOOP
DEC
DecrementR
语法
DECR
编码
0
0001
11rr
rrrrr
操作內容
R-1-->R
受影响的标志
Z﹔零标志
说明
将所指定的R寄存器內含值减1。
举例说明
说明如何作一个计数16次的循环
STATUS==3;状态寄存器
Z_FLAG==2﹔零标志在状态暂存中是BIT2
MOVA,@0x10
MOV0x10,A
LOOP:
DEC0x10
JBSSTATUS,Z_FLAG
JMPLOOP
DJZA
DecrementR,PlaceintheAregister,Skipif0
语法
DJZAR
编码
0
0101
10rr
rrrrr
操作內容
R-1-->A,skipif0
受影响的标志
无
说明
将所指定R寄存器的內含值减1﹐并将结果存於A寄存器上﹔如果结果为0﹐则下一个指令将被跳过。
举例说明
HERE:
DJZA0x9
CONT:
MOVA,0x10
SKIP:
ADDA,@10
在执行DJZA指令之前
PC=addressHERE
在执行DJZA指令之后
A=R9-1
ifA=0,PC=addressSKIP
ifA0,PC=addressCONT
DJZ
DecrementR,Skipif0
语法
DJZR
编码
0
0101
11rr
rrrrr
操作內容
R-1-->R,skipif0
受影响的标志
无
说明
将所指定R寄存器的內含值减1﹐并将结果存回R寄存器上﹔如果结果为0﹐则下一个指令将被跳过。
举例说明
MOVA,@100
MOV0x10,A
LOOP:
DJZ0x10;寄存器R10递减﹐若结果不等于
;0,执行JMP指令﹐若結果等于0﹐;JMP指令不执行JMPLOOP
INCA
IncrementR,PlaceintheAregister
语法
INCAR
编码
0
0101
00rr
rrrrr
操作內容
R+1-->A
受影响的标志
Z﹔零标志
说明
将被指定R寄存器的內含值加1,并将结果储于A寄存器中。
举例说明
MOVA,@0x11
MOV0x10,A;R10=0x11
INCA0x10;A=0x12
INC
IncrementR
语法
INCR
编码
0
0101
01rr
rrrrr
操作內容
R+1-->R
受影响的标志
Z﹔零标志
说明
将被指定R寄存器的內含值加1﹐並且将结果再存回R寄存器中。
举例说明
MOVA,@0x11
MOV0x10,A;R10=0x11
INC0x10;R10=0x12
INT
SoftwareInterrupt
语法
INT
编码
1
1110
0000
0001
操作內容
PC+1-->[TopofStack]
0001H-->PC
受影响的标志
无
说明
软件中断指令﹐首先将下一个位址存入堆栈中﹐然后将0x01载入程序寄存器中。
举例说明
ORG0x001
JMPSET_INT
SET_INT﹕
RET
MAIN﹕
HERE﹕
INT
CONT﹕
CLRA
执行INT指令之前
PC=addressHERE
执行INT指令之后
PC=0001H
[TopofStack]=addressCONT
IOR
MoveIOCRtotheAregister
语法
IORR
编码
0
0000
0001
rrrr
操作內容
IOCR-->A
受影响的标志
无
说明
将控制寄存器IOCR中的值移到寄存器A中。
举例说明
IOR0xf;取得IOCF中的內容﹐并载入A中
MOV0x10,A;储存在寄存器0x10中
IOW
MovetheAregistertoIOCR
语法
IOWR
编码