我正在研究一般的汇编编程,所以我决定尝试在软件中实现一个“虚拟微处理器”,它有寄存器、标志和 RAM 可以使用,通过变量和数组实现。但因为我想模拟 只是任何微处理器最基本的行为, ,我想创建一种只有基本指令的汇编语言,只有那些没有它就无法使用的指令。我的意思是,有些汇编语言可以进行乘法和交换寄存器值等,但这些操作不是基本的,因为您可以使用更简单的指令来实现它们。我不想执行这样的指示。

我可以想象一些(我相信)必须始终存在于任何汇编语言中的指令,例如 MOV 移动字节并 J.P 将指令指针发送到另一个地址。

您能否建议一套最基本、最重要的组装说明?谢谢!

有帮助吗?

解决方案

嗯,这是一个非常广泛的主题。我想你需要熟悉随机接入机。我不是专家,但很难判断这款非常基本的微处理器应该支持哪些指令。例如:可以通过添加操作来模拟减法和乘法。如果微处理器支持跳跃和条件指令,则可以通过添加负数来进行倍增。

其他提示

控制结构包括基本特征,没有任何语言。这意味着您的语言必须在两个变量上提供算术运算;然后允许程序将程序计数器更改为“分支” - 基于操作的结果。通常,关键操作是Sub,从另一个操作数减去一个操作数。以及您允许分支的条件是:

  1. 结果为零;
  2. 结果大于零;
  3. 结果小于零。
  4. 无条件,即分支无条件

    还需要说明围绕数据移动数据:加载和商店说。

    任何程序都需要这三个条件及其相应的分支(或跳过,这是另一种方法)是必要的。不仅如此,只有这三个简单的操作加上数据移动指令就足以在除I / O之外的程序中进行 。如果您愿意,并给出合作的内存组织,可以使用只需加载,存储,添加,子和三个条件分支来重写Linux。

    PDP-8是一个比这更强大的机器:它有一个 丰富的八个指令 ,包括I / O.

    hth

令人惊讶的是,有一个一个指令集电脑

需要最少的指令集 没有指示 或者可能 零指令. 。我不知道它们是否已经进入真实设备,但是 一台指令集计算机 (OISC) 已实施 并成功运行在 碳纳米管计算机最大Q.

事实上x86也可以用作OISC架构,因为 这是可能的 任何事物 仅用一个 mov 因为它已经 被证明是图灵完备的. 。甚至还有一个名为 莫弗斯卡托 将有效的 C 代码编译为仅包含 MOV 的程序(或仅包含 XOR、SUB、ADD、XADD、ADC、SBB、AND/OR、PUSH/POP、1 位移位或 CMPXCHG/XCHG)


然而,IMO 的架构 应该足够“快” (或者与其他架构相比,任务不需要太多指令,例如 OISC) 被认为是有用的.

计算机最基本的指令类型是数据移动、逻辑/算术运算和分支。对于算术运算,只需一个 add/subtract 足够。对于逻辑,我们可以只用一个函数来计算任何函数 NOR 或者 NAND, ,所以只需要一个。为了跳跃,我们需要一个 jump on "<=" 或者 jump on "<" 操作说明。数据移动可以通过add/sub 来模拟。像这样,我们可以使用 2 位来编码 3 个操作码(add, nand, jump on "<=")并留下一个以供将来扩展。但由于这没有单独的 加载/存储指令, ,它必须直接对大型寄存器文件而不是内存进行操作,或者指令必须具有使用内存作为操作数的能力。

如果需要更快的速度,则可以添加更多逻辑、分支指令以及可能的加载/存储,从而将操作码空间增加到 3 位。指令集可以是:

  1. 加载
  2. 店铺
  3. 添加
  4. 也不
  5. 跳到小于
  6. 平等地跳跃

左移可以通过 add 但右移比较棘手,因此您可能还想添加右移以简化一些常见操作

您可以通过仅包含以下内容的最小指令集完美生存 SOB: 减一并分支。整个程序可以并且已经用它编写。

查看商业实现

最好的答案可能会看现有的商业实施。

没有商业销售的东西,可能没有有用。

指令的定义是什么?

例如,我可以基于解压缩的硬件实现来制作一个实现解压缩算法的指令,当然,这当然是解压缩的最有效的机器。

它是否会在商业上吸引人?不太可能,因为硬件可能过于专业,以证明发展成本。

但有比这个极端更细致的案例更细致,答案可能会随着现有的竞争对手技术和市场需求及时而变化,以使事情变得更糟。

在最后,“有效硬件”的手段:

理论上,可以进行单个指令计算机。但是,在真实的硬件上,您需要至少4.假设仅内存架构(没有用户可访问的寄存器)。

mov mem1 mem2 - 将内存位置mem1的内容复制到存储器位置mem2离开mem1不变

nand mem1 mem2至mem3-在MEM1和MEM2的数据之间执行位逻辑NAND,并将结果写入MEM3

bitshiftr mem1 mem2 mem3-比特对MEM1 MEM2的数据右键,并将输出写入MEM3

jmpcond mem1 mem2 - 测试MEM1的最低有效位,如果是真的(1)跳转到MEM2

现在它不会超快,它会像疯了一样吃内存带宽,但它可以用来实现具有任意指令集的虚拟机。另外还有某些编程约束,如需要在所有启动数据中编程,或者只有LSB设置为1.硬件外围设备的最小存储位置必须使用DMA进行I / O访问,并且如果在A上实现哈佛架构该程序不会直接访问指针等事物。

您可能还希望查找完整性。

http://en.wikipedia.org/wiki/tular_compliteness

http://c2.com/cgi/wiki?tularcomplete

什么是完成的?

意味着语言足以计算可以计算的任何可以计算的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top