Skip to content

Latest commit

 

History

History
76 lines (54 loc) · 3.24 KB

README.md

File metadata and controls

76 lines (54 loc) · 3.24 KB

COMET虚拟计算机说明

COMET是一台字长为16位的定点计算机,主存储器的容量是65536字节,按编号0000-FFFF(十六进制)编址。一个字的位数为0 1 2 ⋯ 15。COMET虚拟机可以集成调试功能,用户可以在使用时参考帮助。

寄存器

COMET机有5个通用寄存器GR(16位),一个指令计数器PC(16位)和一个标志寄存器FR(2位)。其中GR1GR2GR3GR4通用寄存器兼作变址寄存器。另外,GR4还兼作栈指针(SP)用,栈指针是存放栈顶地址用的寄存器。PC(指令寄存器) 在执行指令的过程中,PC中存放着正在执行的指令的第一个字的地址(一条指令占两个字)。当指令执行结束时,一般是把PC的内容加2(根据实现不同有差异),只有在执行转移指令且条件成立时,才将转移指令地址置入PC中。FR(标志寄存器) 在ADDSUBMULDIVMODANDOREORCPACPLSLASRASLLSRLLEA等指令执行结束时,根据执行的结果,将FR置成000110(大于、等于、小于;或负数、零、正数)。它不会因其它指令的执行而改变。

指令

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命令的机器码为0xFFADR部分中低8位作为系统调用的ID。

const (
	SYSCALL = 0xFF // 系统调用
)

CASL汇编语言

CASL汇编语言是针对COMET虚拟机定义的汇编语言,细节请参考相关文档。