【发布时间】:2012-05-27 16:48:24
【问题描述】:
我希望创建一个最小的、计算通用的字母数字 x86 操作码子集。最终,我希望子集包含尽可能少的指令,如果有多个最小子集,我也想知道这一点。该子集应该能够模拟可以使用整套字母数字指令编写的任何程序。说明应仅涵盖与字符“A-Z”、“a-z”和“0-9”相对应的说明。
到目前为止,我认为 push、pop、inc、dec、cmp 和 je 就足够了,但我确信还有一个更小的集合。我如何证明我生成的集合能够使用所有字母数字指令模拟任何程序?我怎么能证明这样的集合是最小的?有谁知道这样的指令子集是否存在?
【问题讨论】:
-
您当然可以从列表中删除
inc或dec,您不必同时拥有两者。 :) -
不能将
inc和dec替换为一个接受负数的add? -
就像 Alexey 所说,
inc或dec中只有一个是必要的,因为最终会发生溢出。 -
这取决于您希望允许的低效程度;例如Why is mov turing complete?。如果您想实际模拟其他 x86 指令,以便可以在寄存器中使用类似的值(而不必将事情分解为单个位),那么您需要的不仅仅是 mov。至少一个布尔值(可能是 BMI1
andn)。您可以使用生成和传播进位的循环来模拟 add,直到您处理完所有进位。 -
IDK 你对 A-Za-z0-9 的意思是什么。该字符集涵盖了每条 x86 指令,包括像 AVX
vextractf128和xchg这样的东西,它有一个隐含的lock前缀,使其成为原子 RMW。 (与cmpxchg8b和其他接受lock的指令不同。)和vfmadd132psFP FMA。你的意思是你不允许助记符中的空格,即没有前缀?
标签: x86 alphanumeric opcode turing-complete