汇编:比较跳转

news2024/12/23 11:17:54

在16位汇编语言(如x86汇编)中,比较指令用于比较两个操作数的大小,通常用于条件跳转、循环控制等逻辑操作,比较指令(如CMP)会根据操作数的比较结果设置标志寄存器中的相关标志位

比较指令影响的标志位:
ZF(Zero Flag):如果结果为零,则设置ZF;否则清除ZF。
SF(Sign Flag):如果结果为负(最高位为1),则设置SF;否则清除SF。
OF(Overflow Flag):如果有符号运算中溢出,则设置OF;否则清除OF。
CF(Carry Flag):如果无符号运算中有借位,则设置CF;否则清除CF。
AF(Auxiliary Carry Flag):如果在从第3位到第4位的运算中有借位,则设置AF;否则清除AF。
PF(Parity Flag):如果结果的最低有效字节中1的个数为偶数,则设置PF;否则清除PF。

在本文中我们会使用到的标志位ZFSFOFCF

CMP指令的语法
CMP destination, source

destination:可以是寄存器或内存位置。

source:可以是寄存器、内存位置或立即数。

CMP指令与标志位的关系

CMP指令执行destination - source的隐含减法操作,影响标志位如下:

1. destination == source(相等)
    ZF = 1:结果为零,表示相等。
    CF = 0:无借位,表示无进位。
    SF = 0:结果非负。
    OF = 0:无溢出。
2. destination < source
    ZF = 0:结果不为零,表示不相等。
    CF = 1:有借位,表示无符号小于。
    SF = 1:结果为负。
    OF = 0:无溢出。
3. destination > source
    ZF = 0:结果不为零,表示不相等。
    CF = 0:无借位,表示无符号大于。
    SF = 0:结果非负。
    OF = 0:无溢出。
4. destination <= source
  标志位条件:
        ZF = 1  || CF = 1
5. destination >= source
  标志位条件:    
        CF = 0

跳转指令 (JCC)

在16位x86汇编语言中,跳转指令(Jump Instruction)用于控制程序的执行流程,决定程序在何处继续执行。跳转指令通常依赖于标志寄存器(Flags Register)的标志位。根据标志位的设置情况,程序可以有条件地跳转到指定的代码位置,从而实现条件判断、循环等功能。

无条件跳转指令

JMP:无条件跳转指令总是跳转到目标地址。

jmp label:无条件跳转到标签 label

JMP target
target:
    ; 在这里继续执行
示例
  1. 初始化数据段寄存器DS,使其指向数据段。

  2. 无条件跳转到jmpTest标签,跳过了打印szBuffer的代码。

  3. jmpTest标签处,设置并调用DOS中断21h的09h功能,显示字符串szJMPBuffer的内容(即JMPTest)。

  4. 程序读取一个字符,然后正常终止并返回DOS。

assume cs:code,ds:data
​
data segment    ;定义数据段
    szBuffer db 0dh,0ah,'HelloWorld$'    ;定义字符串szBuffer
    szJMPBuffer db 0dh,0ah,'JMPTest$'    ;定义字符串szJMPBuffer
data ends
​
code segment
start:
    mov ax,data
    mov ds,ax
    
    jmp jmpTest ;跳转到标签
    mov ah,09h
    lea dx,szbuffer
    int 21h
​
jmpTest:        ;标签 
    mov ah,09h
    mov dx,offset szJMPBuffer
    int 21h
​
    mov ah,07h   ;获取输入
    int 21h
    mov ax,4c00h
    int 21h
    
code ends
end start

jmp jmpTest:无条件跳转到jmpTest标签;这个跳转导致下面的代码(打印szBuffer的代码)被跳过,不会执行。

jmpTest::标签,用于跳转目标。

此时程序只会输出szJMPBuffer的值,并等待用户输入一个字符;

有条件跳转指令

有条件跳转指令根据标志寄存器的状态决定是否跳转。常见的条件跳转指令有:

①JE / JZ(Jump if Equal / Jump if Zero):当ZF = 1时跳转;用于相等比较结果。

示例:
assume cs:code,ds:data
data segment
    szBuffer db 0dh,0ah,'HelloWorld$'
    szJMPBuffer db 0dh,0ah,'JETest$'
data ends
​
code segment
start:
    mov ax,data
    mov ds,ax
    
    mov ax,3
    mov bx,3
    cmp ax,bx           ;比较AX和BX的值(实际上是执行ax - bx并根据结果设置标志位)。
    je JETEST           ;如果比较结果相等(ZF=1),则跳转到标签JETEST。
    
    mov ah,09h
    lea dx,szbuffer
    int 21h
​
JETEST:
    mov ah,09h
    mov dx,offset szJMPBuffer
    int 21h
​
    mov ah,07h
    int 21h
    mov ax,4c00h
    int 21h
    
code ends
end start

mov ax, 3:将立即数3加载到AX寄存器中。

mov bx, 3:将立即数3加载到BX寄存器中。

cmp ax, bx:比较AX和BX的值(实际上是执行ax - bx并根据结果设置标志位)。

je JETEST:如果比较结果相等(ZF=1),则跳转到标签JETEST。在这种情况下,由于AX和BX都等于3,ZF被设置,程序将跳转到JETEST标签。

JETEST::标签,用于跳转目标。

最后运行的结果为:

②JNE / JNZ(Jump if Not Equal / Jump if Not Zero):当ZF = 0时跳转。用于不相等比较结果。

CMP AX, BX
JNE not_equal

③JG / JNLE(Jump if Greater / Jump if Not Less or Equal):当ZF = 0且SF = OF时跳转。用于有符号比较中大于的情况。

CMP AX, BX
JG greater

④JGE / JNL(Jump if Greater or Equal / Jump if Not Less):当SF = OF时跳转。用于有符号比较中大于或等于的情况。

CMP AX, BX
JGE greater_or_equal

⑤JL / JNGE(Jump if Less / Jump if Not Greater or Equal):当SF ≠ OF时跳转。用于有符号比较中小于的情况。

CMP AX, BX
JL less

⑥JLE / JNG(Jump if Less or Equal / Jump if Not Greater):当ZF = 1或SF ≠ OF时跳转。用于有符号比较中小于或等于的情况。

CMP AX, BX
JLE less_or_equal

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

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

相关文章

KAN(Kolmogorov-Arnold Network)的理解 2

系列文章目录 第一部分 KAN的理解——数学背景 第二部分 KAN的理解——网络结构 文章目录 系列文章目录前言KAN网络结构&#xff1a;Kolmogorov-Arnold Network 前言 这里记录我对于KAN的探索过程&#xff0c;每次会尝试理解解释一部分问题。欢迎大家和我一起讨论。 KAN tuto…

Spring Boot集成六大常用中间件,附集成源码,亲测有效

目录 万字论文&#xff0c;从0到1&#xff0c;只需1小时获取途径1、Spring Boot如何集成Spring Data JPA&#xff1f;2、Spring Boot如何集成Spring Security&#xff1f;3、Spring Boot如何集成Redis&#xff1f;4、Spring Boot如何集成RabbitMQ&#xff1f;5、Spring Boot如何…

Dream

好像很多人梦寐以求的都是别人已经拥有的&#xff0c;多少人奋斗一生的目标&#xff0c;却只是别人的起点&#xff0c;人生而自由&#xff0c;只是不在枷锁之中&#xff0c;生活中没有人不遗憾&#xff0c;只是没有人喊疼&#xff0c;时间不会重来&#xff0c;已经过去了就让它…

day16--集合进阶(Set、Map集合)

day16——集合进阶&#xff08;Set、Map集合&#xff09; 一、Set系列集合 1.1 认识Set集合的特点 Set集合是属于Collection体系下的另一个分支&#xff0c;它的特点如下图所示 下面我们用代码简单演示一下&#xff0c;每一种Set集合的特点。 //Set<Integer> set ne…

软考 系统架构设计师系列知识点之SOME/IP与DDS(3)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之SOME/IP与DDS&#xff08;2&#xff09; 本文内容参考&#xff1a; 车载以太网 - SOME/IP简介_someip-CSDN博客 https://zhuanlan.zhihu.com/p/369422441 什么是SOME/IP?_someip-CSDN博客 SOME/IP 详解系列&#…

AS加密技术的实战应用与解析

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、AS加密技术简介 二、AS加密技术的实现过程 1. 生成公钥和私钥 2. 使用公钥加密数据 …

Java从坚持到精通-SpringBoot项目-多来米云客(持续更新中)

1.项目介绍 该项目模仿动力云客制作&#xff0c;是一款商业的集营销销售为一体的客户关系管理系统&#xff0c;其采用信息化、数字化方式来进行营销销售及客户管理。 云客指的是海量客户&#xff0c;通过技术方式实现的这一套系统&#xff0c;可用于自动化分析销售、市场营销…

【Python】 探索Python中的“命名元组”

基本原理 在Python中&#xff0c;元组&#xff08;tuple&#xff09;是一种不可变序列&#xff0c;它允许我们存储一系列的元素&#xff0c;并且这些元素一旦被创建就不能被修改。元组的这种不可变性使得它们在多线程编程中非常安全&#xff0c;因为不需要担心数据被意外修改。…

【VTKExamples::Utilities】第九期 FrameRate

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例FrameRate,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 1. FrameRate 该样例介绍 如…

详细分析 tar: xx:无法 open: 没有那个文件或目录 的解决方法

目录 1. 问题所示2. 原理分析3. 解决方法 1. 问题所示 对于此问题处理起来比较简易&#xff0c;对此放置在运维的专栏模块 在执行解压的时候出现如下问题&#xff1a; (pgm37) l228l228:~/huoyanhao/pytorch-glow-master/pytorch-glow-master$ tar -xvf celeb-tfr.tar tar: …

“提升人工智能大模型智能:策略与挑战“

文章目录 每日一句正能量前言算法创新数据质量与多样性模型架构优化后记 每日一句正能量 失败时可以称为人生财富&#xff0c;成功时可以称为财富人生。 前言 随着人工智能技术的飞速发展&#xff0c;大模型已经成为推动多个领域创新的关键力量。从自然语言处理到图像识别&…

ssm145基于java的电脑硬件库存管理系统+jsp

电脑硬件库存管理系统的设计与实现 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对电脑硬件库存信息管理混乱&…

开源远程协助:分享屏幕,隔空协助!

&#x1f5a5;️ 星控远程协助系统 &#x1f5b1;️ 一个使用Java GUI技术实现的远程控制软件&#xff0c;你现在就可以远程查看和控制你的伙伴的桌面&#xff0c;接受星星的指引吧&#xff01; 支持系统&#xff1a;Windows / Mac / Linux &#x1f31f; 功能导览 &#x1f…

AI分析SP和pk进行sk分析

SP原始表行标题代表题目序号&#xff0c;列代表学生&#xff0c;如果学生答对题目为1&#xff0c;否则为0。问题知识点矩阵这个文件横轴代表每个知识点&#xff0c;列标题代表每个题目序号&#xff0c;如果题目包含这个知识点则该处值为1。通过两个文件判断学生对于每个知识点的…

行为设计模式之职责链模式

文章目录 概述原理代码实现小结 概述 职责链模式(chain of responsibility pattern) 定义: 避免将一个请求的发送者与接收者耦合在一起,让多个对象都有机会处理请求.将接收请求的对象连接成一条链,并且沿着这条链传递请求,直到有一个对象能够处理它为止. 在职责链模式中&…

文件上传漏洞:pikachu靶场中的文件上传漏洞通关

目录 1、文件上传漏洞介绍 2、pikachu-client check 3、pikachu-MIME type 4、pikachu-getimagesize 最近在学习文件上传漏洞&#xff0c;这里使用pikachu靶场来对文件上传漏洞进行一个复习练习 废话不多说&#xff0c;开整 1、文件上传漏洞介绍 pikachu靶场是这样介绍文…

【Leetcode 160】环形链表——双指针,细节讲解

题目 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&#…

智能时代下,人机交互和虚拟现实的机遇和挑战

智能时代下,人机交互和虚拟现实的机遇和挑战

使用 Django 与 Redis 实现缓存优化

文章目录 什么是Redis&#xff1f;为什么选择Django与Redis&#xff1f;如何在Django中使用Redis&#xff1f;总结与拓展 在Web开发中&#xff0c;性能优化是一个至关重要的方面。而使用缓存是提高Web应用性能的常见方法之一。在这篇文章中&#xff0c;我们将探讨如何结合Djang…

免费分享一套SpringBoot+Vue企业客户关系CRM管理系统【论文+源码+SQL脚本+PPT】,帅呆了~~

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue企业客户关系CRM管理系统&#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue企业客户关系CRM管理系统系统 Java毕业设计_哔哩哔哩_bilibili【免费】SpringBootVue企业客户关系CRM管…