Assembly 编写指令集模拟器的主要步骤是什么?

Assembly 编写指令集模拟器的主要步骤是什么?,assembly,simulator,Assembly,Simulator,我将在一个项目上工作,该项目需要为特定的指令集编写一个模拟器(可能不适用于真正的处理器)。该模拟器最好类似于MIPS ISA的SPIM模拟器。它将显示所有寄存器、内存位置等的内容,并让我逐步完成指令。是否有编写模拟器的标准步骤集?从哪里开始? 我知道java和C++,我完成了计算机体系结构的两门课程,并在3人小组中工作。p> 第一步是为您的CPU创建一个汇编程序。汇编程序与模拟器没有任何关系,在我看来,在模拟器中包含汇编解析器会使事情变得不必要的复杂 使用一个单独的汇编器使事情模块化,它允许您的

我将在一个项目上工作,该项目需要为特定的指令集编写一个模拟器(可能不适用于真正的处理器)。该模拟器最好类似于MIPS ISA的SPIM模拟器。它将显示所有寄存器、内存位置等的内容,并让我逐步完成指令。是否有编写模拟器的标准步骤集?从哪里开始?


我知道java和C++,我完成了计算机体系结构的两门课程,并在3人小组中工作。p> 第一步是为您的CPU创建一个汇编程序。汇编程序与模拟器没有任何关系,在我看来,在模拟器中包含汇编解析器会使事情变得不必要的复杂

使用一个单独的汇编器使事情模块化,它允许您的模拟器有简单的二进制代码作为输入,您甚至可以单独创建、验证和修改这些代码。这也符合目前的做法


至于你的模拟器,在谷歌上搜索
编写一个CPU模拟器是第一个成功的选择,而且还有很多有趣的结果。

我认为你需要先使用反汇编程序。模拟器是反汇编程序之外的下一步。例如,x86(或其他可变字长指令集)反汇编器需要跟踪代码的执行。首先,它必须根据操作码知道该指令使用了多少字节,第二,这是一个分支,如果是,是什么类型的,有条件的还是无条件的,并做出相应的反应。模拟器完成了所有这一切,还模拟了寄存器。反汇编程序将用于教育目的,而不是关于sourceforge的精巧的发布。计算跳转偏移量足以让您了解如何在位级别解析指令

我会从一个简单的指令集开始,比如12位pic或6502之类的(msp430是另一个可能的候选者)。如果您使用现有的指令集学习如何编写模拟器,您可以利用现有的isa工具链(汇编程序,可能还有编译器)。把任务分成两半。对于一个新的指令集,如果你想手工编写机器代码,你需要一个工具链,或者至少需要一个好的反汇编程序(反汇编程序会仔细检查你是否有你认为需要的机器代码)。或者,您可以在模拟器中选择以执行顺序输出反汇编代码,这对调试有好处

一开始不要担心中断,但要知道,您需要一种机制来停止模拟流,保存状态,并在如此多的时钟周期内重复使用模拟器。您将看到许多模拟器,基本上是每一条指令的一步。评估每个指令上的时钟滴答数,以确定周期性中断或其他需要与模拟处理器同步的模拟硬件的硬件原因。因此,一开始就用这种方式建模,然后根据需要提出性能改进,这将是一个很好的理想

如果您没有使用状态机编程,我强烈建议您学习一些状态机知识,并编写一些实践程序

我正在做一个项目,我希望发表一篇文章,如果我完成了,这篇文章可能会对类似的主题有所帮助。现在我的指令集模拟器实际上是用硬件设计语言编写的(例如verilog,不是我使用的hdl,而是转换成verilog),然后使用类似于verilator的东西和C/C++包装器。因此,与提取操作码和位相关的工作由一种专门设计用于管理操作码和位的语言来处理。而那些想要模拟外设或提供GUI或其他方式来显示正在发生的事情的部分,则由专门为此设计的语言来处理。如果您正在从事一个项目,该新指令集是用vhdl或verilog实现的,我强烈建议您使用混合hdl模拟器加软件解决方案,如果是商用hdl模拟器,则通过VPI,如果使用verilator或icarus verilog或ghdl或其他更简单的方法,则通过其他更简单的方法。(icarus可能需要类似商业的vpi接口)。这里的美妙之处在于,你更接近真实的硬件,可以在去硅片之前发现并处理硬件中的缺陷/缺点等,硬件中的更改或改进可以在模拟中立即实现,而不必在模拟器中进行匹配的更改或改进,hdl模拟器有脚本语言,或者系统C,等等,这对于硬件功能测试来说很好,但是你不能在硅上运行它。如果您不鼓励使用这些工具,让真实的二进制文件在模拟逻辑上运行,并为真实的工具提供一个抽象层来加载、调试或监视(例如,将后端写入openocd,通过主机传递到hdl sim层,并与芯片上的模拟jtag调试器通信,具体取决于此设计的复杂性)这些真实的程序可以在模拟和硅上运行,节省了编写测试的时间,并且可以在硅到来之前编写好测试软件,而不是在硅到来之后才开始

抱歉HDL切线。如果这是一个新的或没有工具链指令集,你将不得不花时间在这个工具链上,至少一个汇编器和链接器,我会做一些反汇编程序,然后将反汇编程序或它的一部分转换成模拟器上的第一个切割。就我所看到的标准情况而言在指令集模拟器中,基本上考虑单步执行,以便可以处理时钟、中断和其他模拟硬件。模拟的核心功能要么模拟一个时钟周期,它可能不是完整的指令(状态机方法),要么模拟