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进行寄存器(或堆栈)变量?也许有一种不同的方法来解决这个问题(有条件地使用数字跳转到某处,而不是标签,在编译时已知)?
也许那是因为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指令将标志置于可处理的位置.
啊.