汇编:比较跳转

在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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深入理解布瑞克(break)逻辑与嵌套循环的奥秘

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;布瑞克逻辑是什么&#xff1f; 二、布瑞克逻辑在嵌套循环中的应用 1.…

倩女幽魂手游攻略:赚银搬砖干货分享,轻松从0开始!

在倩女幽魂手游中&#xff0c;搬砖是许多玩家用来赚取银两和其他资源的主要方式之一。通过完成各种任务、参与活动以及合理利用市场交易&#xff0c;玩家可以积累大量的财富。以下是详细的搬砖攻略&#xff0c;帮助你在游戏中获得更多收益。 一、日常搬砖任务 日常任务 每天的…

找不到vcruntime140.dll等140dll的解决方法,怎么才能快速的修复?

找不到vcruntime140.dll等140dll要怎么办&#xff1f;以上这两个其实都是属于dll文件来的&#xff0c;它们的缺失会导致某些程序直接运行不了&#xff0c;你需要重新的进行修复&#xff0c;然后程序才可以运行下去&#xff0c;下面一起来了解一下找不到vcruntime140.dll等140dl…

深度神经网络——什么是自动编码器?

自动编码器 自动编码器&#xff08;Autoencoders&#xff09;是无监督学习领域中一种重要的神经网络架构&#xff0c;它们主要用于数据压缩和特征学习。 自动编码器的定义&#xff1a; 自动编码器是一种无监督机器学习算法&#xff0c;它通过反向传播进行训练&#xff0c;目标…

二叉树尾部分

1.二叉树的销毁 2.二叉树的层序遍历 3.判断二叉树是否为完全二叉树 4.二叉树的性质 1.二叉树的销毁 以后序的方式遍历销毁左右子数&#xff0c;因为前序和中序销毁的话根会被销毁而找不到左右子树的位置&#xff0c;后序的根访问在最后&#xff0c;可以找到左右的子树位置。…

基于C#开发web网页管理系统模板流程-主界面管理员录入和编辑功能完善

前言 紧接上篇->基于C#开发web网页管理系统模板流程-登录界面和主界面_c#的网页编程-CSDN博客 已经完成了登录界面和主界面&#xff0c;本篇将完善主界面的管理员录入和编辑功能&#xff0c;事实上管理员录入和编辑的设计套路适用于所有静态表的录入和编辑 首先还是介绍一下…

声学特征在膝关节健康诊断中的应用分析

关键词&#xff1a;膝关节声发射、膝关节生物标志物、因果关系、机器学习 声学膝关节健康评估长期以来一直被看作是一种替代临床可用医学成像工具的替代方法&#xff0c;如声发射技术是通过检测膝关节在运动过程中产生的微小裂纹或损伤引起的声波信号&#xff0c;从而评估关节的…

学习Uni-app开发小程序Day17

今天开始&#xff0c;就把uni-app前期使用的全部学完了&#xff0c;现在就把以前学习的&#xff0c;做成一案例&#xff0c;中间有未讲的&#xff0c;在进行补充&#xff0c;这里是根据老师视频进行项目案例编写的。 先弄出效果图&#xff0c;然后在根据效果图进行代码的编辑 …

linux 中 fd 申请和释放管理(两级 bitmap)

linux 中 fd 的几点理解_linux fd-CSDN博客 通过上边的文章&#xff0c;我们可以知道&#xff0c;在 linux 中&#xff0c;fd 有以下几点需要了解&#xff1a; &#xff08;1&#xff09;fd 表示进程打开的文件&#xff0c;是进程级别的资源&#xff0c;不是系统级别的资源 …

【鱼眼镜头11】Kannala-Brandt模型和Scaramuzza多项式模型区别,哪个更好?

Kannala-Brandt模型和Scaramuzza多项式模型在描述鱼眼相机畸变时都有其特定的数学表示和应用&#xff0c;但它们之间存在一些区别。以下是对两者区别的分点表示和归纳&#xff1a; 数学表示&#xff1a; Kannala-Brandt模型&#xff1a;它假设图像光心到投影点的距离和角度的多…

字符串和字符串函数(1)

前言&#xff1a; 字符串在C语言中比较特别&#xff0c;没有单另的字符串类型&#xff0c;想要初始化字符串必须用字符变量的数组初始化&#xff0c;但是在C语言标准库函数中提供了大量能对字符串进行修改的函数&#xff0c;比如说可以实现字符串的的拷贝&#xff0c;字符串的追…

直播预告:TinyVue 组件库实战解析,提升组件库构建技能!

在复杂的编码世界里&#xff0c;大家总希望能够寻找更高效、更简洁的解决方案来优化工作流程&#xff0c;提升开发效率。在5月28日晚7点 OpenTiny B站直播间&#xff0c;OpenTiny 非常荣幸地为大家带来一场关于 TinyVue 组件库实战分享的直播。届时&#xff0c;TinyVue 组件库成…

【java程序设计期末复习】chapter4 类和对象

类和对象 编程语言的几个发展阶段 &#xff08;1&#xff09;面向机器语言 计算机处理信息的早期语言是所谓的机器语言&#xff0c;使用机器语言进行程序设计需要面向机器来编写代码&#xff0c;即需要针对不同的机器编写诸如0101 1100这样的指令序列。 &#xff08;2&#x…

优优嗨聚集团:快速摆脱个人债务束缚的秘诀

在快节奏的现代生活中&#xff0c;个人债务问题时常困扰着许多人。面对日益增长的债务压力&#xff0c;如何快速有效地处理成为众多人的迫切需求。本文将为你提供一套实用的债务清零攻略&#xff0c;帮助你摆脱债务的束缚&#xff0c;重获财务自由。 一、认清债务现状&#xff…

[NISACTF 2022]easyssrf、[NISACTF 2022]level-up

[NISACTF 2022]easyssrf 使用dirsearch扫描后没发现什么路径 尝试访问127.0.0.1&#xff0c;成功了 访问127.0.0.1/flag.php提示有文件/fl4g 使用file://协议读取文件/fl4g&#xff0c;提示除此页面外还有一个ha1x1ux1u.php页面。 file:///fl4g 直接访问&#xff0c;发现GET…

WDW-20B微机控制人造板试验机

一&#xff0e;设备外观照片&#xff1a; 项目简介&#xff1a; 微机控制电子式万能试验机是专门针对高等院校、各种金属、非金属科研厂家及国家级质检单位而设计的高端微机控制电子式万能试验机、计算机系统通过全数字控制器&#xff0c;经调速系统控制伺服电机转动&#xff…

JavaWeb_HTTP协议

HTTP&#xff1a; 概念&#xff1a; HTTP&#xff08;Hyper Text Transfer Protocal&#xff09;&#xff0c;超文本传输协议&#xff0c;规定了浏览器和服务器之间数据传输的规则。 特点&#xff1a; 1.基于TCP协议&#xff1a;面向连接&#xff0c;安全 2.基于请求-响应模型…

【Linux】升级GCC(版本9.3),补充:binutils

GCC&#xff1a;GNU Compiler Collection 。编译器&#xff0c;几乎Linux中所有程序&#xff08;包括内核&#xff09;都是gcc编译的&#xff0c;包括libc。 gcc不仅仅是编译器&#xff0c;gcc也有很多库&#xff0c;依赖libc。gcc和libc互相依赖。 GCC官网&#xff1a;GCC, …

如何注册Claude3?解决Claude3无海外手机号接收验证码的问题以及如何订阅Claude Pro

原文链接&#xff1a;如何注册 Claude3&#xff1f;解决 Claude3 无海外手机号接收验证码的问题以及如何订阅 Claude Pro 前言 Claude3已经出来有一段时间了&#xff0c;大家有没有体验过呢&#xff1f;不过从目前来看&#xff0c;Anthropic公司总共推出了3个模型&#xff1…

Java项目:基于SSM框架实现的学生就业管理系统分前后台(ssm+B/S架构+源码+数据库+毕业论文+开题报告)

一、项目简介 本项目是一套基于SSM框架实现的学生就业管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、功能…