如果我计算标签的地址并将其存储在eax
寄存器中,我该如何有条件地跳转(使用JE
)到eax
?
jmp eax
编译,但我没有检查它是否有效。
je eax
不编译(操作码和操作数的无效组合)。
为什么不同?如果等于eax
,我该怎么跳?
答案 0 :(得分:4)
根本就没有这种形式的je
。你可以做的是根据相反的条件进行相对条件跳转,然后是无条件寄存器 - 间接跳转:
jne skip
jmp eax
skip:
你可以制作一个宏来避免一遍又一遍地写同样的东西。例如,在NASM语法中,宏可能如下所示:
%macro je_reg 1
jne %%skip
jmp %1
%%skip:
%endmacro
可以像这样使用:
je_reg eax
je_reg ebx
宏可以推广到任何条件代码:
%macro jcc_reg 2
j%-1 %%skip ; %-1 expands to the inverse of the condition in the first macro argument
jmp %2
%%skip:
%endmacro
; Example usage
jcc_reg e,eax
jcc_reg no,ebx