第5节 RS08 CPU简介
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没有堆栈寄存器,所以没有硬件的堆栈功能,但是仍然可以采用软件的方法来实现堆栈的功能。
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分页方案
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的子程序调用比较
当执行子程序调用指令后,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所示
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没有堆栈寄存器,所以没有硬件的堆栈功能,但是仍然可以采用软件的方法来实现堆栈的功能。

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分页方案

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的子程序调用比较

当执行子程序调用指令后,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所示


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


