JCC指令(详细版)

2024-02-13 00:30
文章标签 指令 详细 jcc

本文主要是介绍JCC指令(详细版),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

前言

一、JCC是什么?

二、常见指令

1.文字版说明

2.flage寄存器

总结



前言

JCC(Jump if Condition is met)是x86汇编语言中的一类条件跳转指令,用于根据特定条件来执行跳转操作。

JCC指令根据不同的条件码标志位的状态来判断是否满足条件,如果满足条件,则跳转到指定的目标地址;如果不满足条件,则继续顺序执行下一条指令。

一、JCC是什么?

在汇编语言中,JCC是一个条件跳转指令。JCC的全称是Jump if Condition is met。
JCC实际上是一类指令的通用名称,其中 "CC" 是 "Condition Code" 的缩写,代表不同的条件。例如,JE(Jump if Equal,如果相等则跳转)、JNE(Jump if Not Equal,如果不相等则跳转)、JG(Jump if Greater,如果大于则跳转)等都是这类指令。
这些指令通常用于程序流控制,如循环、条件语句等。具体的跳转目标由指令后的标签或地址决定。

二、常见指令

1.文字版说明


- JZ / JE:如果零标志位(ZF)为1,则跳转。通常用于判断上一条指令的结果是否为零。
- JNZ / JNE:如果零标志位(ZF)为0,则跳转。通常用于判断上一条指令的结果是否不为零。
- JC / JB / JNAE:如果进位标志位(CF)为1,则跳转。通常用于无符号数的比较操作。
- JNC / JNB / JAE:如果进位标志位(CF)为0,则跳转。通常用于无符号数的比较操作。
- JL / JNGE:如果符号标志位(SF)与溢出标志位(OF)不相等,则跳转。通常用于有符号数的比较操作。
- JNL / JGE:如果符号标志位(SF)与溢出标志位(OF)相等,则跳转。通常用于有符号数的比较操作。
- JG / JNLE:如果零标志位(ZF)为0,且符号标志位(SF)与溢出标志位(OF)相等,则跳转。通常用于有符号数的比较操作。
- JNG / JLE:如果零标志位(ZF)为1,或者符号标志位(SF)与溢出标志位(OF)不相等,则跳转。通常用于有符号数的比较操作。
这些是一些常见的JCC指令及其条件,实际上x86汇编语言中还有更多的JCC指令和条件,用于满足不同的条件跳转需求。在实际编程中,根据具体的条件判断逻辑,选择适当的JCC指令来实现条件跳转。

2.flage寄存器

三、上面整体了解一下,接下来开始深入讲解:

汇编-JCC

之前可以修改EIP寄存器的指令
JMP,CALL,RETN

所有JCC指令的动作->根据标志寄存器修改EIP的值

标志寄存器 EFLAGS

1.CF(bit 0)[Carry flag] C位

若算术产生的结果在最高有效位(most-significant bit)发生进位或者借位则将其置1 反之清零

这个标志通常用来指示无符号证书运算的溢出状态

宽度溢出位。只要容器内放不下就会发生变化

MOV AL,0xFE
ADD AL,2 C => 1MOV AL,0x7F
SBU AL,0xFF C => 1

PF (bit 2) [parity flag] P位 奇偶校验位

如果结果的最低有效字节 最后一个字节(least-significant byte)包含偶数个1位则该位置1,否则清零

利用PF可进行奇偶校验检查

需要传输1100 1110,数据中含5个1,所以其奇校验位位0,同时吧1100 1110传输给接收方,
接收方收到数据后再一次计算奇偶性,1100 1110中仍然含有5个1,所以接收方计算出的奇偶验位还是0,与发送方一致,表示在此次传输过程中未发生错误。

MOV AL,0xCE

AF (bit 4)[Auxiliary Carry Flag] 辅助进位标志器

如果算术操作在结果的第三位发生进位或者借位则该标志置1,否则清零

这个标志在BCD(binary-code decimal) 算术运算中被使用

ZF(bit 5)[Zero Flag] 用的最多 划重点。。

若结果为0则将其置1,反之清零。
经常与CMP或者TEST等指令一起使用

例1: 判断2个值是否相等

MOV EAX,100
MOV ECX,100
CMP EAX,ECX

(CMP指令相当于SUB指令,但是相减的结果并不保存到第一个操作数中 只影响标志寄存器)

例2:判断某个值是否为0

AND EAX,EAX 0 ZF=1TEST EAX,EAX

(TEST相当于and,但是与运算的结果并不保存到第一个操作数中 只影响标志寄存器)

SF(bit 7) [Sign Flag]

该标志被设置为有符号整型的最高有效位
(0指示结果为正,反之则为负)
意思其实就是,运算完之后看下符号位 是0(正)还是1(负)

当然如果是无符号数运算就不用看了

只看容器内数字的最高位

MOV AL,0x7F MOV AL,0xFE
ADD AL,2 ADD AL,2

OF(bit 11)[OverFlow Flag]

溢出标志OF用于反应有符号数加减运算所得结果是否溢出
可以这样理解:
* 如果是无符号数运算,是否溢出看CF位
* 如果是有符号数运算,是否溢出看OF位
两个数做运算,运算完毕的结果跟运算前的数的最高位相同 OF为0
最高位不同 为1

MOV AL,0x7F
ADD AL,2

DF(bit 10)[Diretion Flag]

这个方向标志控制字符串指令(`MOVS`,CMPS,SCAS,LODS以及`STOS`)。设置DF标志是的串指令自动递减(从高地址向低地址方向处理字符串),清楚该标志则是的串指令自动递增

STD以及CLD指令分别用户设置以及清除DF标志

总结

1. JMP指令:

唯一作用是无条件修改EIP的值,没有对栈和寄存器产生影响。

JMP 寄存器/立即数
本质是MOV EIP,寄存器/立即数,EIP只能由JMP指令修改

2. CALL指令:

第一个作用和JMP一样,MOV EIP,寄存器/立即数。
第二个作用,把CALL指令的写一个指令地址push到栈顶(修改ESP)
CALL指令还没执行,怎么知道下一行指令的地址?
根据CALL指令占用的数据宽度,加偏移量去算,比如CALL这条指令,地址0X004183D7中数据为E8 21 00 00 00,有5个字节,下一行指令的地址就是地址偏移5

3.RET

本质是POP EIP
RET指令通常和CALL成对出现,把CALL压栈的地址POP EIP,让程序回归原来的流程

4. CMP指令:该指令是比较两个操作数是否相同

指令格式:CMP R/M,R/M/IMM
相当于SUB指令,但是只会用两个数相减来比较是否相同,相减的结果并不保存在第一个操作数中。
只会根据相减的结果来改变标志位的,当两个操作数相等的时候,零标志位置为1.
MOV EAX,100
MOV ECX,100
CMP EAX,ECX  //只相减比较,判断并修改零标志寄存器,不会把EAX修改为相减结果。
CMP AX,WORD PTR DS:[405000]
CMP AL,BYTE PTR DS:[405000]
CMP EAX,DWORD PTR DS:[405000]

4. TEST指令:

指令格式:TEST R/M,R/M/IMM
该指令和CMP有一定的相似性,两个数值进行与操作,结果也不保存,但是会改变相应标志位。
与操作:1 and 1 =1;1 and 0 = 0; 0 and 1 = 0; 0 and 0 = 0
常见用法:用这个指令,可以确定某寄存器是否等于0,如果EAX的二进制某些位为 1 的话,那么运算的结果就不为零。

这篇关于JCC指令(详细版)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/704015

相关文章

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

Java实现远程执行Shell指令

《Java实现远程执行Shell指令》文章介绍使用JSch在SpringBoot项目中实现远程Shell操作,涵盖环境配置、依赖引入及工具类编写,详解分号和双与号执行多指令的区别... 目录软硬件环境说明编写执行Shell指令的工具类总结jsch(Java Secure Channel)是SSH2的一个纯J

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

基于C#实现PDF转图片的详细教程

《基于C#实现PDF转图片的详细教程》在数字化办公场景中,PDF文件的可视化处理需求日益增长,本文将围绕Spire.PDFfor.NET这一工具,详解如何通过C#将PDF转换为JPG、PNG等主流图片... 目录引言一、组件部署二、快速入门:PDF 转图片的核心 C# 代码三、分辨率设置 - 清晰度的决定因

Java中HashMap的用法详细介绍

《Java中HashMap的用法详细介绍》JavaHashMap是一种高效的数据结构,用于存储键值对,它是基于哈希表实现的,提供快速的插入、删除和查找操作,:本文主要介绍Java中HashMap... 目录一.HashMap1.基本概念2.底层数据结构:3.HashCode和equals方法为什么重写Has

Java使用正则提取字符串中的内容的详细步骤

《Java使用正则提取字符串中的内容的详细步骤》:本文主要介绍Java中使用正则表达式提取字符串内容的方法,通过Pattern和Matcher类实现,涵盖编译正则、查找匹配、分组捕获、数字与邮箱提... 目录1. 基础流程2. 关键方法说明3. 常见场景示例场景1:提取所有数字场景2:提取邮箱地址4. 高级

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

《Springboot项目构建时各种依赖详细介绍与依赖关系说明详解》SpringBoot通过spring-boot-dependencies统一依赖版本管理,spring-boot-starter-w... 目录一、spring-boot-dependencies1.简介2. 内容概览3.核心内容结构4.

MySQL中优化CPU使用的详细指南

《MySQL中优化CPU使用的详细指南》优化MySQL的CPU使用可以显著提高数据库的性能和响应时间,本文为大家整理了一些优化CPU使用的方法,大家可以根据需要进行选择... 目录一、优化查询和索引1.1 优化查询语句1.2 创建和优化索引1.3 避免全表扫描二、调整mysql配置参数2.1 调整线程数2.