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
繁體地址,請注明出處:http://hk.pswp.cn/news/908278.shtml
英文地址,請注明出處:http://en.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; 特性曲線 利用半導體表面的電…