CPME48是一个简易CPU的VHDL实现,它仅支持少量自定义的RISC指令(IR48)。
- cheme:为CPME48设计的高级语言,Scheme的变种子集。cheme拥有语法为S-表达式风格、语义基于副作用、强类型等特点。cheme语言提供的
chemec
可以将cheme程序编译为CPME48的汇编指令IR48*。 - dasm: 为CPME48设计的汇编器,能将IR48指令编写的文件汇编为CPME48的机器指令。也能将CPME48的二进制程序反编译。
在默认的IR48指令集实现中,CPME48的技术规格如下:
- CPME48具有8个8位通用寄存器(从R0到R7)(注①)。
- CPME48的指令寄存器(IR)是16位的。
- CPME48的数据总线是16位的(注②)。
- CPME48的地址总线是16位的。
- CPME48的外设端口设置了8个(注③)。
- CPME48的存储器大小为64K×16位(注④)。
注:
① CPME48没有对有特殊用途的R7寄存器做保护,即寄存器R7有时作为地址高字节使用,但对汇编语言的程序员来说,R0到R7都是可直接存取的。
② 数据总线仅在读取IR时处理16数据,在读取其它数据时,按照8位总线使用。
③ 由于实际硬件的限制,这8个端口实则同一个端口。
④ 存取指令时,每个单元16位数据都有效;存取数据时,每个单元仅低字节有效。
在IR48的扩展指令集IR48*的意义下,CPME48*基本技术规格与CPME48一致,但新增加了几个寄存器,并将通用寄存器赋予了新的意义。寄存器详细指标如下:
引用代码 | 寄存器 | 名字 | 说明 |
---|---|---|---|
000 | AX(R0) | 累加器 | 通用,或作为累加器 |
001 | BX(R1) | 通用 | |
010 | CX(R2) | 通用 | |
011 | DX(R3) | 通用 | |
100 | SI(R4) | 源索引 | 串复制源地址,数组索引 |
101 | DI(R5) | 目的索引 | 目的地址,数组索引 |
110 | SP(R6) | 栈指针 | 栈顶指针 |
111 | BP(R7) | 基址指针 | 栈中引用位置的地址 |
--- | CS | 代码段基址 | 代码段基址 |
--- | DS | 数据段基址 | 数据段基址 |
--- | SS | 栈段基址 | 栈段基址 |
111 | FLAG | 状态位 | 标志集,状态位 |
--- | IR | 指令寄存器 | 当前指令地址 |
000 | PC | 程序计数 | 将要执行的指令的地址 |
注:
①---
表示无法直接引用,只能通过指令间接影响该寄存器。
② 寄存器PC、FLAG只能被特殊指令(如SPOP
、SPSH
指令)引用。
CPME48只支持直接寻址的寻址方式。
CPME48采用的内存布局称为“simple”,反应在汇编代码中应为:
.MODEL SIMPLE
在IR48中,数据、代码和运行时栈(Runtime stack)并不严格区分,在IR48*中,引入了CS、DS以及SS寄存器管理这些内存区域。尽管如此,一个程序还是会占用整个存储器空间,因此这种内存布局是“简易的”。
+--------------------+
0x0000 | Empty Unit |
+--------------------+
0x0001 | |
| Code Segment |
0x00FF | |
+--------------------+
0x0100 | |
| Data Segment |
0x01FF | |
+--------------------+
0x0200 | |
| Stack Segment |
0x02FF | |
+--------------------+