3

在 Visual C 的__asm中,我想跳转到存储在寄存器中的位置,但它似乎不适用于条件跳转,例如 JAE。通常这可以正常工作(如果您使用标签)。

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

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

4

1 回答 1

5

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

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

[编辑以添加无标签版本]

这很丑陋,并且有点违背了使用 ASM 的一个目标(即性能):请注意,JB(下方跳转)等同于 JC(进位跳转)。设 A 为 AE 时跳转到的地址, B 为 B 时地址:

...
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 指令将标志置于可处理位置。

啊。

于 2012-12-22T05:04:21.053 回答