一、EM78P447S指令的执行时序
作为时基的时钟振荡器,产生的时钟脉冲信号经内部分频电路分频后形成“指令周期(Tins)”。作为EM78P447S单片机的重要特色之一,一个指令周期既可以占用2个时钟周期,也可以占用4个时钟周期,可以由用户自主选定。因此,一个“指令周期”可以由2个时钟周期(即2个节拍Q1和Q2)或4个时钟周期(即4个节拍Q1、Q2、Q3和Q4)构成。每当Q1节拍的上升沿出现时,程序计数器PC自动加1。
由于EM78单片机内部采用双总线结构,使得它在执行一条指令的同时,就可以提取下一条指令,从而实现“流水作业”。就是说,在同一个指令周期之内,执行指令和提取指令两种活动在同时进行。这就使每一条指令的平均执行时间为一个指令周期。因此,就可以说成,EM78单片机指令的执行时间“单周期化”了。绝大多数指令的运行时间都仅占用一个指令周期,只有极个别的指令(即对程序计数器PC做“写”操作的指令,比如MOV PC,A)才占用两个指令周期,这一点应该引起注意。
二、EM78P447S指令概述
不同CPU内核的单片机,具有不同的指令系统。指令系统中的每一条指令都完成一种特定功能的简单操作,比如数据传送操作、加法操作等。将若干条实现简单操作的指令语句,按照一定的规则排列组合起来,就构成了一个可以完成复杂功能的程序。
为了便于学习和掌握,通常每一条指令都用表意性很强的英文单词或语句缩写来代表。例如,NOP指令,就是由“No Operation.”一句英文缩略而成,中文含义是“空操作”。所以,通常人们将代表一条指令的一个字符串称为“助记符”。假如按指令被使用的频繁程度划分整个指令系统,其实只有一部分指令在编写程序时经常用到,而另一部分指令却较少使用,还有一部分指令极少用到。每条指令一般都由操作码和操作数组成,也有个别指令不带操作数。操作码是指令操作功能的记述,而操作数则描述操作的对象和操作的范围。
1. 指令结构
一条指令的指令码一般都可分解成两部分:第一部分为操作码(OPCODE),代表指令功能;第二部分为操作数(OPERAND),表示指令操作的对象,或运算时所需要的参数。操作数又可以细分为两部分:第一操作数和第二操作数。第一操作数就是目标操作数,第二操作数就是源操作数。以一条传送指令为例,源操作数就是数据的发源地,而目标操作数就是数据的目的地。
EM78P447S单片机,共有指令58条,其编码长度均为13比特(bit)。其一般指令格式为:
操作码 第一操作数,第二操作数 或 操作码 目标操作数,源操作数
这种书写格式与流行的MCS-51单片机的指令系统,以及许多微机原理教科书中介绍的80X86指令系统相一致,也比较符合人们的记忆习惯。对于EM78P447S指令系统中的一条指令,操作数可以是两个、一个或一个也没有。
2 指令描述方法
对后面描述过程中所采用的一些符号或表示方法需作说明,见表1。

3. EM78P447S指令说明
以下对于EM78P447S单片机整个指令系统中的每条指令,以“指令的字母为序”进行全面介绍,包括语法规则、指令编码、操作内容、影响标志和功能说明等。其中语法规则就是汇编格式,也就是 汇编器工具软件认可的格式。
(1) 加法指令(3条)
语法规则 ADD A,R
指令编码01110rrrrrr
操作内容 A+R→A
影响标志 Z,C,DC;零标志、进位标志和辅助进位标志都会受影响。
功能说明 将A寄存器的内容加上R寄存器的内容,并把结果载入A寄存器中。
语法规则 ADD R,A
指令编码01111rrrrrr
操作内容 A+R→R
影响标志 Z,C,DC;零标志、进位标志和辅助进位标志都会受影响。
功能说明 将A寄存器的内容加上R寄存器的内容,并把结果载入R寄存器中
语法规则 ADD A,K
指令编码11111kkkkkkkk
操作内容 K+A→A
影响标志 Z,C,DC;零标志、进位标志和辅助进位标志都会受影响。
功能说明 将A寄存器的内容加上立即数K,并把结果载入A寄存器中。
(2) 逻辑“与”指令(3条)
语法规则 AND A,R
指令编码01010rrrrrr
操作内容 A&R→A
影响标志 Z;零标志会受影响。
功能说明 将A寄存器和R寄存器的内容进行逻辑与,并将结果存入A寄存器。
语法规则 AND R,A
指令编码01011rrrrrr
操作内容 A&R→R
影响标志 Z;零标志会受影响。
功能说明 将A寄存器和R寄存器的内容进行逻辑与,并将结果存入R寄存器。
语法规则 AND A,K
指令编码11010kkkkkkkk
操作内容 A&K→A
影响标志 Z;零标志会受影响。
功能说明 将A寄存器的内容和立即数K进行逻辑与,并将结果存入A寄存器。
(3) 比特清零指令
语法规则 BC R,B
指令编码100bbbrrrrrr
操作内容 0 → R(B)
影响标志 无
功能说明 R寄存器的比特“B”被清为0。
(4) 比特置位指令
语法规则 BS R,B
指令编码101bbbrrrrrr
操作内容 1→ R(B)
影响标志 无
功能说明 R寄存器比特“B”被置成1。
(5) 子程序调用指令
语法规则 CALL K
指令编码10kkkkkkkkkk
操作内容 PC+1→[堆栈顶部]
K→PC(9~0)
R3(6~5)→PC(11~10)
影响标志 无
功能说明 当调用一个子程序时,首先会将下一条指令的地址存入堆栈中,接下来将子程序的入口地址载入程序计数器PC中。
(6) 累加器清零指令
语法规则 CLRA
指令编码1000
操作内容 0→A;A寄存器被清为0。
影响标志 1→Z;零标志被置成1。
功能说明 清除A寄存器,同时设定Z标志。
(7) 寄存器清零指令
语法规则 CLRR
指令编码11rrrrrr
操作内容 0→R;R寄存器清为0。
影响标志 1→Z;零标志设成1。
功能说明 清除R寄存器,并设定零标志。
(8) 寄存器求反送A指令
语法规则 COMA R
指令编码010010rrrrrr
操作内容
影响标志 Z;零标志受影响。
功能说明 将所指定寄存器的内容取反码,再放入A寄存器中。
(9) 寄存器求反指令
语法规则 COM R
指令编码010011rrrrrr
操作内容 →R
影响标志 Z;零标志受影响。
功能说明 将R寄存器的内容取反码,再存回R寄存器中。
(10) 读控制寄存器指令
语法规则 CONTR
指令编码010100
操作内容 CONT→A
影响标志 无
功能说明 将控制寄存器CONT的数据,读到A寄存器中。
(11) 写控制寄存器指令
语法规则 CONTW
指令编码010
操作内容 A→CONT
影响标志 无
功能说明 将A寄存器中的内容,写入控制寄存器CONT中。
(12) 十进制调整指令
语法规则 DAA
指令编码0101
操作内容 如果[A(3~0)>9]或[DC=1],
则A(3~0)+6→A(3~0);
如果[A(7~4)>9]或[C=1],
则A(7~4)+6→A(7~4);
影响标志 C进位标志受影响。
功能说明 DAA指令通常跟随在加运算指令之后,用来调整在累加器中的8位二进制数值,使累加器中的数值变成两位十进制数的表示法,分别用两个4比特数来表示十位及个位数。
(13) 寄存器减1送A指令
语法规则 DECA R
指令编码0110rrrrrr
操作内容 R-1→A
影响标志 Z零标志受影响。
功能说明 将R寄存器的内容减1,并且将结果存入A寄存器中。
(14) 寄存器减1指令
语法规则 DEC R
指令编码0111rrrrrr
操作内容 R-1→R
影响标志 Z;零标志受影响。
功能说明 将指定R寄存器内含值减1。
(15) 关闭中断总使能位指令
语法规则 DISI
指令编码0101
操作内容 0→
影响标志 无
功能说明 将中断总使能位(该比特在控制寄存器CONT中比特6的位置)清0,以禁止CPU响应所有的中断请求。
(16) 寄存器减1送A并跳转指令
语法规则 DJZA R
指令编码010110rrrrrr
操作内容 R-1→A,结果若为0则跳一步
影响标志 无
功能说明 将所指定R寄存器的内容减1,并将结果存于A寄存器内。如果结果为0,则下一个指令被跳过;否则继续执行下一条。
(17) 寄存器减1并跳转指令
语法规则 DJZ R
指令编码010111rrrrrr
操作内容 R-1→R,结果若为0则跳一步
影响标志 无
功能说明 将所指定R寄存器的内容减1,并将结果存回R寄存器内;如果结果为0,则下一个指令被跳过;否则继续执行下一条。
(18) 开放中断总使能位指令
语法规则 ENI
指令编码0101
操作内容 1→
影响标志 无
功能说明 将中断总使能位(该比特在控制寄存器CONT中比特6的位置)置1,以允许CPU响应所有的中断请求。
(19) 寄存器加1送A指令
语法规则 INCA R
指令编码01010rrrrrr
操作内容 R+1→A
影响标志 Z;零标志受影响。
功能说明 将被指定R寄存器的内容加1,并将结果放入A寄存器中。
(20) 寄存器加1指令
语法规则 INC R
指令编码010101rrrrrr
操作内容 R+1→R
影响标志 Z;零标志受影响。
功能说明 将被指定R寄存器的内容加1,并且将结果再存回R寄存器中。
(21) 软件中断指令
语法规则 INT
指令编码1111001
操作内容 PC+1→[堆栈顶部]
01H→PC
影响标志 无
功能说明 软件中断指令,首先将下一条指令地址存入堆栈中,然后将软件中断服务子程序入口0001H载入程序计数器PC中。
(22) 特殊功能寄存器读取指令
语法规则 IOR R
指令编码01rrrr
操作内容 IOCR→A
影响标志 无
功能说明 将特殊功能寄存器IOCR中的值读到寄存器A中。
(23) 特殊功能寄存器写入指令
语法规则 IOW R
指令编码rrrr
操作内容 A→IOCR
影响标志 无
功能说明 将A寄存器的内容载入特殊功能寄存器IOCR中。
(24) 无条件跳转指令
语法规则 JMP K
指令编码101kkkkkkkkkk
操作内容 K→PC(9~0)
R3(6~5)→PC(11~10)
影响标志 无
功能说明 当执行一个跳转指令,指令码所携带的10位地址码就会被载入程序计数器PC中。
(25) 寄存器加1送A并跳转指令
语法规则 JZA R
指令编码011110rrrrrr
操作内容 R+1→A,若结果为0就跳一步。
影响标志 无
功能说明 将所选定的寄存器R的内容加1,并将结果存于A寄存器,若结果为0,则跳过下一条指令。
(26) 寄存器加1并跳转指令
语法规则 JZ R
指令编码011111rrrrrr
操作内容 R+1→R,若结果为0就跳一步。
影响标志 无
功能说明 将所选定的寄存器R的内容加1,并将结果存于R寄存器,若结果为0,则跳过下一条指令。
(27) 比特测试并为0跳转指令
语法规则 JBC R,B
指令编码110bbbrrrrrr
操作内容 如果R(B)=0,就跳一步。
影响标志 无
功能说明 如果寄存器R的比特“B”是“0”,则跳过下一条指令。
(28) 比特测试并为1跳转指令
语法规则 JBS R,B
指令编码111bbbrrrrrr
操作内容 如果R(B)=1,就跳一步。
影响标志 无
功能说明 如果寄存器R的比特“B”是“1”,则跳过下一个指令。
(29) 数据传送指令(4条)
语法规则 MOV R,A
指令编码01rrrrrr
操作内容 A→R
影响标志 无
功能说明 将A寄存器中的值载入寄存器R中。
语法规则 MOV A,R
指令编码01000rrrrrr
操作内容 R→A
影响标志 Z;零标志受影响。
功能说明 将R寄存器中的值载入A寄存器,此后如果A寄存器中的结果为零,就会将Z标志置成1;否则将Z标志清为0。
语法规则 MOV A,K
指令编码11000kkkkkkkk
操作内容 K→A
影响标志 无
功能说明 将立即数K载入A寄存器中。
语法规则 MOV R,R
指令编码11000kkkkkkkk
操作内容 R→R
影响标志 Z;零标志受影响。
功能说明 将寄存器R的内含值传送到该寄存器本身,目的是为了影响Z标志位,以检测R的内含值是否为0。
(30) 空操作指令
语法规则 NOP
指令编码
操作内容 不做任何操作。
影响标志 无
功能说明 不做任何工作,仅仅用来做时间的延迟。
下期,我们继续为大家介绍EM78P447S指令系统的其他指令和寻址方式等内容。
本期的有奖问答题目是:
1. 指令中的操作码和操作数分别起什么作用?EM78P447S单片机的指令编码长度为多少位?
2. EM78P447S单片机没有实现不同寄存器之间直接传递的指令,假若想把寄存器R8的内容复制到R9中,想一想应该如何实现?
(大海创作室)