如何跳转到英特尔汇编中保存在寄存器中的地址?

时间:2015-06-13 07:14:36

标签: assembly x86

如果我计算标签的地址并将其存储在eax寄存器中,我该如何有条件地跳转(使用JE)到eax

jmp eax

编译,但我没有检查它是否有效。

je eax

不编译(操作码和操作数的无效组合)。 为什么不同?如果等于eax,我该怎么跳?

1 个答案:

答案 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