汇编语言中跳转指令执行后比较标志位是否会被清除?
条件跳转指令执行后是否会清除标志位?
不会,常规条件跳转指令仅读取标志位,不会修改或清除标志位,这是绝大多数指令集架构的通用设计。
你提到的JE/JNE/JL/JG/JLE/JGE都属于基于状态标志位判断的常规条件跳转指令,这类指令的行为在x86、ARM、RISC-V、MIPS等所有主流架构中都是一致的:
- 仅读取CPU状态寄存器中的对应标志位(比如零标志ZF、符号标志SF、溢出标志OF等),根据标志位的状态决定是否执行跳转
- 不会对标志位做任何修改,跳转执行完成后,所有标志位都会保留跳转前的原有值
这种设计的核心原因是实用性:很多场景下需要基于同一次运算/比较产生的标志位做多次分支判断,如果跳转指令会清除标志位,就需要每次判断前都重新执行比较/运算指令,既增加冗余代码,也浪费处理器执行周期。
可以参考x86汇编的常见写法验证这个逻辑:
cmp eax, ebx ; 比较eax和ebx的值,运算结果会修改对应的标志位 je equal_proc ; 读取ZF位,相等则跳转到equal_proc,跳转后标志位不变 jg greater_proc ; 直接复用之前cmp产生的标志位做判断,不需要再重新比较
如果JE执行后会清除标志位,那么上面这段代码里的JG判断就会完全失效,不符合常规编程逻辑。
极少数带有特殊副作用的跳转指令可能会修改标志位,但这类指令都属于架构定义的特殊指令,不属于你提到的这类通用条件跳转范畴。
内容的提问来源于stack exchange,提问作者Katoptriss
相关产品推荐
相关产品推荐

