JE 是否必须直接跟随 CMP?

逆向工程 部件 x86
2021-06-27 06:11:55

我想知道跳转指令是否JE必须直接跟随CMP指令。直到现在,我确实总是看到首先是 a CMP,然后是 a JMP但是今天我发现了以下几点:

...
CMP DWORD PTR SS:[EBP+0xC], EAX
MOV ECX, DWORD PTR SS:[EBP+0x18]
PUSH ESI
MOV ECX, DWORD PTR SS:[EBP+0x18]
MOV DWORD PTR SS:[ECX],EAX 
MOV EAX, DWORD PTR SS:[EBP+0x10]
MOV DWORD PTR SS:[EDI], 0x1
JE SHORT crtdll.6C250E66
....

首先,我是初学者。所以,我试着理解汇编语言。从逻辑上讲,我会说该JE指令与CMP该序列开头指令相关

所以,我的解释是,我们先比较,然后做一些MOVPUSH操作,然后我们都在跳,对吗?

但是,正如我上面提到的,通常在比较之后跳转出现在下一行,有人可以在这里说一下延迟跳转指令的原因吗?还是正常的?

3个回答

这是完全正常的,编译器倾向于为了优化而发出这样的代码。

此外,延迟条件跳转有助于指令预取和分支处理。除非中间的代码修改了 EFLAGS 寄存器,否则该代码也是有效的。

JE 检查零标志 (ZF)。所以只要不修改ZF,你就可以随时跳转。其他跳转指令同理

JE(Jump on Equal)指令使用前一个操作的结果,这个前一个操作通常是 CMP(比较),但它可以是众多类似操作(例如 ADD、XOR 等)中的任何其他操作。事实上,提供结果的操作和实际的跳转命令可能根本不连续,但如果中间命令不改变结果标志/寄存器,程序流仍将按预期有效。

编译器倾向于生成类似的代码(尽管可以自动优化或混淆)其他时候出于各种原因可能会以这种方式编写自定义的手工代码