第5节 RS08 CPU简介
推荐给好友
打印
加入收藏
更新于2008-07-25 09:38:31

RS08超低端内核是高性能、低功耗HCS08架构的简化版本。该内核体积比传统内核小30%,带有精简指令集,寻址方式有所变化。

3.5.1 RS08 CPU和RAM的寄存器

RS08 CPU和RAM的寄存器如图3-2所示,RS08的内核中只有一个8位的累加器A,14位的程序计数器PC及SPC,以及一个2位的条件码寄存器。变址寄存器X、数据变址寄存器D[X]、页面寄存器PAGESEL存放在内存中。但是他们都参与CPU的运算,通过他们我们可以对整个16K的地址空间实现寻址操作,包括变址寻址,这些寄存器的用法,将在后面详细介绍。从这里可以看出,RS08的寄存器已经大大的简化了。另外,RS08没有堆栈寄存器,所以没有硬件的堆栈功能,但是仍然可以采用软件的方法来实现堆栈的功能。

在CPU的寄存器中,累加器A是最重要的寄存器。这个累加器是8位的,与HC08及HCS08的累加器没有什么区别。
RS08的程序计数器PC也与HC08及S08的程序计数器功能是一样的,不同的是它是14位的。另外由于RS08没有堆栈寄存器,所以它增加了一个映像程序计数器SPC,用于保存调用子程序时的返回地址。当调用子程序时,返回地址保存在映像程序计数器SPC中,执行返回指令时,SPC中保存的地址就会写入程序计数器PC中,使程序返回到上级主程序继续执行。
RS08的条件码寄存器CCR也大大简化了,它只有两位,包括进位标志位C和零标志位Z。
RS08 也有两个变址寄存器,不过他们并不在CPU的内核之中,而是在RAM中,其中X寄存器用于存放要访问的RAM和FLASH地址,而D[X]寄存器中内容就是X所指向的RAM或者FLASH地址中的数据。

3.5.2 RS08分页方案

通过X 和D[X] 的组合,我们就可以对整个16K的地址空间进行访问。但是X寄存器是8位的怎么通过它实现访问16K的地址空间呢?为了解决这个问题,RS08在RAM 中增加了一个页面寄存器PAGESEL,以及一段分页窗口,地址是0x00C0~0x00FF。通过RS的分页机制,整个RS08的16K地址空间被分为256个页,每一页有64个字节。当用分页机制访问某个地址时,PAGESEL寄存器确定这个地址的高8位,X 寄存器或者指令中操作数确定这个地址的低六位,这样就组成了一个14位的有效地址,也就可以对整个16K的地址空间进行访问了。实际上如果对0x00C0~0x00FF的地址进行访问实际上就是采用了分页机制,此时页面寄存器PAGESEL决定了你到底访问的是哪个物理地址。RS08的分页方案示意图如图3-3所示。

3.5.3 RS08的寻址方式

RS08的CPU有九种不同寻址方式。
第一种是隐含寻址。该指令无需读取操作数,所以不需要操作数地址,如对累加器的操作指令,中断返回指令等等。大多数指令长度为1个字节。
第二种寻址方式为立即寻址。这种指令的操作码后紧跟着一个一般是8位的立即数。
第三种是直接寻址方式。这种寻址方式的指令中,操作码后面紧跟着一个8位的地址,也就是地址范围为0x0000~0x00FF的地址,这段地址通常称为零页地址或直接地址,所以这种寻址方式称为零页或者直接寻址方式。这种指令一般是两个字节,一个字节的操作码和一个字节的地址。
在RS08中为了提高代码的紧凑度和效率,又增加了两种寻址方式:小型寻址方式和短型寻址方式。
第四种是小型寻址方式。它访问的0x0000~0x000F之间的16个字节地址空间,单字节。
第五种是短型寻址方式。它访问的0x0000~0x001F之间的32个字节地址空间,单字节。
因为这两种寻址方式都是单字节的,所以在指令长度和执行周期都更加高效,当然不是所有的指令都可以采用这两种寻址方式。
第六种是相对寻址方式。所有的条件转移指令都采用相对寻址方式,它的寻址范围是转移指令之后的那个指令地址的-128~+127个字节的范围。
第七种是扩展寻址方式。在RS08中只有JMP和JSR指令直接采用扩展寻址的方式,其他指令对扩展寻址即非零页地址的访问是通过分页窗口机制来完成的。
第八种是变址寻址方式。通过X和D[X]的组合来实现的。变址寻址的好处在于可以将一段程序计算的结果直接作为需要访问的具体的地址,这对于查表运算是非常重要的。

RS08也有MOVE直接转移指令,可以将数据从一个地址直接转移到另一个地址,无需通过累加器A和别的中间寄存器。由于MOVE指令后跟着的是两个8位的操作数,所以它只能将数据在两个零页地址之间转移,或者将一个立即数放入一个零页地址,但是我们知道RS08的X,D[X]以及分页窗口寄存器都是在零页范围之内,因此通过这些特殊地址的使用,我们就能实现整个地址范围的直接数据转移,就像这里列出的五种方式:立即到直接,立即到变址,直接到直接,变址到直接,直接到变址。

3.5.4 RS08的子程序调用
由于RS08没有堆栈寄存器,所以它增加了一个映像程序计数器SPC,用于保存调用子程序时的返回地址。表3-2给出了HC(S)08和RS08的子程序调用比较。

表3-2 HC(S)08和RS08的子程序调用比较

从软件的角度来看,RS08和HC(S)08调用子程序的方式没有任何不同。但是从CPU的工作过程来看,RS08调用子程序时,返回地址保存在映像程序计数器SPC中,执行返回指令时,SPC中保存的地址就会写入程序计数器PC中,使程序返回到上级主程序继续执行,没有进栈和出栈的操作,所以RS08的子程序调用速度比HCS08更快。
当执行子程序调用指令后,CPU会将下一条指令的地址,也就是当前PC中内容写入SPC,然后将被调用的地址写入PC,然后就跳转至子程序入口,当退出子程序即执行RTS指令后,CPU将SPC中的内容拷入PC,然后返回到这个地址开始执行,由于SPC只有一个,如果发生第二级子程序调用,第二个返回地址就会将第一个返回地址覆盖掉,此时就需要软件来保存第一个返回地址,实现子程序得到嵌套调用。因此,RS08增加了两条新的指令,SHA和SLA,用于保存映象存储计数器的值。SHA是将SPC寄存器的高六位数与A进行交换,并将A的高两位清0;SLA将SPC的低8位字节与A进行交换。通过这两条指令,RS08就可以保存和恢复映象程序计数器的值,也就可以用软件的方式实现子程序的嵌套调用了。

3.5.5 RS08的指令集
RS08指令集比HC08和HCS08要少很多,如表3-3所示

所以RS08的指令集比HC08和HCS08要精简些,这也是为适应低端要求而做的优化。但是,为了给RS08提供更加丰富的汇编指令,也为了保持RS08和HC(S)08单片机的兼容性,CodeWarrior还为RS08提供了很多伪指令,表3-4列出了CodeWarrior提供的RS08的伪指令集。这些伪指令本来就是HC(S)08的汇编指令,而在RS08中虽然没有这些指令,但是他们可以用相应的RS08的固有指令替代,实现相同的功能。所以很多HCS08中的汇编指令在RS08中可以继续使用,例如HC(S)08中的TSTA指令即检测累加器A的指令,在RS08中就用ORA 0来替代, 这个指令完全能够实现与TSTA指令完全相同的功能,而且也不会改变累加器A中的内容。


测试 TST opr8a TSTX TST ,x TSTA
需要注意两点:第一,这些伪指令的替代是由编译器自动实现的,无需编程人员进行任何设置。第二,这些伪指令用RS08固有指令替代后,虽然可以实现相同的功能,但是与HCS08的指令相比,它们的指令长度和执行周期可能发生变化,当然这在大多数场合是不需要程序员关心的。这些伪指令大部分是有关变址的寻址指令,由于RS08没有变址寄存器,所以这类指令要由相应的对X和D[X]寄存器的操作来实现。

<<上一节 下一节>>




 
关于我们 | 诚邀加盟 | 客户服务 | 相关法律 | 网站地图 | 友情链接 | 服务信箱:service@eefocus.com
© 2006 与非门科技信息咨询(北京)有限公司 All Rights Reserved.