任何汇编语言被认为有用所需的最小指令集是什么?

时间:2012-02-24 22:32:15

标签: assembly microprocessors instruction-set vm-implementation

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

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

您能否提出一套最基本和最基本的装配说明?谢谢!

8 个答案:

答案 0 :(得分:9)

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

  1. 结果为零;
  2. 结果大于零;
  3. 结果小于零。
  4. 无条件,即无条件分支
  5. 您还需要移动数据的说明:LOAD和STORE,比方说。

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

    PDP-8是比这更强大的机器:它有一个rich set of eight instructions,包括I / O.

    HTH

答案 1 :(得分:7)

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

答案 2 :(得分:7)

令人惊讶的是,有one instruction set computer这样的东西。

答案 3 :(得分:7)

最少的指令集需要no instructionzero instruction。我不知道他们是否已进入实际设备,但one instruction set computer (OISC) 已实施并在carbon nanotubes computersMAXQ中成功投放。

实际上x86也可以用作OISC架构,因为可以只用一个mov 来执行任何,因为它已经{{3 }}。甚至还有一个名为proved to be Turing-complete的编译器将有效的C代码编译成只有MOV的程序(或者只有XOR,SUB,ADD,XADD,ADC,SBB,AND / OR,PUSH / POP,1位移位) ,或CMPXCHG / XCHG)


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

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

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

  1. 负载
  2. 存储
  3. 添加
  4. ,也不
  5. 跳到不到
  6. 跳平等
  7. 左移可以使用add完成,但右移是比较棘手的,因此您可能还需要添加右移以简化一些常见操作

答案 4 :(得分:4)

使用仅包含SOB:减去1和分支的最小指令集,您可以很好地生存。整个程序可以用这个来写。

答案 5 :(得分:3)

查看商业实施

最佳答案可能是关注现有的商业实施。

任何未经商业销售的东西都可能没用。

指令的定义是什么?

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

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

但是,除了极端情况之外,还有更多细微差别的案例,答案可能会因现有的竞争对手技术和市场需求而变化,以使事情变得更糟。

最终,&#34;高效的硬件&#34;的意思是:

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

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

  • 他们所拥有的一些指令非常复杂,并且每次调用它们都会产生很大的成本,例如:你不能做某些流水线优化
  • 代码密度非常小,意味着:
    • 性能可能受指令提取约束
    • 不适合具有小ROM内存的嵌入式设备

值得注意的OISC实施

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

<强> movfuscator

https://github.com/xoreaxeaxeax/movfuscator

x86的Toy C编译器仅使用mov x86指令,以非常具体的方式显示单个指令就足够了。

图灵完整性似乎已在论文中得到证实: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

答案 6 :(得分:1)

您可能还想查看图灵完整性。

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

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

What is Turing Complete?

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

答案 7 :(得分:1)

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

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

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

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

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

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

相关问题