看到大家组织民间的开源大赛,我也就花几个小时写点小玩意来给大家参考参考。
做了一个顺序执行(SEQ)处理器的虚拟机,暂且实现了Y86指令集基础命令的执行。
首先是Y86指令集的相关二进制定义:
可以看到,这是一个非常精简的指令集,只有:
halt(结束执行)、nop(空指令)、cmovXX(条件赋值)、irmovl(立即数赋值寄存器)、rmmovl(寄存器数据写道内存)、mrmovl(内存数据读到寄存器)、OPL(基本运算,包括加减、异或、其运算)、jXX(跳转语句)、call(调用指令)、ret(返回指令)、pushl(寄存器压栈)和popl(寄存器出栈)。
不够基本够用了。
寄存器信息如下:
为了防止不够用,我还特意加上了r8~r14共七个通用寄存器。
整个处理器虚拟机的设计严格按照Fetch(取指令)->Decode(解码,看需要使用哪些寄存器)->Execute(ALU单元执行计算阶段)->Memory(写回内存)->Write back(写回寄存器)->Program Counter Update(更新指令当前的PC)。
如果大家看不懂这些阶段是干了些什么,可以看下面两条指令的执行流程:
Call指令:
OPL指令:
这个SEQ处理器的虚拟机就很好实现了(内存部分就随便用数组映射一下吧):
程序中给了一个数组求和的DEMO:
速度大概是系统指令执行速度的1/60,没什么优化。
如果大佬有兴趣可以有将其改进成流水线式的,应该会好很多。