如何在没有*标签的情况下实现asm *的条件跳转?

时间:2012-12-22 03:53:47

标签: visual-c++ assembly

在Visual C的__asm中,我想跳转到存储在寄存器中的位置,但它似乎不适用于条件跳转,例如JAE。通常情况下这很好(如果你使用标签)。

lea ecx, 0x0000001f[edx]
        ;jmp ecx        ;ok
        ;jae EXIT_LOOP  ;ok 
        jae ecx     ;   not ok  "improper operand type"

有没有办法用Visual C __asm做一个带有寄存器(或堆栈)变量的jae?也许有一种不同的方法可以解决这个问题(有条件地使用数字跳转到某处,而不是标签,在编译时已知)?

1 个答案:

答案 0 :(得分:5)

也许那是因为x86上没有这样的操作码:你不能使用条件跳转,除了标签。你可能想:

...
jb  skip
jmp ecx
skip:...

[编辑添加无标签版本]

这是丑陋的,有点击败了使用ASM的一个目标(即性能):注意JB(跳到下面)相当于JC(跳上进位)。如果AE为B,那么A是跳转到的地址:

...
sbb  eax,eax,0    // propagate carry flag into register; eax == 0 or -1
and  eax,B-A      // eax = 0 or B-A
add  eax,A        // eax = A or B
jmp  eax

你还需要找出你想去的地址......

如果您想使用其他标志,则会涉及更多相关技巧。您需要使用lahf或pushf指令将标志置于可处理的位置。

呃。