我正在尝试编写一个翻译英特尔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,因为它们不是直接跟随跳转,而是两个跳跃条件的一部分。
答案 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