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

T. *_*ter 3 assembly visual-c++

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

lea ecx, 0x0000001f[edx]
        ;jmp ecx        ;ok
        ;jae EXIT_LOOP  ;ok 
        jae ecx     ;   not ok  "improper operand type"
Run Code Online (Sandbox Code Playgroud)

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

MJZ*_*MJZ 5

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

...
jb  skip
jmp ecx
skip:...
Run Code Online (Sandbox Code Playgroud)

[编辑添加无标签版本]

这是丑陋的,有点击败了使用ASM的一个目标(即性能):注意JB(跳到下面)相当于JC(跳上进位).如果A和B是地址,则A为跳转到的地址,如果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
Run Code Online (Sandbox Code Playgroud)

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

如果你想使用其他标志,更多的参与技巧.您需要使用lahf或pushf指令将标志置于可处理的位置.

啊.

  • 为了明确起见,一般的问题是没有使用标签的条件JMP *。您提供的答案似乎使用了标签。即使没有这样的操作码,您还能给出另一种解决方案,即不需要标签吗? (2认同)