x86 汇编中的【条件跳转指令】:从基础到扩展的全面解析(查表版)

为了彻底覆盖 x86 架构中所有条件跳转指令,包括 8086 到现代 x86-64 的全部变体,我重新整理了分类体系,并补充了鲜为人知的指令变体、操作数大小前缀和历史演进。

本文需要运用的知识(需要详细了解可点击对应的点):

  • flags寄存器

一、条件跳转指令总表(不用背只要用的时候查表就可以)

分类指令跳转条件英文全称操作数机器码64 位兼容性描述
零标志(ZF)JE/JZZF=1Jump if Equal/Zero短跳转74 cb兼容结果为零或相等时跳转
JNE/JNZZF=0Jump if Not Equal/Not Zero短跳转75 cb兼容结果不为零或不相等时跳转
进位标志(CF)JB/JNAE/JCCF=1Jump if Below/Not Above or Equal/Carry短跳转72 cb兼容无符号数低于或有进位时跳转
JNB/JAE/JNCCF=0Jump if Not Below/Above or Equal/No Carry短跳转73 cb兼容无符号数高于等于或无进位时跳转
溢出标志(OF)JOOF=1Jump if Overflow短跳转70 cb兼容有符号数溢出时跳转
JNOOF=0Jump if Not Overflow短跳转71 cb兼容有符号数未溢出时跳转
符号标志(SF)JSSF=1Jump if Sign短跳转78 cb兼容结果为负时跳转
JNSSF=0Jump if Not Sign短跳转79 cb兼容结果为正时跳转
奇偶标志(PF)JP/JPEPF=1Jump if Parity/Parity Even短跳转7A cb兼容结果低 8 位中 1 的个数为偶数时跳转
JNP/JPOPF=0Jump if Not Parity/Parity Odd短跳转7B cb兼容结果低 8 位中 1 的个数为奇数时跳转
有符号数比较JG/JNLESF=OF 且 ZF=0Jump if Greater/Not Less or Equal短跳转7F cb兼容有符号数大于时跳转
JGE/JNLSF=OFJump if Greater or Equal/Not Less短跳转7D cb兼容有符号数大于等于时跳转
JL/JNGESF≠OF 且 ZF=0Jump if Less/Not Greater or Equal短跳转7C cb兼容有符号数小于时跳转
JLE/JNGSF≠OF 或 ZF=1Jump if Less or Equal/Not Greater短跳转7E cb兼容有符号数小于等于时跳转
无符号数比较JA/JNBECF=0 且 ZF=0Jump if Above/Not Below or Equal短跳转77 cb兼容无符号数高于时跳转
JAE/JNBCF=0Jump if Above or Equal/Not Below短跳转73 cb兼容无符号数高于等于时跳转
JB/JNAECF=1Jump if Below/Not Above or Equal短跳转72 cb兼容无符号数低于时跳转
JBE/JNACF=1 或 ZF=1Jump if Below or Equal/Not Above短跳转76 cb兼容无符号数低于等于时跳转
循环控制LOOPECX≠0(执行后 ECX 减 1)Loop短跳转E2 cb兼容循环执行,ECX 为 0 时终止
LOOPE/LOOPZECX≠0 且 ZF=1Loop if Equal/Zero短跳转E1 cb兼容循环且结果为零
LOOPNE/LOOPNZECX≠0 且 ZF=0Loop if Not Equal/Not Zero短跳转E0 cb兼容循环且结果不为零

JECXZECX=0(不改变 ECX)Jump if ECX is Zero短跳转E3 cb兼容ECX 为零时跳转(常用于循环前检查)
  JCXZ   CX=0  Jump if CX is       Zero短跳转E3 cb兼容(64 位下检查 ECX 低 16 位)16 位 CX 寄存器为零时跳转(不改变 CX)
64 位扩展JRCXZRCX=0(不改变 RCX)Jump if RCX is Zero短跳转F3 /9仅 64 位64 位模式下 RCX 为零时跳转
分支预测提示JMPX基于 CPU 分支预测提示Jump with Prediction Hint近跳转0F 1F /0P6 及以后向 CPU 提供分支预测建议(Intel P6 微架构及以后)

二、条件跳转指令详解

1. 基础条件跳转指令(基于标志位)

这类指令直接基于 FLAGS 寄存器中的单个标志位进行判断,是最基本的条件跳转形式。

典型指令示例

; 判断AL是否为0(ZF标志)
TEST AL, AL
JE zero_value   ; ZF=1时跳转; 判断加法是否溢出(OF标志)
ADD AX, BX
JO overflow     ; OF=1时跳转; 判断结果是否为负(SF标志)
SUB CX, DX
JS negative     ; SF=1时跳转

机器码分析

  • 所有基础条件跳转指令的机器码均为 2 字节:
    第 1 字节为操作码(如74表示 JE),第 2 字节为 8 位相对偏移量。
  • 偏移量采用补码表示,范围为 - 128~+127 字节。
2. 比较类条件跳转指令

这类指令基于比较操作(如 CMP)后的多个标志位组合进行判断,分为无符号数和有符号数两套体系。

无符号数比较示例

; 判断AX是否大于BX(无符号数)
CMP AX, BX
JA greater     ; 高于则跳转(CF=0且ZF=0)
JBE less_equal ; 低于等于则跳转(CF=1或ZF=1)

有符号数比较示例

; 判断AX是否大于BX(有符号数)
CMP AX, BX
JG greater     ; 大于则跳转(SF=OF且ZF=0)
JLE less_equal ; 小于等于则跳转(SF≠OF或ZF=1)

标志位组合逻辑

  • 无符号数比较依赖 CF 和 ZF:
    • 进位标志(CF)表示 “低于”,零标志(ZF)表示 “等于”。
  • 有符号数比较依赖 SF、OF 和 ZF:
    • 符号标志(SF)与溢出标志(OF)的异或表示 “小于”。
3. 循环控制指令

循环指令隐式使用 ECX/RCX 寄存器作为计数器,简化了固定次数循环的实现。

经典循环模式

; 循环10次
MOV ECX, 10
loop_start:; 循环体代码LOOP loop_start ; ECX减1,若不为0则跳转

高效替代方案
由于LOOP指令在现代 CPU 上性能较差,推荐使用手动递减方式:

MOV ECX, 10
manual_loop:; 循环体代码DEC ECXJNE manual_loop ; 性能更优的循环实现
4. 64 位扩展指令

在 64 位模式下,新增了针对 64 位寄存器的条件跳转指令:

JRCXZ 指令

; 检查RCX是否为0(64位)
MOV RCX, 0
JRCXZ zero_rcx ; 若RCX=0则跳转

注意事项

  • JRCXZ 仅在 64 位模式下可用,操作 64 位寄存器 RCX。
  • 与 JECXZ 不同,JRCXZ 检查完整的 64 位值,而非低 32 位。
5. 特殊条件跳转指令
JMPX(分支预测提示指令)
; 向CPU提示该分支大概率会跳转
JMPX target [, RAX] ; 预测跳转
NOP                ; 预测不跳转时执行的指令

功能说明

  • JMPX 是 Intel P6 微架构引入的特殊指令,用于优化分支预测。
  • 第二个操作数(可选)用于指定目标地址寄存器。

三、条件跳转指令的高级应用

1. 多条件组合判断

通过连续使用条件跳转指令,可以实现复杂的逻辑判断:

; 判断AL是否在10到20之间(有符号数)
CMP AL, 10
JL out_of_range ; AL < 10,跳转
CMP AL, 20
JG out_of_range ; AL > 20,跳转
; 否则AL在范围内
JMP in_rangeout_of_range:; 处理超出范围的情况JMP donein_range:; 处理范围内的情况done:; 程序结束
2. 条件跳转与标志位的关系

不同指令对标志位的影响不同,需谨慎选择前置指令:

指令ZF(零标志)CF(进位标志)SF(符号标志)OF(溢出标志)
CMP AX, BX反映 AX-BX 的结果反映借位 / 进位反映符号反映溢出
TEST AX, BX反映 AX AND BX 的结果清零反映符号清零
ADD AX, BX反映加法结果反映进位反映符号反映溢出
SUB AX, BX反映减法结果反映借位反映符号反映溢出
3. 条件跳转的性能优化

现代 CPU 对条件跳转的优化策略:

  1. 分支预测
    CPU 会根据历史执行情况预测分支走向,若预测错误会导致流水线清空。

  2. 跳转目标缓存(BTB)
    记录最近的跳转指令及其目标地址,加速跳转执行。

  3. 优化建议

    • 减少条件跳转的使用,优先使用条件移动指令(如 CMOVcc)。
    • 对高频执行的分支,通过代码顺序暗示 CPU 预测方向。

四、历史演进与兼容性

1. 从 8086 到 x86-64 的演变
处理器型号新增条件跳转指令备注
8086JE/JZ, JNE/JNZ, JB/JC 等基础指令仅支持 16 位操作,跳转范围有限
80386JECXZ, 32 位操作数支持引入 32 位寄存器,扩展跳转范围
AMD64JRCXZ64 位模式下新增,支持 64 位寄存器检查
2. 操作数大小前缀

通过添加66h前缀,可以强制使用 16 位操作数:

66h JE short target ; 强制使用16位操作数(现代编译器自动处理)

兼容性注意

  • 在 64 位模式下,默认使用 32 位操作数,除非显式指定 64 位操作数(REX 前缀)。

五、总结与实用技巧

  1. 记忆技巧

    • 无符号数比较用A/B(Above/Below),有符号数比较用G/L(Greater/Less)。
    • E的指令表示 “或等于”(如 JAE=Above or Equal)。
  2. 常见错误

    • 混淆无符号数和有符号数比较指令(如误用 JA 代替 JG)。
    • 跳转前未执行影响标志位的指令(如 CMP、TEST)。
  3. 调试建议

    • 使用调试器观察 FLAGS 寄存器的值,验证条件跳转的触发逻辑。
    • 注意区分 ZF 和 CF 在不同比较场景下的含义。

掌握这些条件跳转指令后,你可以编写出高效、复杂的汇编程序逻辑。下次我们将探讨子程序调用与栈帧管理,进一步深入底层编程!

如果有任何疑问,欢迎留言讨论! 😊

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/908278.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FPGA点亮ILI9488驱动的SPI+RGB接口LCD显示屏(一)

FPGA点亮ILI9488驱动的SPIRGB接口LCD显示屏 ILI9488 RGB接口初始化 目录 前言 一、ILI9488简介 二、3线SPI接口简介 三、配置寄存器介绍 四、手册和初始化verilog FPGA代码 总结 前言 ILI9488是一款广泛应用于嵌入式系统和电子设备的彩色TFT LCD显示控制器芯片。本文将介…

Git忽略规则.gitignore不生效解决

我在gitlab中新建了一个项目仓库&#xff0c;先把项目文件目录绑定到仓库&#xff0c;并全部文件都上传到了仓库中。 然后又从别的项目复制了忽略文件配置过来&#xff0c;怎么搞他都不能生效忽略我不要提交仓库的文件。 从网上查到说在本地仓库目录中&#xff0c;打开命…

记一个判决书查询API接口的开发文档

一、引言 在企业风控、背景调查、尽职调查等场景中&#xff0c;判决书查询是一个非常重要的环节。通过判决书查询&#xff0c;可以了解个人或企业的司法涉诉情况&#xff0c;为风险评估提供数据支持。本文将详细介绍如何开发和使用一个司法涉诉查询API接口&#xff0c;包括客户…

mac版excel如何制作时长版环形图

设置辅助列 创建簇状柱形图 将辅助列绘制在次坐标轴 工作时长在主坐标轴&#xff0c;右键分别更改图表类型为圆环。 辅助列圆环全部为灰色&#xff0c;边框为白色 辅助列设置透明度100% 设置辅助列和工作时长列同样的圆环大小 可得 核心&#xff1a;只要辅助列边框不透明…

贪心算法应用:埃及分数问题详解

贪心算法与埃及分数问题详解 埃及分数&#xff08;Egyptian Fractions&#xff09;问题是数论中的经典问题&#xff0c;要求将一个真分数表示为互不相同的单位分数之和。本文将用2万字全面解析贪心算法在埃及分数问题中的应用&#xff0c;涵盖数学原理、算法设计、Java实现、优…

量化面试绿皮书:1. 海盗分金博弈

文中内容仅限技术学习与代码实践参考&#xff0c;市场存在不确定性&#xff0c;技术分析需谨慎验证&#xff0c;不构成任何投资建议。 1. 海盗分金博弈 五个海盗抢走了一个装满 100 枚金币的箱子。作为一群民主的海盗&#xff0c;他们同意以下分配战利品的方法:最资深的海盗将…

购物商城网站 Java+Vue.js+SpringBoot,包括商家管理、商品分类管理、商品管理、在线客服管理、购物订单模块

购物商城网站 JavaVue.jsSpringBoot&#xff0c;包括商家管理、商品分类管理、商品管理、在线客服管理、购物订单模块 百度云盘链接&#xff1a;https://pan.baidu.com/s/10W0kpwswDSmtbqYFsQmm5w 密码&#xff1a;68jy 摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在…

用mediamtx搭建简易rtmp,rtsp视频服务器

简述&#xff1a; 平常测试的时候搭建rtmp服务器很麻烦&#xff0c;这个mediamtx服务器&#xff0c;只要下载就能运行&#xff0c;不用安装、编译、配置等&#xff0c;简单易用、ffmpeg推流、vlc拉流 基础环境&#xff1a; vmware17&#xff0c;centos10 64位&#xff0c;wi…

Java 高频面试题场景(二):老年健康手环数据管理系统

系列文章 序号文章名称1Java 高频面试题场景(一):社区智能充电桩管理系统2Java 高频面试题场景(二):老年健康手环数据管理系统文章目录 系列文章一、项目信息项目介绍技术栈主要工作二、面试题及回答1. **面试官问**:在这个老年健康手环数据管理系统项目中,为什么要用R…

Python爬虫爬取天猫商品数据,详细教程【Python经典实战项目】

Python爬取天猫商品数据详细教程 一、前期准备 1. 环境配置 Python环境&#xff1a;确保已安装Python 3.x版本&#xff0c;建议使用Anaconda或直接从Python官网下载安装。第三方库&#xff1a; requests&#xff1a;用于发送HTTP请求。BeautifulSoup&#xff1a;用于解析HTM…

Symbol as Points: Panoptic Symbol Spotting via Point-based Representation

文章目录 AbstractIntroductionRelated WorkVector Graphics RecognitionPanoptic Symbol SpottingPoint Cloud Segmentation MethodFrom Symbol to PointsPrimitive positionPrimitive feature Panoptic Symbol Spotting via Point-based RepresentationBackboneSymbol Spotti…

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一&#xff1a;使用Read()读取文件2.3、方式二&#xff1a;bufio读取文件2.4、方式三&#xff1a;os.ReadFile读取2.5、写…

[闭源saas选项]Pinecone:为向量数据库而生的实时语义搜索引擎

目录 Pinecone&#xff1a;为向量数据库而生的实时语义搜索引擎 一、什么是 Pinecone&#xff1f; 二、Pinecone 是开源的吗&#xff1f;支持私有化部署吗&#xff1f; 三、为什么需要向量搜索&#xff1f; 四、Pinecone 的核心优势 五、使用 Pinecone 的典型流程 六、在…

【Maniskill】使用Ppo的官方基线训练时出现指标突然“塌陷”的现象

1. 问题描述 1.1 在使用官方代码进行训练的时候“success_once突然掉落到0” 简要说明你在使用官方 examples/baselines/ppo/baselines.sh 脚本训练 PickCube-v1 时&#xff0c;在 early stage&#xff08;如前 50 k 步&#xff09;指标正常、success_once 接近 1&#xff0c;…

本地部署大模型实战:使用AIStarter一键安装Ollama+OpenWeb教程(含最新版本更新指南)

大家好&#xff01;今天给大家带来一个本地部署大模型的详细教程 &#xff0c;主要介绍如何通过 AIStarter 4.0 一键部署 Ollama OpenWeb 的完整流程。如果你还在为在线大模型不稳定、隐私泄露等问题烦恼&#xff0c;那么本地部署 将是一个非常不错的选择&#xff01; 首先&am…

Redis大量key集中过期怎么办

当 Redis 中存在大量 key 在同一时间点集中过期时&#xff0c;可能会导致以下问题&#xff1a; 请求延迟增加&#xff1a;Redis 在处理过期 key 时需要消耗 CPU 资源&#xff0c;如果过期 key 数量庞大&#xff0c;会导致 Redis 实例的 CPU 占用率升高&#xff0c;进而影响其他…

【Linux 学习计划】-- 系统中进程是如何调度的(内核进程调度队列)

目录 回顾进程优先级与进程调度的引入 内核runqueue图例 关于queue[140]前100个位置 | 实时进程与分时进程 遍历需要调度的进程与bitmap的引入 active、expired指针 结语 回顾进程优先级与进程调度的引入 在我们之前的学习中&#xff0c;我们是有学习过进程优先级这个概…

【Spring AI 1.0.0】Spring AI 1.0.0框架快速入门(1)——Chat Client API

Spring AI框架快速入门 一、前言二、前期准备2.1 运行环境2.2 maven配置2.3 api-key申请 三、Chat Client API3.1 导入pom依赖3.2 配置application.properties文件3.3 创建 ChatClient3.3.1 使用自动配置的 ChatClient.Builder3.3.2 使用多个聊天模型 3.4 ChatClient请求3.5 Ch…

微信小程序开发一个自定义组件的详细教程

以下是一个微信小程序自定义组件的详细教程&#xff0c;覆盖开发文档中的核心知识点。我们将以一个包含属性、事件、插槽、生命周期等功能的按钮组件为例进行说明&#xff1a; 一、创建组件 在 components 目录下新建 custom-button 文件夹&#xff0c;包含以下文件&#xff…

模电——第四讲场效应管

定义&#xff1a;具有正向受控作用的半导体器件 分类&#xff1a;MOS&#xff08;绝缘栅&#xff09;场效应管和结性场效应管 区别&#xff1a;场效应管相比于晶体管&#xff0c;输入电阻很大&#xff0c;是单极型器件 MOS场效应管&#xff1a; 特性曲线 利用半导体表面的电…