第三章 EM78指令系统 ( 1 )
3.1.EM78指令概述
EM78156 & EM78P156
单片机共有的 58 条指令,其宽度为 13
位。每一个指令码可分割成两部份,第一部分为标示指令功能的运算码(
OPCODE
),第二部份則指出运算时所需之參数,亦即运算码(
OPERAND
)。而指令的类型大致可分为下列四种:
(1)控制型指令( control operation ):
如
INT...等等。
(2)面向寄存器(字节操作)型指令(
register oriented ): 如
|
MOV A, Reg_B
|
; move Reg_B to A
|
|
ADD Reg_B, A
|
; add Reg_B with A, and
|
|
|
; save in Reg_B
|
... 等等。
(3)位操作型指令( bit oriented ): 如
BC,JBS...等等。
(4)常数型指令( constant operation
):如
MOV A, @0x55 ;
move 0x55 to A
XOR @0xFF
;Xor A with 0xFF
一般而言,EM78
系列八位微控制器除一个指令需两个周期之外,其他的指令只需一个指令周期,除了对
PC (Program Counter)做 “写”
的指令,需二个指令周期,如 (MOV PC, A)。
3.2.EMC 汇编语言指令集
符号解说:
1.符号‘R’:代表一般用途寄存器中的其中一个。
2.符号‘B’:代表一般用途寄存器中的某一位。
3.符号‘K’:代表8位或10位的常数或内容。
4.符号‘A’:代表累加寄存器。
3.2.1.
面向寄存器(字节操作)型指令(26条)
|
助记符号
|
指令动作
|
标志影响
|
指令周期
|
语言描述
|
|
ADD A,R
|
A+R->A
|
Z,C,DC
|
1
|
ADD
|
|
ADD R,A
|
A+R->R
|
Z,C,DC
|
1
|
ADD
|
|
AND A,R
|
A&R->A
|
Z
|
1
|
AND
|
|
AND R,A
|
A&R->R
|
Z
|
1
|
AND
|
|
CLR R
|
0->R
|
Z
|
1
|
Clear Register
|
|
CLRA
|
0->A
|
Z
|
1
|
Clear the A register
|
|
COM R
|
/R->R
|
Z
|
1
|
Complement R
|
|
助记符号
|
指令动作
|
标志影响
|
指令周期
|
语言描述
|
|
COMA R
|
/R->A
|
Z
|
1
|
Complement R,Place in A
|
|
DAA
|
A寄存器调整为BCD值
|
C
|
1
|
Decimal Adjust
|
|
DEC R
|
R-1->R
|
Z
|
1
|
Decrement R
|
|
DECA R
|
R-1->A
|
Z
|
1
|
Decrement R,Place in A
|
|
DJZ R
|
R-1->R 结果为零就跳过下一个指令
|
|
1
|
Decrement R,Skip if 0
|
|
DJZA R
|
R-1->A 结果为零就跳过下一个指令
|
|
1
|
Decrement R,Please in A register, Skip if 0
|
|
INC R
|
R+1->R
|
Z
|
1
|
Increment R
|
|
INCA R
|
R+1->A
|
Z
|
1
|
Increment R,Please in A
|
|
JZ R
|
R+1->R, 结果为零就跳过下一个指令
|
|
1
|
Increment R,Skip if 0
|
|
JZA R
|
R+1->A, 结果为零就跳过下一个指令
|
|
1
|
Increment R,Place in the A regiser,Skipif 0
|
|
MOV R,A
|
A->R
|
|
1
|
Move Data
|
|
MOV A,R
|
R->A
|
Z
|
1
|
Move Data
|
|
MOV R,R
|
R->R
|
Z
|
1
|
Move Data
|
|
OR A,R
|
A OR R ->A
|
Z
|
1
|
Inclusive OR
|
|
OR R,A
|
A OR R->R
|
Z
|
1
|
Inclusive OR
|
|
SUB A,R
|
R-A->A
|
Z,C,DC
|
1
|
Subtract
|
|
SUB R,A
|
R-A->R
|
Z,C,DC
|
1
|
Subtract
|
|
XOR A,R
|
A XOR R->A
|
Z
|
1
|
Exclusive OR
|
|
XOR R,A
|
A XOR R->R
|
Z
|
1
|
Exclusive OR
|
3.2.2.
面向位操作类指令(10条)
|
助记符号
|
指令动作
|
标志影响
|
指令周期
|
语言描述
|
|
BC R,B
|
0->R(B)
|
|
1
|
Bit Clear
|
|
BS R,B
|
1->R(B)
|
|
1
|
Bit Set
|
|
JBC R,B
|
如果R(B)=0,则跳过下一个指令
|
|
1
|
Bit Test, Skip if Clear
|
|
JBS R,B
|
如果R(B)=1,则跳过下一个指令
|
|
1
|
Bit Test, Skip if Set
|
|
RLC R
|
R(N)->R(N+1)
R(7)->C
C->R(0)
|
C
|
1
|
Rotate Left R through Carry
|
|
RLCA R
|
R(N)->A(N+1)
R(7)->C
C->A(0)
|
C
|
1
|
Rotate Left R through Carry,Place in the A
Register
|
|
RRC R
|
R(N)->R(N-1)
R(0)->C
C->R(7)
|
C
|
1
|
Rotate Right R through Carry
|
|
助记符号
|
指令动作
|
标志影响
|
指令周期
|
语言描述
|
|
RRCA R
|
R(N)->A(N-1)
R(0)->C
C->A(7)
|
C
|
1
|
Rotate Right R through Carry,Place in the A
Register
|
|
SWAP R
|
R(0-3)->R(4-7)
R(4-7)->R(0-3)
|
|
1
|
Swap R
|
|
SWAPA R
|
R(0-3)->A(4-7)
R(4-7)->A(0-3)
|
|
1
|
Swap R
|
3.2.3.
常数操作和控制类指令(22条)
|
助记符号
|
指令动作
|
标志影响
|
指令周期
|
语言描述
|
|
ADD A,K
|
A+K->A
|
Z,C,DC
|
1
|
ADD
|
|
AND A,K
|
A&K->A
|
Z
|
1
|
AND
|
|
CALL K
|
PC+1->[SP]
(PAGE,K)->PC
|
|
1
|
Subroutine Call
|
|
CONTR
|
CONT->A
|
|
1
|
Move CONT to the A register
|
|
CONTW
|
A->CONT
|
|
1
|
Move A to CONT
|
|
DISI
|
禁止中断
|
|
1
|
Disable Interrupt
|
|
ENI
|
使能中断
|
|
1
|
Enable Interrupt
|
|
INT
|
PC+1->[SP]
001H->PC
|
|
1
|
Software interrupt
|
|
IOR R
|
IOCR->A
|
|
1
|
Move IOCR to the A register
|
|
IOW R
|
A->IOCR
|
|
1
|
Move A to IOCR
|
|
JMP K
|
(PAGE,K)->PC
|
|
1
|
Unconditional Branch
|
|
MOV A,K
|
K->A
|
|
1
|
Move Data
|
|
NOP
|
|
|
1
|
No Operation
|
|
OR A,K
|
A OR K->A
|
Z
|
1
|
Inclusive OR
|
|
RET
|
[堆栈顶端]->PC
|
|
1
|
Return from Subroutine
|
|
RETI
|
[堆栈顶端]->PC,使能中断
|
|
1
|
Return from Interrupt
|
|
RETL K
|
K->A,
[堆栈顶端]->PC
|
|
|
Return Immediate Data to the A Register
|
|
SLEP
|
0->WDT,振荡器停止振荡
|
T,P
|
1
|
Into Sleep mode
|
|
SUB A,K
|
K-A->A
|
Z,C,DC
|
1
|
Subtract
|
|
TBL
|
PC+A->PC
|
Z,C,DC
|
2
|
Table Look Up
|
|
WDTC
|
0->WDT
|
T,P
|
1
|
Clear Watchdog Timer
|
|
XOR A,K
|
A XOR K->A
|
Z
|
1
|
Exclusive OR
|
3.3.EM78指令寻址方式
关于对寄存器的存取,必须要先说明寄存器的位址,说明暂存的位址的方式称做寻址方式,EM78的寻址方式有两种,一种为直接寻址,一种为间接寻址。
3.3.1.
立即数寻址
这种方式就是操作数为立即数,可直接从指令中获取。
例:MOV A,@0x16
;将常数0x16送给寄存器A
3.3.2.
直接寻址
若是使用者要存取寄存器的内容,可以在运算码上直接描述。
l 例:将寄存器0X20的内容,COPY到寄存器0X21中。
MOV A, 0X20
MOV 0X21, A
3.3.3.
间接寻址
这种寻址方式是通过寄存器R4来实现的,R4的bit0-5是用来选择寄存器(地址:00-06,0F-3F)
若是使用者所需要存取的寄存器,有位址相邻的特性,使用间接寻址是很方便的。
l 例:写一个程序,將寄存器0X20~0X3F的值都填0。
;设定A = 0X20。
;设定间接寻址寄存器(0X04)
;的內含值为0X20
;清除0X04所指的寄存器。
;递增间接寻址寄存器(0X04)
;设定A=0X04寄存器的值。
;比较间接寻址的位址是否
;以到0X3F。若是则结束。
;否则在继续。
|
MOV A, @0X20
MOV 0X04, A
AGAIN:
CLR 0
INC 0X04
MOV A, 0X04
XOR A, 0X3F
JBS 0X03, 2
JMP AGAIN
END:
3.3.4.
位寻址
这种位寻址是对寄存器中的任一位(bit)进行操作。
例:BS 0x12,2
;将寄存器0x12的第2位置为“1”。
3.4.EM78指令说明
|
|
|
|
|
|
|
语 法
|
ADD A,R
|
|
编 码
|
|
|
|
|
|
|
操作內容
|
A + R --> A
|
|
受影响的标志
|
Z,C,DC﹔零标志﹐进位标志和辅助进位标志都会受影响
|
|
说 明
|
將A寄存器的內含值加上R寄存器的內含值﹐並且把结果载入A寄存器中。
|
|
|
|
|
语 法
|
ADD R,A
|
|
编 码
|
|
|
|
|
|
|
操作內容
|
A + R --> R
|
|
受影响的标志
|
Z,C,DC﹔零标志﹐进位标志和辅助标志都会受影响
|
|
说 明
|
將A寄存器的內含值加上R寄存器的內含值﹐並且把结果载入R寄存器中。
|
|
|
|
|
语 法
|
ADD A, k
|
|
编 码
|
|
|
|
|
|
|
操作內容
|
K + A --> A
|
|
受影响的标志
|
Z,C,DC﹔零标志﹐进位标志和辅助标志都会受影响
|
|
说 明
|
將A寄存器的內含值加上立即值K﹐並且把结果载入A寄存器中。
|
|
举例说明
|
下两行指令敘述为 A = R11 +
R12.
MOV A,0x11
ADD A,0x12
;A = R11 + R12
下两行指令敘述为 R10 = R11
+ R12.
MOV A,0x11
MOV 0x10,A
MOV A,0x12
ADD 0x10,A
;R10 = R11 + R12
下两行指令敘述为 A = 0x01 +
0x01.
MOV A,@0x01 ;A = 0x01
ADD A,@0x01 ;A = 0x02
|
|
|
|
|
|
|
|
语 法
|
AND A,R
|
|
编 码
|
|
|
|
|
|
|
操作內容
|
A & R --> A
|
|
受影响的标志
|
Z﹔零标志
|
|
说 明
|
將A寄存器和R寄存器AND在一起﹐并将结果存入A寄存器。
|
|
|
|
|
语 法
|
AND R,A
|
|
编 码
|
|
|
|
|
|
|
操作內容
|
A & R --> R
|
|
受影响的标志
|
Z﹔零标志
|
|
说 明
|
將A寄存器和R寄存器AND在一起﹐并将结果存入R寄存器。
|
|
|
|
|
语 法
|
AND A,K
|
|
编 码
|
|
|
|
|
|
|
操作內容
|
A & K --> A
|
|
受影响的标志
|
Z﹔零标志
|
|
说 明
|
將A寄存器和立即值K﹐AND在一起﹐并将结果存入A寄存器。
|
|
|
|
|
举例说明
|
將port 6和R10 register AND起來,
并将结果输出到port6
MOV A,0x6
;從port6输入内容
AND A,0x10
;把内容和 R10 做AND MOV 0x6,A
;将结果输出到port6
R10 = R11 AND R12
MOV A,0x11
MOV 0x10,A
MOV A,0x12
AND 0x10,A
;R10 = R11 AND R12
|
|
|
|
|
语 法
|
BC R,b
|
|
编 码
|
|
|
|
|
|
|
操作內容
|
0 --> R(b)
|
|
受影响的标志
|
无
|
|
说 明
|
R寄存器的位 “b”被清为0。
|
|
举例说明
|
MOV A,@0x0f
MOV 0x10,A
;R10 = 00001111
BC
0x10,3 ;R10
= 00000111
|
|
|
|
|
语 法
|
BS R,b
|
|
编 码
|
|
|
|
|
|
|
操作內容
|
1 --> R(b)
|
|
受影响的标志
|
无
|
|
说 明
|
R寄存器的位“b” 被设成1。
|
|
举例说明
|
將狀态寄存器的零标志設成1。
BS 0x3,2
|
|