发布于 2021-04-21 18:40:16
仿真可以通过以下几种方式进行:
该处理器的解释器循环如下所示:
uint16_t memory [ 65536 ];
uint16_t registerFile [ 7 ];
uint16_t pc = 0;
for(;;) {
uint32_t ix = (memory [ pc ] << 16) + memory [ pc + 1 ]; // instruction fetch (32-bits)
pc += 2; // advance two words worth for next instruction as default
switch ( ix >> 24 ) {
case 0x00 : // Load R, Immediate
uint16_t imm = ix & 0xFFFF;
int regNumber = (ix >> 16) & 0x7;
registerFile [ regNumber ] = imm;
break;
// other opcodes handled by cases
}
}您将对自定义处理器进行调整,例如处理器是字节可寻址的,还是仅可寻址的字;是大端或小端点,等等。
我们可以将一种形式的机器代码转换为另一种形式的机器代码,即从一个自定义指令集到一个现有指令集。实际的翻译需要将自定义指令集的有状态特征映射为现有指令集的有状态特征,以及对这些有状态资源上的机器代码操作的映射。
由于机器代码程序可以做间接分支,这些分支的操作很难静态预测,翻译解决方案可能包括映射表,以便在给定模拟程序计数器的情况下找到翻译中的位置。
机器代码程序也可以从代码内存中(间接)加载,因此原机器代码程序也可以保存在翻译中。
有时转换也或多或少是动态的,如果自定义处理器允许编写代码内存,然后执行新代码,这可能是必要的。
发布于 2021-04-21 22:21:06
制作自定义指令集可行吗?
是的,当然!你可以做你喜欢的任何东西!(认真地说) :)我假设您对“定制”和“指令集”有特定的定义。通过“定制”,对我来说,这意味着它是一个指令集,没有在已知的硬件上实现。自定义指令集可能实际上意味着自定义CPU体系结构。(这就引出了你最后一个问题的答案,我会讲到的。)如果您对“定制”有不同的定义,那么您应该共享它。通过“指令集”,我假设您指的是在功能和范围上与现有CPU指令集相似的命令(相对于一些非常不同或异国情调的命令)。但无论是哪种情况,答案仍然是“是”。
我怎么模仿他们?
埃里克的答案非常翔实,为这个问题提供了非常丰富的观点。我将集中讨论一个具体的方面。假设您正在考虑一个自定义指令集,该指令集在运行在带有程序计数器的线性内存数组中的标准von体系结构上下文中运行,那么您的仿真将是一个假装是CPU的软件。因此,你将:
如果我真的想运行它,我需要特定的硬件吗?我怎么弄到这个硬件?
如果它是一个自定义指令集,那么我认为直接执行它的硬件是不存在的,至少通过我对“定制”的定义是这样的(否则,它以什么方式是自定义的?)我对“指令集”的定义是,它由“接近硬件”的指令组成,即与硬件直接知道如何执行的低级操作进行一对一的对应。但是,如前所述,您可以使用模拟器执行指令。:)
以答复评论中的补充问题。
但有没有办法制造我自己的硬件?(如果可能的话很容易:)
是的,当然有一种方法可以设计和创建运行自定义指令集所需的硬件。容易吗?这取决于你的技能水平。您可以在网上找到有关如何从头开始设计基本计算机的资源。虽然单个概念对于基本CPU来说并不难理解,但这并不是一项简单的工作,因为有许多部分需要实现。你基本上是在设计自己的电脑,从零开始。
如果您从硬件的角度对这个主题感兴趣,我强烈建议在YouTube上查找YouTube。他有许多精彩的教学视频,讨论CPU的各个部分的创建。
https://stackoverflow.com/questions/67201045
复制相似问题