COMET虚拟计算机说明
COMET是一台字长为16位的定点计算机,主存储器的容量是65536字节,按编号0000-FFFF(十六进制)编址。一个字的位数为0 1 2 ⋯ 15。COMET虚拟机可以集成调试功能,用户可以在使用时参考帮助。
寄存器
COMET机有5个通用寄存器GR(16位),一个指令计数器PC(16位)和一个标志寄存器FR(2位)。其中GR1,GR2,GR3,GR4通用寄存器兼作变址寄存器。另外,GR4还兼作栈指针(SP)用,栈指针是存放栈顶地址用的寄存器。PC(指令寄存器) 在执行指令的过程中,PC中存放着正在执行的指令的第一个字的地址(一条指令占两个字)。当指令执行结束时,一般是把PC的内容加2(根据实现不同有差异),只有在执行转移指令且条件成立时,才将转移指令地址置入PC中。FR(标志寄存器) 在ADD、SUB、MUL、DIV、MOD、AND、OR、EOR、CPA、CPL、SLA、SRA、SLL、SRL和LEA等指令执行结束时,根据执行的结果,将FR置成00,01或10(大于、等于、小于;或负数、零、正数)。它不会因其它指令的执行而改变。
指令
COMET指令格式:OP GR,ADR[,XR],其中OP对应第一个字的高8位(0-7位),GR为第一个字的(8-11位),XR为第一个字的(12-15位),ADR对应第二个字;即一个指令为两个字长。如果为直接寻址,即无XR,则第一个字的8-11为全部为0(GR0不能用作变址寻址)!
编码,E为地址(等于ADR+[XR]),在LEA等指令中为直接数,即称取址。全部COMET机器指令如下:
// CASL机器指令
const (
HALT = 0X0 // 停机
LD = 0X1 // 取数, GR = (E)
ST = 0X2 // 存数, E = (GR)
LEA = 0X3 // 取地址, GR = E
ADD = 0X4 // 相加, GR = (GR)+(E)
SUB = 0X5 // 相减, GR = (GR)-(E)
MUL = 0X6 // 相乘, GR = (GR)*(E)
DIV = 0X7 // 相除, GR = (GR)/(E)
MOD = 0X8 // 取模, GR = (GR)%(E)
AND = 0X9 // 与, GR = (GR)&(E)
OR = 0XA // 或, GR = (GR)|(E)
EOR = 0XB // 异或, GR = (GR)^(E)
CPA = 0XC // 算术比较, (GR)-(E), 有符号数, 设置FR
CPL = 0XD // 逻辑比较, (GR)-(E), 无符号数, 设置FR
SLA = 0XE // 算术左移, 空出的的位置补0
SRA = 0XF // 算术右移, 空出的的位置被置成第0位的值
SLL = 0X10 // 逻辑左移, 空出的的位置补0
SRL = 0X11 // 逻辑右移, 空出的的位置被置0
JMP = 0X12 // 无条件跳转, PC = E
JPZ = 0X13 // 不小于跳转, PC = E
JMI = 0X14 // 小于跳转, PC = E
JNZ = 0X15 // 不等于0, PC = E
JZE = 0X16 // 等于0跳转, PC = E
PUSH = 0X17 // 进栈, SP = (SP)-1, (SP) = E
POP = 0X18 // 出栈, GR = ((SP)), SP = (SP)+1
CALL = 0X19 // 调用, SP = (SP)-1,(SP) = (PC)+2,PC = E
RET = 0X1A // 返回, SP = (SP)+1
)
扩展指令
为了方便代码生成,增加了NOP空命令:
const (
NOP = 0X1B // 空指令
)
为了增加系统的扩展性,增加了一个SYSCALL命令。SYSCALL命令的机器码为0xFF,ADR部分中低8位作为系统调用的ID。
const (
SYSCALL = 0xFF // 系统调用
)
CASL汇编语言
CASL汇编语言是针对COMET虚拟机定义的汇编语言,细节请参考相关文档。