刚开始的时候特别好奇这种单片机的硬件结构跟51的差别,当我看完它的全部58条指令的时候才知道这真是一个创意,天才的创意。下面来列列EM系列的硬件结构跟51单片机之间的差别。然后以我的观点来小解一下这种差别的必要性。
第一大别: 指令系统
51的指令是16位的指令,即ROM的每个单元是以字节形式存在的。即可以放数据也可以放指令。因而51中的总线结构是数据和地址总线共享的方式,即
只有一条硬件公路,当传送地址码的时候,不能传数据。这样,显然降低了程序执行的效率。而且51的指令的长度不一,有的占用2个指令周期,有的占用4个指
令周期,等等。
EMC的指令是13位的,而且对应的ROM单元也是13位的,因此不能再像51一样直接将一串数组存入ROM区。EMC的指令系统为此专门分配了几条查表指令,使它也能实现大量数据的处理。
EMC的内存数据总线与指令的地址总线是分开的,这样当正在执行某条指令的时候同时还能将下一条要执行的指令放入PC指针中去。而且除了更改PC值的指令占用两个指令周期外其余指令统统只需一个周期即可执行完毕。
总之,这样独特的ROM设计通过增加几条指令弥补了一些功能,同时加速了指令的执行效率。
第二大别:RAM系统
EMC的内存区被统一成了一块工作寄存器区,即状态控制、指令指针、对外端口、等等都被当作是51中的R0-R7功能来使用,这样可以直接改变状态,
直接更改地址,直接控制P口。从而省略了多条复杂的指令。所有关于内存的操作都像MOV a,r0;这样。
可以说,一条MOV,顶51里的几十条难记的指令。通过设计这样的内存,而简化了指令系统,可以说EMC的设计者真的煞费苦心。
第三大别: 内存分体,ROM分页
初见这种分配地址的方式觉得是画蛇添足了,后来才知道,原来就因为它的指令码长度被统一成13位了,那么指令码所能携带的地址或数据的位数便受到了
约束,一条指令中,数据最长是6位,即<=3FH,如何才能访问大于2fh的单元呢,设计者将大于3fh的单元平均分成了四份,每一份的地址同样是
从20h,到3eh,那么如何区分我访问的是哪一块区域的30h单元呢?设计者在状态控制寄存器中划出了两位用于体选。就像51中对r0-r7的访问控制
一样,同样想对不同的体内操作某个单元,必需状态寄存器中的体选码是多少,并改写其值,访问就会转向目标区域。
可见,如此的硬件设计也增加了软件编程上的逻辑复杂度。
同样,对于ROM,一条指令的跳转范围被限制在了1k即10bit长度以内,想要访问大于1k的代码,仍然要通过增加状态位来进行页选,如此,代码区也被分成了4等份,每一份为1k个单元(每个单元为13位)。
这带来了,数据访问时在哪个区域操作的难题,同时也带来了长度超过1k的代码的访问难题,后面我们也将要动用我们的智慧来解决它们,让这些难应用的地方变得像是专门为我们而生的一样。
第四大别:间接寻址
别看EMC的指令中没有什么MOV a,@r;
这样的间接地址访问指令。它同样在硬件设计上解决了这个问题,RAM中000h单元是一个有名无实的寄存器,它与r4即RSR寄存器是等价关系的。即
RSR寄存器具有双址,当以04h地址访问时,它是一个通用的寄存器;当用00H访问时,它变成了一个间址寄存器,即其中的数据代表的是单元地址。如下
XOR A,00H; 看到这条指令不要惊讶,它的执行效果就如同51中的 XOR a,@r4;
第五大别: 堆栈
有人会很奇怪,怎么这个设计者这么“抠”,连个POP a;指令都不给设计,那还怎么保护现场,恢复现场呢。
其实不然,在51中我们需要人为的去规划一块RAM区域来作为堆栈使用,但在EMC中,堆栈被硬件化了,它没有实际的地址了,当需要进行子程序调用时
即自动进行进栈出栈操作。需要注意的是,硬件只设计了5个13位的栈,即调用的嵌套最多只能有5次,超出将会依次覆盖前边内容。这样我们又省去了管理栈的
操作。真是神奇的一逼。
1