You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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     0x7ffff7ffb36c
    

    pushfd会保存所有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
相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 01:01:07