JE
的跳转指令是否必须直接跟随CMP
指令。到目前为止,我确实始终看到首先出现CMP
,之后出现JMP
。但是今天我发现了以下内容:首先,我是初学者。因此,我尝试了解汇编语言。从逻辑上讲,我会说JE
指令与该序列开头的CMP
指令有关。 所以,我的自我解释是,我们先比较一下,然后再进行一些
MOV
和PUSH
操作,之后我们就跳过了,对吗?我在上面提到过,通常在比较之后跳转到下一行,有人可以在这里说出该跳转指令的原因吗?还是正常?
#1 楼
完全正常,编译器倾向于出于优化目的而发出此类代码。此外,延迟条件跳转对于指令预取和分支处理很有帮助。该代码也有效,除非它们之间的代码修改了EFLAGS寄存器。
#2 楼
JE检查零标志(ZF)。因此,只要不修改ZF,您就可以随时跳。与其他跳转指令相同#3 楼
JE(相等跳转)指令使用先前操作的结果,该先前操作通常是CMP(比较),但它可以是许多类似操作中的任何其他操作(例如ADD,XOR等)。实际上,将提供结果的操作和实际的跳转命令可能根本不是连续的,但是如果中间命令不更改结果标志/寄存器,则程序流仍将按预期有效。编译器往往会生成类似的代码(尽管可能会进行自动优化或混淆),而其他时候出于各种原因可能会以这种方式编写定制的手工代码
评论
由于下面有很多不错的答复,因此我将在此处添加。如果仔细查看反汇编,您会发现可以很好地认为JE是在CMP之后立即执行的(不是逻辑上的),该指令将EAX与位于[EBP + 0xC]的内容进行比较,其后的指令永远不会修改[EBP + 0xC],没有其他指令将修改EFLAG寄存器。特别是零标志。无论如何,请记住条件跳转是由EFLAGS的修改决定的,而与所使用的指令无关。