x86汇编中如何在cmp与条件跳转间保留EFLAGS标志位?
解决CMP与JE间插入ADD导致标志位被覆盖的问题
你的核心问题是add指令会修改EFLAGS寄存器里的ZF(零标志位)等状态位,把cmp eax,ecx设置好的标志覆盖了,导致je没法正确触发跳转。这里给你两个实用的解决办法:
方法1:用PUSHFD/POPFD保存恢复标志位
这是最直接的方案,先把EFLAGS压栈存起来,执行完统计用的add后再恢复回去:cmp eax,ecx nop nop nop nop pushfd ; 把当前EFLAGS的状态压入栈保存 add DWORD PTR [rsi+0x20],0x1 popfd ; 从栈里恢复之前保存的EFLAGS状态 je 0x7ffff7ffb36cpushfd会保存所有EFLAGS位,popfd能完整恢复,这样je就能基于cmp后的标志位判断是否跳转。方法2:调整指令顺序,先跳转再统计
如果允许改动指令的执行顺序,可以先执行je判断跳转,再在跳转的目标路径里统计执行次数,完全避开标志位干扰:cmp eax,ecx nop nop nop nop je 0x7ffff7ffb36c_je_count ; 先判断是否跳转 ; 非跳转路径的原有代码(如果有的话) jmp 0x7ffff7ffb048_skip
0x7ffff7ffb36c_je_count:
add DWORD PTR [rsi+0x20],0x1 ; 在跳转目标处统计次数
; 原je目标地址的原有代码
0x7ffff7ffb048_skip:
; 后续代码
这种方式不需要操作EFLAGS寄存器,通过调整流程避免标志位被覆盖,适合对栈操作有顾虑的场景。 如果是调试或二进制插桩这类场景,方法1的`pushfd/popfd`通用性最强,不用大幅改动原有指令流程,只插两条指令就能解决问题。 内容的提问来源于stack exchange,提问作者testing_22
相关产品推荐
相关产品推荐

