如何将基于堆栈的指令转换为基于寄存器的指令

时间:2019-03-21 16:22:07

标签: jvm virtual-machine instruction-set dx

这是我用python中的dis模块测试过的-

>>> def f():
...   a = 1
...   b = 2
...   c = 3
...   a = b + c * a
...   return a + c
...
>>> dis.dis(f)
  2           0 LOAD_CONST               1 (1)
              2 STORE_FAST               0 (a)

  3           4 LOAD_CONST               2 (2)
              6 STORE_FAST               1 (b)

  4           8 LOAD_CONST               3 (3)
             10 STORE_FAST               2 (c)

  5          12 LOAD_FAST                1 (b)
             14 LOAD_FAST                2 (c)
             16 LOAD_FAST                0 (a)
             18 BINARY_MULTIPLY
             20 BINARY_ADD
             22 STORE_FAST               0 (a)

  6          24 LOAD_FAST                0 (a)
             26 LOAD_FAST                2 (c)
             28 BINARY_ADD
             30 RETURN_VALUE

这些是基于堆栈的虚拟机的说明。如果我可以访问无限数量的寄存器,有什么方法可以将上述基于堆栈的指令转换为基于寄存器的指令。

我只知道执行此操作的一种工具,我们知道JVM是基于堆栈的,而Dalvik VM是基于寄存器的。当我们用Java编写代码时,类文件包含基于堆栈的指令,并且dx工具将基于堆栈的指令转换为基于寄存器的指令,以便它可以在Dalvik VM中运行。因此,很可能我错过了某个地方的算法。

在堆栈可以动态增长和收缩(这将在运行时决定)的边缘上也可能存在,在这种情况下,不可能将基于堆栈的指令转换为基于寄存器的指令。但是,只有一种工具可以做到。

有人可以指出我正确的方向吗?或知道任何可以帮助解决此问题的算法。

0 个答案:

没有答案