23

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

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

你能推荐一套最基本和最基本的组装说明吗?谢谢!

4

8 回答 8

9

控制结构包含基本特征,没有它就没有语言。这意味着您的语言必须提供对两个变量的算术运算;然后允许程序根据操作结果更改程序计数器——即分支。很多时候,关键操作是 SUB,用于从另一个操作数中减去一个操作数。允许分支的条件是:

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

您还需要指令来移动数据:例如,加载和存储。

这三个条件及其对应的分支(或跳过,这是另一种方法)对于任何程序都是必需的。不仅如此,仅仅这三个简单的操作加上数据移动指令,就足以做任何事情在程序中做除了 I/O 之外的如果你愿意,并且给定一个协作的内存组织,你可以只使用 LOAD、STORE、ADD、SUB 和三个条件分支来重写 Linux。

PDP-8 是一台比这更强大的机器:它拥有丰富的 8 条指令集,包括 I/O。

高温高压

于 2012-02-24T22:50:00.663 回答
8

嗯,这是一个非常广泛的主题。我想您需要熟悉Random Access Machine。我不是专家,但很难说这个非常基本的微处理器应该支持哪些指令。例如:减法和乘法可以通过加法运算来模拟。如果微处理器支持跳转和条件指令,则可以进行乘法运算,并且可以通过添加负数进行减法运算。

于 2012-02-24T22:35:11.840 回答
7

令人惊讶的是,存在单指令集计算机之类的东西。

于 2012-02-24T23:04:06.467 回答
7

最少的指令集不需要指令或者可能是零指令。我不知道它们是否进入了真实设备,但是单指令集计算机(OISC) 已经在碳纳米管计算机MAXQ中实现并成功运行。

事实上,x86 也可以用作 OISC 架构,因为它已被证明是图灵完备的,因此只需一个单一的就可以做任何事情mov。甚至还有一个名为movfuscator的编译器可以将有效的 C 代码编译成只有 MOV(或只有 XOR、SUB、ADD、XADD、ADC、SBB、AND/OR、PUSH/POP、1 位移位或 CMPXCHG/ XCHG)。请参阅为什么 mov 图灵完成?


然而,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但右移比较棘手,因此您可能还需要添加右移以简化一些常见操作

于 2013-10-30T08:58:00.473 回答
4

SOB:您可以使用仅由减一和分支组成的最小指令集很好地生存。整个程序可以并且已经用它编写。

于 2013-10-30T09:02:58.137 回答
3

看商业实现

最好的答案可能是查看现有的商业实现。

任何非商业销售的东西都可能没有用。

指令的定义是什么?

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

然而,它是否具有商业吸引力?不太可能,因为该硬件可能过于专业化,无法证明开发成本是合理的。

但还有比这种极端情况更微妙的情况,答案可能会随着现有竞争对手的技术和市场需求而变化,从而使事情变得更糟。

最后,“高效硬件”意味着:

  • 采取一组基准,为每个基准分配一个重要性权重
  • 编写解决这些基准的最佳软件

非常小的图灵完备 ISA 可能效率低下的可能原因

  • 它们确实拥有的少数指令非常复杂,每次调用它们都会产生大量成本,例如,您无法进行某些流水线优化
  • 代码密度非常小,这意味着:
    • 性能可能受指令获取的限制
    • 不适合ROM内存小的嵌入式设备

著名的 OISC 实施

分析这些以获得更具体的答案会很有趣。

移动融合器

https://github.com/xoreaxeaxeax/movfuscator

仅使用 x86 指令的 x86 玩具 C 编译器,mov以非常具体的方式表明单条指令就足够了。

图灵完备性似乎已在一篇论文中得到证明:https ://www.cl.cam.ac.uk/~sd601/papers/mov.pdf

subleq

教育 OSIC,之前在https://stackoverflow.com/a/9439153/895245中提到但没有名称:

另见: https ://esolangs.org/wiki/Subleq

也可以看看

https://softwareengineering.stackexchange.com/questions/230538/what-is-the-absolute-minimum-set-of-instructions-required-to-build-a-turing-comp/325501

于 2017-04-23T11:28:47.960 回答
2

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

MOV mem1 mem2 - 将内存位置 mem1 的内容复制到内存位置 mem2 保持 mem1 不变

NAND mem1 mem2 to mem3 - 在mem1和mem2的数据之间执行按位逻辑NAND并将结果写入mem3

BITSHIFTR mem1 mem2 mem3- 将 mem1 mem2 位置的数据右移并将输出写入 mem3

JMPcond mem1 mem2 - 测试 mem1 的最低有效位,如果为真(1)跳转到 mem2

现在它不会超快,而且会疯狂地消耗内存带宽,但它可以用来实现具有任意指令集的虚拟机。此外,还有一些编程限制,例如需要对所有起始数据进行编程,或者至少需要将 LSB 设置为 1 的内存位置。硬件外设必须使用 DMA 进行 I/O 访问,如果在哈佛架构程序将无法直接访问指针之类的东西。

于 2018-05-02T01:14:36.250 回答
1

您可能还想查找图灵完备性。

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

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

什么是图灵完备?

这意味着一种语言足以计算任何可以计算的东西。

于 2012-09-12T16:49:31.400 回答