英特尔x86组件 - lt,gt,eq

时间:2013-10-23 15:15:36

标签: assembly x86 intel translate masm

我正在尝试编写一个翻译英特尔x86汇编语言(MASM)中的VM语言的翻译器。不幸的是我无法找到lt(小于),gt(大于)或eq(相等)的正确翻译,但我希望在指令集中有类似的东西。 我能找到的最接近的东西是cmp(比较),然后是条件跳跃。但没有任何跳跃。

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

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

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

2 个答案:

答案 0 :(得分:3)

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

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

请注意,您的翻译人员必须进一步了解gt/lt操作及其参数,以确定如何翻译比较。

答案 1 :(得分: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