在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
?也许有一种不同的方法可以解决这个问题(有条件地使用数字跳转到某处,而不是标签,在编译时已知)?
答案 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指令将标志置于可处理的位置。
呃。