汇编:比较跳转

ops/2024/10/11 3:24:57/

在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 < sourceZF = 0:结果不为零,表示不相等。CF = 1:有借位,表示无符号小于。SF = 1:结果为负。OF = 0:无溢出。
3. destination > sourceZF = 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$'    ;定义字符串szBufferszJMPBuffer db 0dh,0ah,'JMPTest$'    ;定义字符串szJMPBuffer
data ends
​
code segment
start:mov ax,datamov ds,axjmp jmpTest ;跳转到标签mov ah,09hlea dx,szbufferint 21h
​
jmpTest:        ;标签 mov ah,09hmov dx,offset szJMPBufferint 21h
​mov ah,07h   ;获取输入int 21hmov ax,4c00hint 21hcode 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 segmentszBuffer db 0dh,0ah,'HelloWorld$'szJMPBuffer db 0dh,0ah,'JETest$'
data ends
​
code segment
start:mov ax,datamov ds,axmov ax,3mov bx,3cmp ax,bx           ;比较AX和BX的值(实际上是执行ax - bx并根据结果设置标志位)。je JETEST           ;如果比较结果相等(ZF=1),则跳转到标签JETEST。mov ah,09hlea dx,szbufferint 21h
​
JETEST:mov ah,09hmov dx,offset szJMPBufferint 21h
​mov ah,07hint 21hmov ax,4c00hint 21hcode 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.ppmy.cn/ops/43938.html

相关文章

python list 重复元素不会覆盖

python list 插入重复元素不会覆盖&#xff0c;见以下测试&#xff1a; Python 3.10.12 (main) [GCC 11.4.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> a [1, 2, 3] >>…

DSP教程

/// TMS320F28335 具有 150MIPS、FPU、512KB 闪存、EMIF、12 位 ADC 的 C2000™ 32 位 MCU /// 此文档中的《8.3 内存映射》部分做个大概的了解&#xff0c;用的时候查阅即可。 TMS320F2833x、TMS320F2823x 实时微控制器 数据表 (Rev. Q)PDF /// 这个实验要实际操作&…

【git】开发提交规范(feat、fix、perf)

这段时间收到的需求很多&#xff0c;可能是临近两周一次的大版本灰度上线&#xff0c;这次产生了一个关于git的思考&#xff0c;就是各个版本之间怎么管理的问题&#xff0c;这里做出我自己的一些方法。 首先&#xff0c;既然已经明确了remote分支中的release分支为主分支&…

【Spring Cloud】Feign整合服务容错中间件Sentinel

文章目录 引入sentinel依赖配置文件为被容错的接口指定容错类创建容错类修改controller演示扩展为被容错的接口更改容错类创建回退工厂类演示 总结 上一篇文章中我们已经对服务容错中间件 Sentinel 持久化的两种模式进行了全面解析&#xff0c;本文我们将对Feign和Sentinel进行…

知识融合概述

文章目录 知识融合知识融合过程研究现状技术发展趋势 知识融合 知识融合的概念最早出现在1983年发表的文献中&#xff0c;并在20世纪九十年代得到研究者的广泛关注。而另一种知识融合的定义是指对来自多源的不同概念、上下文和不同表达等信息进行融合的过程认为知识融合的目标是…

Unity环绕物体的摄像机,添加了遮挡的适应

第三人人称摄像机 支持的功能 设定目标后使用鼠标可以环绕目标点旋转&#xff0c;且会进行遮挡的适配&#xff0c;当有遮挡的时候会移动差值移动到没有遮挡的位置。 使用方式 将vThirdPersonCamera 挂在与摄像机上然后为target赋值。 如果有需要检测遮挡的层级可以修改&…

结构型模式之桥接模式

文章目录 概述原理结构图代码示例 小结 概述 桥接模式(bridge pattern) 的定义是&#xff1a;将抽象部分与它的实现部分分离&#xff0c;使它们都可以独立地变化。 桥接模式用一种巧妙的方式处理多层继承存在的问题,用抽象关联来取代传统的多层继承,将类之间的静态继承关系转…

pinia的使用

搭建pinia环境 pinia&#xff1a;集中式状态管理工具&#xff0c;用于各组件之间共享数据&#xff08;多个组件会用到的数据才考虑放到pinia中&#xff09; 在vue2中使用的是vuex 1.终端输入&#xff1a;npm i pinia 2. 在vue组件中出现pinia 用pinia存储读取数据 要想好…