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 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 | ||||
|
编 码 |
0 |
0011 |
10rr |
rrrrr |
|
|
操作內容 |
A + R --> A | ||||
|
受影响的标志 |
Z,C,DC﹔零标志﹐进位标志和辅助进位标志都会受影响 | ||||
|
说 明 |
將A寄存器的內含值加上R寄存器的內含值﹐並且把结果载入A寄存器中。 | ||||
|
|
| ||||
|
语 法 |
ADD R,A | ||||
|
编 码 |
0 |
0011 |
11rr |
rrrrr |
|
|
操作內容 |
A + R --> R | ||||
|
受影响的标志 |
Z,C,DC﹔零标志﹐进位标志和辅助标志都会受影响 | ||||
|
说 明 |
將A寄存器的內含值加上R寄存器的內含值﹐並且把结果载入R寄存器中。 | ||||
|
|
| ||||
|
语 法 |
ADD A, k | ||||
|
编 码 |
1 |
1111 |
kkkk |
kkkk |
|
|
操作內容 |
K + A --> A | ||||
|
受影响的标志 |
Z,C,DC﹔零标志﹐进位标志和辅助标志都会受影响 | ||||
|
说 明 |
將A寄存器的內含值加上立即值K﹐並且把结果载入A寄存器中。 | ||||
|
举例说明 |
|||||
|
|
| ||||
|
语 法 |
AND A,R | ||||
|
编 码 |
0 |
0010 |
10rr |
rrrrr |
|
|
操作內容 |
A & R --> A | ||||
|
受影响的标志 |
Z﹔零标志 | ||||
|
说 明 |
將A寄存器和R寄存器AND在一起﹐并将结果存入A寄存器。 | ||||
|
|
| ||||
|
语 法 |
AND R,A | ||||
|
编 码 |
0 |
0010 |
11rr |
rrrrr |
|
|
操作內容 |
A & R --> R | ||||
|
受影响的标志 |
Z﹔零标志 | ||||
|
说 明 |
將A寄存器和R寄存器AND在一起﹐并将结果存入R寄存器。 | ||||
|
|
| ||||
|
语 法 |
AND A,K | ||||
|
编 码 |
1 |
1010 |
kkkk |
kkkk |
|
|
操作內容 |
A & K --> A | ||||
|
受影响的标志 |
Z﹔零标志 | ||||
|
说 明 |
將A寄存器和立即值K﹐AND在一起﹐并将结果存入A寄存器。 | ||||
|
|
| ||||
|
举例说明 |
|||||
|
语 法 |
BC R,b | ||||
|
编 码 |
0 |
100b |
bbrr |
rrrrr |
|
|
操作內容 |
0 --> R(b) | ||||
|
受影响的标志 |
无 | ||||
|
说 明 |
R寄存器的位 “b”被清为0。 | ||||
|
举例说明 |
|||||
|
语 法 |
BS R,b | ||||
|
编 码 |
0 |
101b |
bbrr |
rrrrr |
|
|
操作內容 |
1 --> R(b) | ||||
|
受影响的标志 |
无 | ||||
|
说 明 |
R寄存器的位“b” 被设成1。 | ||||
|
举例说明 |
將狀态寄存器的零标志設成1。
BS 0x3,2 | ||||
|
CALL |
Subroutine Call | ||||
|
语 法 |
CALL k | ||||
|
编 码 |
1 |
00kk |
kkkk |
kkkk |
|
|
操作內容 |
PC+1 --> [Top of Stack] k --> PC(9::0) R3(7::5) --> PC(12::10) | ||||
|
受影响的标志 |
无 | ||||
|
说 明 |
当呼叫一个子程序时﹐首先会將下一个指令的执行位址存入堆栈中﹐接下來将子程序的进入位址载入程序计数器中。 | ||||
|
举例说明 |
HERE: CALL SUBRTN CONT: MOV A,@10 执行CALL指令之前 PC = address HERE 执行CALL指令之后 PC = address SUBRTN [Top of Stack] = address CONT | ||||
|
|
| ||||
|
语 法 |
CLRA | ||||
|
编 码 |
0 |
0000 |
1000 |
0000 |
|
|
操作內容 |
0 --> A﹔A寄存器清除为0 | ||||
|
受影响的标志 |
1 --> Z﹔零标志设成1 | ||||
|
说 明 |
清除A寄存器﹐同時设定Z标志 | ||||
|
|
| ||||
|
举例说明 |
CLRA ; 清除A寄存器﹐同時設定Z标志 | ||||
|
|
| ||||
|
语 法 |
CLR R | ||||
|
编 码 |
0 |
0000 |
11rr |
rrrrr |
|
|
操作內容 |
0 --> R﹔R寄存器清除为0 | ||||
|
受影响的标志 |
1 --> Z﹔零标志設成1 | ||||
|
说 明 |
清除R寄存器﹐并设定零标志。 | ||||
|
|
| ||||
|
举例说明 |
CLR 0x10 ;清除 0x10寄存器 | ||||
|
语 法 |
COMA R | ||||
|
编 码 |
0 |
0100 |
10rr |
rrrrr |
|
|
操作內容 |
--> A | ||||
|
受影响的标志 |
Z﹔零标志 | ||||
|
说 明 |
将所指定的寄存器取补数﹐再放入A寄存器中。 | ||||
|
|
从port6输入一个值﹐将其取补数之后在由port6输出。
| ||||
|
语 法 |
COM R | ||||
|
编 码 |
0 |
0100 |
11rr |
rrrrr |
|
|
操作內容 |
| ||||
|
受影响的标志 |
Z﹔零标志 | ||||
|
说 明 |
将R暂存取补数﹐再存入R寄存器中。 | ||||
|
举例说明 |
|||||
--> A