第二十课_JCC汇编指令

2024-02-13 00:30
文章标签 指令 第二十 汇编 jcc

本文主要是介绍第二十课_JCC汇编指令,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

写到这篇文章真不容易了,连续好几篇汇编语言的文章,都是些基础的东西,写起来难受,虽然本id是软工的,但是汇编只能说是自学来的,很多东西都是半调子,写起来吃力些是正常的。今天这文章可能是最后一篇单纯写汇编指令的文章了,(以后肯定要扯到汇编,但是不会像这几篇文章那样单纯只写汇编指令怎么用)。

今天讲JCC指令(条件跳转指令),这个也是相当重要,学了这个,C语言中的ifelseswitch等语句就能很好理解其底层的实现了。会涉及到前面讲的数据宽度、有符号无符号、标志寄存器等知识。

在正式说JCC前,先说几个汇编指令,这样有助于理解JCC

CMP指令

指令格式:CMP r/m,r/m/imm

说明:CMP指令是比较两个数。本质上,它相当于sub指令,但是它不把相减的结果保存到第一个操作数中。只是根据相减的结果来改变零标志位(ZF),即两操作数相等的时候,零标志位为1.

测试:

sub eax,eax

执行前的eax中的值,和标志寄存器中的值,为了让大家更好地看出运行的结果,双击ZF位,修改为0.

相减后,标志寄存器中是这样的。

cmp eax,eax

用mov指令修改eax中的值,当然也可以双击eax中的值,在弹出的对话框中修改eax中的值。

然后执行cmp指令,标志寄存器中是这样的,对比sub指令,发现它们改变的位是一样的。

TEST指令

指令格式:TEST r/m,r/m/imm

说明:该指令跟CMP指令相似,运算结果只改变相应的标志寄存器的位,不把值保存到第一个操作数中。不过TEST指令的运算是“与”操作。TEST指令通常用于确定某个寄存器是否等于0。例如:test ecxecx。指令这条指令只有ecx中的值为0时,标志寄存器ZF位才能为0,因为两个相同的数时行与运算,只有这两个数都为0时,结果才为0.

 

通过上面两个指令的接触,我们可以认识到,在汇编中,有些指令可以进行一些运算,运算的结果只改变标志寄存器,但是没有保存运算的结果。而JCC就是根据标志寄存器进行跳转的,JCC只认知标志寄存器。

JCC有很多指令,格式是:指令名 跳转的地址。下面是逐个进行讲解,文末也有一个整理的图。

JCC指令

1、JEJZ指令

说明:JE(jump if zero)、JZ(jump if equal),从英文中也可以看出,这两个指令在运行的结果为零(相等)时,就跳转到指令后面的地址。这两个指令,只看ZF位,如果ZF位为1,就进行跳转。

测试:

在OD中只认识JE,你输入JZOD会自动转成JE的,说明在OD眼中,它俩就是一个东西。先测试ZF位是0时,看程序是否进行了跳转。我们在跳转到的地址处下一个断点,然后修改ZF位为0.

运行的结果如下图,可以看到当ZF位为0时,不进行跳转。

修改ZF位为1.

运行的结果如下图,可以看到:当ZF位为1时,程序进行了跳转。

下面的指令就不一一进行测试演示了。

2、JNEJNZ指令

JNE(jump if not equal)、JNZ(jump if not zero),结果不为0时跳转,即ZF = 0时跳转。

3、JS指令

JS(jump if sign),结果为负数时跳转,即SF = 1时跳转。

4、JNS指令

JNS(jump if not sign),结果不为负数时跳转,即SF = 0时跳转。

5、JPJPE指令

JP(jump if Parity )、JPE(jump if Parity Even),结果中1的个数为偶数时跳转,即PF = 1时跳转。

6、JNPJPO指令

JNP(jump if not parity)、JPO(jump if not parity odd),结果中1的个数不为偶数时跳转,即PF = 0时跳转。

7、JO指令

JO(jump if overflow),结果溢出时跳转,即OF = 1时跳转。

8、JNO指令

JNO(jump if not overflow),结果没有溢出时跳转,即OF = 0时跳转。

9、JBJNAE指令

JB(jump if below),JNAE(jump if not above equal),无符号(再次说明:到底是有符号,还是无符号,是程序员说了算,计算机根本不管你是有符号还是无符号)中,小于则跳转,即CF = 1时跳转。如果对逻辑不是很清晰的,很容易搞混这些大于小于的问题,不过慢慢想总能想明白的。

10、JNBJAE指令

JNB(jump if not below),JAE(jump if above equal),无符号数中,大于等于时跳转,即CF = 0时跳转。

11、JBEJNA指令

JBE(jump if below equal),JNA(jump if not above),无符号数中,小于等于时则跳转,即CF = 1 or ZF = 1时跳转。

12、JNBEJA指令

JNBE(jump if not below equal),JA(jump if above),无符号数中,大于则跳转,即CF = 0 and ZF = 0时跳转。

13、JLJNGE指令

JL(jump if less),JNGE(jump if not greater equal ),有符号数中,小于则跳转,即SF = OF时跳转。

14、JNLJGE指令

JNL(jump if not less),JGE(jump if not greater equal).有符号数中,大于等于时跳转,即SF = OF

15、JLEJNG指令

JLE(jump if less equal),JNG(jump if not greater),有符号数中,小于等于跳转,ZF = 1 or SF = OF

16、JNLEJG指令

JNLE(jump if not less equal),JG(jump if greater),有符号数中,大于时跳转,即ZF = 0 and SF = OF时跳转。

 

不能理解的,记住也行,不写了,要睡觉了,期待早上起来能收到快递。

写于2020.6.21 0:46

这篇关于第二十课_JCC汇编指令的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

工作常用指令与快捷键

Git提交代码 git fetch  git add .  git commit -m “desc”  git pull  git push Git查看当前分支 git symbolic-ref --short -q HEAD Git创建新的分支并切换 git checkout -b XXXXXXXXXXXXXX git push origin XXXXXXXXXXXXXX

笔记整理—内核!启动!—kernel部分(2)从汇编阶段到start_kernel

kernel起始与ENTRY(stext),和uboot一样,都是从汇编阶段开始的,因为对于kernel而言,还没进行栈的维护,所以无法使用c语言。_HEAD定义了后面代码属于段名为.head .text的段。         内核起始部分代码被解压代码调用,前面关于uboot的文章中有提到过(eg:zImage)。uboot启动是无条件的,只要代码的位置对,上电就工作,kern

Android中如何实现adb向应用发送特定指令并接收返回

1 ADB发送命令给应用 1.1 发送自定义广播给系统或应用 adb shell am broadcast 是 Android Debug Bridge (ADB) 中用于向 Android 系统发送广播的命令。通过这个命令,开发者可以发送自定义广播给系统或应用,触发应用中的广播接收器(BroadcastReceiver)。广播机制是 Android 的一种组件通信方式,应用可以监听广播来执行

mysql中导入txt文件数据的操作指令

1 表tt的格式:    CREATE TABLE `tt` (   `ind` int NOT NULL auto_increment,   `name` char(100) default NULL,   PRIMARY KEY  (`ind`)  )   2 文件d.txt的内容示例:  1,a  2,b  3,c

可选择的反思指令微调

论文:https://arxiv.org/pdf/2402.10110代码:GitHub - tianyi-lab/Reflection_Tuning: [ACL'24] Selective Reflection-Tuning: Student-Selected Data Recycling for LLM Instruction-Tuning机构:马里兰大学, Adobe Research领

驱动安装注册表指令

HKCR: HKEY_CLASSES_ROOT HKCU: HKEY_CURRENT_USER HKLM: HKEY_LOCAL_MACHINE HKU: HEKY_USER HER: 相对根键

汇编:嵌入式软件架构学习资源

成为嵌入式软件架构设计师需要掌握多方面的知识,包括嵌入式系统、实时操作系统、硬件接口、软件设计模式等。 以下是一些推荐的博客和网站,可以帮助你深入学习嵌入式软件架构设计: ### 1. **Embedded.com**    - **网址**: [Embedded.com](https://www.embedded.com/)    - **简介**: 这是一个专注于嵌入式系统设计的专业网

4G模块、WIFI模块、NBIOT模块通过AT指令连接华为云物联网服务器(MQTT协议)

MQTT协议概述 MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,它被设计用来提供一对多的消息分发和应用之间的通讯,尤其适用于远程位置的设备和高延迟或低带宽的网络。MQTT协议基于客户端-服务器架构,客户端可以订阅任意数量的主题,并可以发布消息到这些主题。服务器(通常称为MQTT Broker)则负责接受来自客户端的连接请求,并转发消

matlab一些基本重要的指令

重点内容 运行MATLAB的帮助demo,在Command Window 输入 “demo”,或在Launch Pad 选项卡“demos” 任何时候都可以: 清除Command Window内容:clc 清除Figure Window(图形窗口) clf 清除workspace 变量内容: clear 注意:M脚本文件和输入指令中的变量都在workspace中,为避免变量冲突,一般在