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汇编语言是针对COMET虚拟机定义的汇编语言,细节请参考相关文档。