2

我正在尝试编写一个翻译器,用 Intel x86 汇编语言 (MASM) 翻译 VM 语言。不幸的是,我找不到 lt(小于)、gt(大于)或 eq(等于)的正确翻译,但我希望指令集中有类似的东西。我能找到的最接近的东西是 cmp (比较),然后是条件跳转。但是没有跳跃就什么都没有。

例如,当我想翻译 if (x>1 and x<3) do ... VM 代码看起来像

push local 0
push constant 1
gt
push local 0
push constant 3
lt
and
if-goto IF_TRUE0

我现在的问题是我不知道如何翻译 gt 和 lt 因为它们不是直接跟随跳转,而是都是单个跳转条件的一部分。

4

2 回答 2

3

使用另一个条件跳转。一个天真的翻译就像

        cmp local0, 1
        jle .L1
        cmp local0, 3
        jge .L1
        ;; code of true case
.L1:

请注意,您的翻译器必须比gt/lt操作及其参数更深入地了解应该如何翻译比较。

于 2013-10-23T15:39:25.490 回答
0

如果您想自动进行翻译(您想编写类似 JIT 编译器的东西),您必须考虑“gt”指令的工作原理:

“GT”的示例:

Stack before: X, Y, ...
Stack after: 1, ... if (X<Y)

一条“LT”指令需要多条 x86 指令。例子:

  pop ax  ; this is X
  pop cx  ; this is Y
  xor dx,dx ; set edx to 0
  cmp cx,ax
  jle some_label
  mov dx,1
some_label:
  push dx

使用 32 位代码,您可以使用“setgt”指令:

pop eax  ; this is X
pop ecx  ; this is Y
xor edx,edx ; set edx to 0
cmp ecx,eax
setgt dl
push edx
于 2013-10-24T08:07:17.067 回答