匯編學習之《jcc指令》

JCC(Jump on Condition Code)指的是條件跳轉指令,c++中的就是if-else, while, for 等分支循環條件判斷的邏輯。它包括很多指令集,各自都不太一樣,接下來我盡量將每一個指令的c++ 源碼和匯編代碼結合起來看,加深學習映像。

學習這章之前還是要了解 EFL 標記寄存器的知識:?匯編學習之《標志寄存器》-CSDN博客

以上標志寄存器部分重點看下? CF,ZF,SF,OF,PF.

理解下面的意思:

cmp x,y?

x -y ==> 影響 CF, ZF 標記位??

情況1? x == y , 計算結果是0, 那么 ZF == 1

情況2? x > y,? 計算結果不是0,那么 ZF == 0

情況3 x <? y , 計算結果不是0,但是會發生錯位,所以? ZF != 0? and??CF ==? 1

JE/JZ (ZF ==1? )

測試:cmp + je? ==> c++ !=? 運算

je: jump if equal? ?

je: jump if zero

判斷 ZF ==1 (cmp 計算的結果是0,兩個值相等情況)

je 和 jz 在OD上是一樣的, 你可以嘗試輸入jz,但是OD會將其替換成JE

匯編代碼

mov DWORD PTR [ebp-0xc], 0x1
mov DWORD PTR [ebp-0x10],0x2
mov eax,DWORD PTR [ebp-0xc]
cmp eax,DWORD PTR [ebp-0x10]?
je 0x401661 <main()+81>???//變量1 == 變量2則跳轉走,c++代碼就必須是 變量1 != 變量2

我們解釋下上面匯編的代碼

第一行: 分配了一個變量地址是ebp-0xc,并賦值是1

第二行: 分配了一個變量地址是ebp-0x10,并賦值是2.

第三行: 將第一個地址的值賦值給EAX 累計寄存器

第四行:?EAX累計寄存器的值(也就是第一個變量的值)減去第二個變量的值。如果為0,則EFL的ZF標記就會被設置成1,否則為0

第五行: 判斷ZF標記是否是1,如果是則調整到main函數的0x401661位置,準備清理資源退出。

c++ 代碼

這里可以對照這個c++代碼

#include <iostream>

int main() {

? ? // JE / ZF 比較相等

? ? int a = 1;? //mov DWORD PTR [ebp-0xc], 0x1

? ? int b = 2; //mov DWORD PTR [ebp-0x10],0x2

? ? //mov eax,DWORD PTR [ebp-0xc]
? ? //cmp eax,DWORD PTR [ebp-0x10]

? ? //je 0x401661 <main()+81>

? ? if(a != b)?{

? ? ? ? std::cout << "a == b" << std::endl;

? ? }

? ? return 0;

}

上面的例子我們先看了匯編語言,?大家應該會發現一個問題, 匯編中跳轉的地方指令是je, 也就是比較的兩個對象相等(cmp 指令結果是0, zf==1)情況就跳轉走了。

JNE/JNZ (ZF == 0? 使用c++ ==)

測試:cmp + jne/jnz => c++? ==? 運算

jne: jump if not equal

jnz: jump is not zero

就是判斷 ZF == 0?

jne/jnz 是滿足zf ==0就跳轉,也就是cmp運算結果不是0,也就是兩個變量是一定不相等(a? != b)就會跳轉, c++分支想執行就必須是和a !=0? 條件相反, 那么c++ 代碼就必須變成 a == 0

修改后c++ 代碼

對應的匯編代碼:

可以將JE/JZ 例子中的c++代碼改成a == b 就可以看到了。

JB/JNAE/JC (CF == 1 )

測試:cmp + JB/JNAE/JC? ==>? c++? >=? 運算

jb: jump if below? (無符號比較 低于)

jnae: jump not above or equal?

jc: jump if is carry

判斷 CF == 1

同以上匯編反向推導c++代碼:

第一步: 定義一個變量,賦值為2, 我們定義變量名稱為a

第二步: 定義一個變量, 賦值為1? ?我們定義變量名稱為b

第三步: 比較兩個變量

但是怎么寫呢? 我先看看 匯編指令是jb ,按照這個跳轉指令的的規則,它是判斷CF ==1。如果發生了進位或則錯位, CF == 1那么就滿足條件,就跳轉到mian函數401661的地址處。

要滿足這個要求,就必須是變量a小于變量b(a < b),這樣減法cmp計算才會發生借位。c++代碼這里也就是一個判斷條件,返回過來它是不希望跳轉走,是希望順序執行的,那么c++代碼就必須和剛剛匯編跳轉指令相反,也就是a < b相反, 那么就是 a >= b?

以下是c+代碼

JNB / JAE / JNC (CF == 0)

測試:cmp + JNB / JAE / JNC == > c++? <? 運算

jnb: jump if not below

jae: jump if above or equal

jnc: jump if not carry

判斷 CF == 0

這就簡單思考下,我c++代碼要怎么改,才能驗證 JNB/JAE的指令呢?

首先CF == 0,? 說明 cmp 指令沒有發生借位,也就是 a >= b 這種情況,那么就會跳轉執行,我們c++代碼要執行分支內的代碼,就是不希望跳轉走,所以就必須相反, 那么就是和 a >=? b條件相反,也就是a < b, 那么我改動代碼驗證下,看看c++代碼條件比較語句變成a <? b后, 匯編指令是否是??JNB / JAE / JNC.

改動的c++ 代碼

匯編代碼確認

以上符合預期

JBE / JNA (CF == 1 or ZF == 1 )

測試:cmp + jbe/jna ==> c++ > 運算

jbe: jump if above or equal? ?<=??

jna: jump if not above? ?不大于

判斷??CF == 1 or ZF == 1

匯編運算

c++ 代碼

JA / JNBE (CF == 0 and ZF == 0)

測試:cmp + ja/jnbe ==> c++ <= 運算

ja:? jump if above? ? >

jnbe: jump if not below or??equal? ?不小于不等于

判斷 CF == 0 and ZF == 0

匯編代碼:

c++代碼:

JL / JNGE (SF ≠ OF)

jl: jump if less

jnge: jump if not greater or equal

sf: 當前計算語句是負數,sf =1

of: 當前計算語句發生了溢出? of =1

判斷 SF ≠ OF??不同情況分析:

情況1?sf == 1 and? of ==0

SF == 1 計算結果為負數, OF == 0 沒有發生溢出

a = -5, b = 3

a - 3 = -8? sf =1? of=0, 但是沒有發生溢出。

c++ 代碼

這里按照上面我們的理解, 匯編要滿足小于就跳轉走,那c++ 代碼要反著寫,變成 >=

對應的匯編

情況2: sf == 0? and of == 1

sf == 0 計算結果不是負數, 但是 of ==1 意思是發生了溢出

在看下面代碼前,思考下,什么情況下 cmp 減法操作計算結果不是負數,但是發生了溢出?

以32為舉例: 32位有符號的整數表示的數據返回是-2147483648--2147483647

a =?-2147483648,? b = 1

a - b =?2147483647 //負溢出了 但是計算結果是正數

所以: sf == 0? and of == 1

c++代碼:

對應匯編:

JNL / JGE (SF = OF)

jl: jump if not less

jnge: jump if greater and equal

sf: 當前計算語句是負數,sf =1

of: 當前計算語句發生了溢出? of =1

判斷??SF = OF

情況1 結果是負數,并且發生溢出

a = 5, b = 6?

cmp a,b? ==> sf =1, of =1?

c++ 代碼

匯編代碼:

情況2: 計算結果不是負數,且沒有發生溢出。

JLE / JNG ( SF ≠ OF? ?or? ?ZF == 1)

jle: jump if less or equal

jng: jump if not greater

判斷? (SF ≠ OF)? ? or? ?ZF == 1

情況1?sf == 1 and? of ==0

SF == 1 計算結果為負數, OF == 0 沒有發生溢出

a = -5, b = 3

a - 3 = -8? sf =1? of=0, 但是沒有發生溢出。

c++ 代碼

匯編

情況2 ZF == 1

c++

匯編:

JG / JNLE (?SF == OF?and ZF == 0)

jg: jump if greater

jnle: jump if not less or equal

判斷?(SF == OF) and ZF == 0

?計算結果是負數, 并且發生溢出

a =?2147483647? ?b = -1

cmp a,b

匯編:

JO (OF = =1)

jo: jump if overflow

判斷 OF = =1

溢出情況比較好驗證,但是反推c++ 代碼我還沒有實現,后面生深入了后在來補充。

JNO (OF == 0)

jo: jump if not overflow

判斷 OF == 0

反推c++ 代碼我還沒有實現,后面生深入了后在來補充。

JS (SF == 1)

js: jump if sign

判斷 SF == 1

反推c++ 代碼我還沒有實現,后面生深入了后在來補充。

JNS (SF == 0)

jns: jump if not sign

判斷 SF == 0

反推c++ 代碼我還沒有實現,后面生深入了后在來補充。

JP / JPE (PF ==1)

jp: jump if parity (奇偶校驗事件)

jpe: jump if parity Event (奇偶校驗事件)

判斷? PF ==1 表示數據里面的二進制數,1的個數是偶數的情況

JNP / JPO (?PF == 0)

jnp: jump if not parity

jpo: jump if pariry odd (奇數)

判斷? ?PF == 0 表示數據里面的二進制數, 1的個數是奇數

上一篇:?匯編學習之《jmp, nop指令》

下一篇:匯編學習之《call, return指令》

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/75412.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/75412.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/75412.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深度解析算法之滑動窗口

12滑動窗口—將 x 減到 0 的最小操作數 題目傳送門 題目描述&#xff1a; 給你一個整數數組 nums 和一個整數 x 。每一次操作時&#xff0c;你應當移除數組 nums 最左邊或最右邊的元素&#xff0c;然后從 x 中減去該元素的值。請注意&#xff0c;需要 修改 數組以供接下來的操…

[MySQL初階]MySQL表的操作

MySQL表的操作 1. 創建表2. 查看表結構3. 修改表&#xff08;修改表的屬性而非表的數據&#xff09;4. 刪除表 1. 創建表 語法&#xff1a; CREATE TABLE table_name (field1 datatype,field2 datatype,field3 datatype ) character set 字符集 collate 校驗規則 engine 存儲…

sqlalchemy詳細介紹以及使用方法

SQLAlchemy是一個Python的ORM&#xff08;對象關系映射&#xff09;工具&#xff0c;它允許開發者使用Python代碼來操作數據庫而不必直接編寫SQL語句。SQLAlchemy提供了一種抽象層&#xff0c;使開發者可以通過簡單的Python對象來表示數據庫表和記錄&#xff0c;從而實現對數據…

圖解AUTOSAR_SWS_LINDriver

AUTOSAR LIN驅動詳解文檔 基于AUTOSAR標準的本地互聯網絡(LIN)驅動程序技術規范解析 目錄 1. 概述 1.1 AUTOSAR LIN驅動簡介1.2 LIN協議基礎2. LIN驅動架構 2.1 類圖結構2.2 狀態機設計3. LIN幀結構 3.1 基本幀組成3.2 PID結構4. LIN驅動配置 4.1 主要配置參數4.2 配置結構5. L…

《網絡管理》實踐環節03:snmp服務器上對網絡設備和服務器進行初步監控

蘭生幽谷&#xff0c;不為莫服而不芳&#xff1b; 君子行義&#xff0c;不為莫知而止休。 應用拓撲圖 3.0準備工作 所有Linux服務器上&#xff08;服務器和Agent端&#xff09;安裝下列工具 yum -y install net-snmp net-snmp-utils 保證所有的HCL網絡設備和服務器相互間能…

2025年內外網文件交換系統排名分析

在時代&#xff0c;企業的日常運營離不開內外網文件的交換。然而&#xff0c;傳統的文件傳輸方式難以滿足企業對多方面的要求。以下是一些備受關注的內外網文件交換系統及其排名分析。 第一名&#xff1a;陽途內外網文件交換系統 陽途內外網文件交換系統是一款專為解決內外網…

【Centos】centos7內核升級-親測有效

相關資源 通過網盤分享的文件&#xff1a;腳本升級 鏈接: https://pan.baidu.com/s/1yrCnflT-xWhAPVQRx8_YUg?pwd52xy 提取碼: 52xy –來自百度網盤超級會員v5的分享 使用教程 將腳本文件上傳到服務器的一個目錄 執行更新命令 yum install -y linux-firmware執行腳本即可 …

Qt進階開發:QDirModel的使用

文章目錄 一、QDirModel的基本介紹二、QDirModel的基本使用2.1 在 QTreeView 中顯示文件系統2.2 在 QListView 顯示當前目錄2.3 在 QTableView 中使用 三、QDirModel的常用API1. 構造 & 目錄操作1.1 創建 QDirModel1.2 設置根目錄 2. 過濾 & 排序2.1 過濾文件類型2.2 設…

牛客 除2問題

除2&#xff01; 貪心堆 讓偶數入堆 注意點&#xff1a; 1.判斷堆是否為空再進行操作 2. 為了防止超時&#xff0c;我們采取先求和的方式&#xff0c;后面調整之后再減掉&#xff0c;可以節省一次遍歷的時間。 3.注意數據范圍&#xff0c;要用long long #include<iost…

#MySQL 語句大全(完整實用教程)

&#x1f4cc; MySQL 語句大全&#xff08;完整實用教程&#xff09; &#x1f4cc; 1. 數據庫操作 ? 創建數據庫 CREATE DATABASE mydb; -- 創建名為 mydb 的數據庫? 使用數據庫 USE mydb; -- 選擇數據庫? 刪除數據庫 DROP DATABASE mydb; -- 刪除數據庫&#xff08…

萬字重談C++——類和對象篇

什么是類&#xff1f; 在編程中&#xff0c;類是用來創建對象的模板。可以把類看作一個藍圖&#xff0c;它定義了對象的屬性&#xff08;特征&#xff09;和方法&#xff08;行為&#xff09;。例如&#xff0c;如果我們有一個“學生”的類&#xff0c;它可能包含學生的名字、…

18認識Qt坐標系

平面直角坐標系(笛卡爾坐標系) 數學上的坐標系 右手坐標系 計算機中的坐標系 左手坐標系 坐標系的原點(0,0) 就是屏幕的左上角 /窗口的左上角 給 Qt 的某個控件,設置位置,就需要指定坐標.對于這個控件來說, 坐標系原點就是相對于父窗口/控件的. QPushButton 的父元素/父控件/父…

量子計算與人工智能的結合:未來科技的雙重革命

引言 在過去幾十年里&#xff0c;人工智能&#xff08;AI&#xff09;和計算能力的提升一直是推動科技進步的重要力量。然而&#xff0c;隨著深度學習和大規模數據處理的發展&#xff0c;傳統計算架構的算力瓶頸逐漸顯現&#xff0c;人工智能的訓練和推理效率受到了限制。在此背…

SEO長尾詞優化策略精要

內容概要 長尾關鍵詞優化是SEO策略中實現精準流量捕獲的核心環節。本文從定位方法、搜索意圖分析、詞庫構建三個維度切入&#xff0c;系統闡述如何通過數據化工具篩選高轉化潛力詞&#xff0c;并結合用戶行為路徑優化內容架構。具體而言&#xff0c;內容將覆蓋關鍵詞挖掘工具的…

基于大模型的主動脈瓣病變預測及治療方案研究報告

目錄 一、引言 1.1 研究背景 1.2 研究目的 1.3 研究意義 二、大模型預測主動脈瓣病變原理 2.1 大模型介紹 2.2 數據收集與處理 2.3 模型訓練與優化 三、術前預測與評估 3.1 主動脈瓣病變類型及程度預測 3.2 患者整體狀況評估 3.3 手術風險預測 四、術中應用與監測…

進程和內存管理

目錄 一.進程的基本信息 1.1進程的定義 1.2進程的特征 1.3進程的組成 1.4線程產生的背景 1.5線程的定義 1.6進程與線程的區別 1.7進程的類別 1.8進程的優先級 1.8.1進程優先級的概念 1.8.2PRI和NI 1.9僵尸進程 1.9.1僵尸進程的定義 1.9.2僵尸進程產生的原因 1.9…

css動態設置div寬高,calc函數

在css中使用calc函數 calc() 是 CSS 中的一種函數&#xff0c;用于動態計算長度值。它允許你在 CSS 屬性中進行數學運算&#xff0c;結合不同的單位&#xff08;如 px、%、em 等&#xff09;&#xff0c;從而創建更加靈活和響應式的布局 表達式規則 運算符&#xff1a;支持加…

飛漿PaddlePaddle 貓狗數據大戰

貓狗數據大戰 1 數據集的準備以及處理操作1.1 數據集1.2 文件解壓操作&#xff08;python&#xff09; 1.3 數據的分類1.4 創建訓練集和測試集 2 網絡構建CNN版本--DeepID 人臉識別網絡結構DeepID 與 CNN 網絡結構的差異 3 深度學習模型訓練和推理的核心設置4 制圖5 訓練6 預測…

Spring Boot后端開發全攻略:核心概念與實戰指南

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家、全棧領域優質創作者、高級開發工程師、高級信息系統項目管理師、系統架構師&#xff0c;數學與應用數學專業&#xff0c;10年以上多種混合語言開發經驗&#xff0c;從事DICOM醫學影像開發領域多年&#xff0c;熟悉DICOM協議及…

PPT助手:一款集計時、遠程控制與多屏切換于一身的PPT輔助工具

PPT助手&#xff1a;一款集計時、遠程控制與多屏切換于一身的PPT輔助工具 &#x1f4dd;&#x1f3a4; 在現代化的演講和演示中&#xff0c;如何高效地控制PPT進程、保證展示的流暢性與精準性&#xff0c;成為了每個演講者必須面對的挑戰。無論是商務匯報、學術演講&#xff0…