ARM64 CSEL条件 B条件一览

其实整体概括下来,就是两个寄存器比大小,按照不同的格式(有符号,无符号)比


条件选择

(Conditional Selection, CSEL)

 示例

CSEL X3, X1, X2, EQ

在这个例子中,如果条件码 EQ 为真(即条件寄存器的标志指示相等),那么 X3 将被赋值为 X1 的值,否则将被赋值为 X2 的值。

  1. EQ (Equal): 零标志(Z)被设置,即结果为零。
  2. NE (Not Equal): 零标志(Z)没有被设置,即结果不为零。
  3. CS/HS: Carry Set/Unsigned Higher or Same: 进位标志(C)被设置,用于无符号比较(大于或等于)。
  4. CC/LO: Carry Clear/Unsigned Lower: 进位标志(C)没有被设置,用于无符号比较(小于)。
  5. MI (Minus): 负标志(N)被设置,表示结果为负。
  6. PL (Plus): 负标志(N)没有被设置,表示结果为正或零。
  7. VS (Overflow Set): 溢出标志(V)被设置。
  8. VC (Overflow Clear): 溢出标志(V)没有被设置。
  9. HI (Unsigned Higher): 进位标志(C)被设置且零标志(Z)没有被设置,用于无符号比较(严格大于)。
  10. LS (Unsigned Lower or Same): 进位标志(C)没有被设置或零标志(Z)被设置,用于无符号比较(小于或等于)。
  11. GE (Signed Greater than or Equal): 负标志(N)等于溢出标志(V),用于有符号比较(大于或等于)。
  12. LT (Signed Less Than): 负标志(N)不等于溢出标志(V),用于有符号比较(小于)。
  13. GT (Signed Greater Than): 零标志(Z)没有被设置且负标志(N)等于溢出标志(V),用于有符号比较(严格大于)。
  14. LE (Signed Less than or Equal): 零标志(Z)被设置或负标志(N)不等于溢出标志(V),用于有符号比较(小于或等于)。
  15. AL (Always): 总是执行,无条件。
  16. NV (Never): 从不执行,通常不使用。


条件跳转

分支跳转(分支 Branch, B)

示例

假设我们有两个整数,想要比较它们的大小并根据比较结果执行不同的代码:

    MOV     X0, #5          // 将值5加载到寄存器X0MOV     X1, #10         // 将值10加载到寄存器X1CMP     X0, X1          // 比较X0和X1B.EQ    equal_label     // 如果X0等于X1,跳转到equal_labelB.GT    greater_label   // 如果X0大于X1,跳转到greater_labelB.LT    less_label      // 如果X0小于X1,跳转到less_labelequal_label:// 这里的代码将在X0等于X1时执行MOV     X2, #0          // 将0加载到X2B       end_label       // 跳转到结束标签greater_label:// 这里的代码将在X0大于X1时执行MOV     X2, #1          // 将1加载到X2B       end_label       // 跳转到结束标签less_label:// 这里的代码将在X0小于X1时执行MOV     X2, #-1         // 将-1加载到X2end_label:// 结束标签,程序在这里继续执行

解释

  1. 比较操作

    • CMP X0, X1:比较寄存器X0X1的值,设置条件标志。
  2. 条件跳转

    • B.EQ equal_label:如果X0等于X1,则跳转到equal_label
    • B.GT greater_label:如果X0大于X1,则跳转到greater_label
    • B.LT less_label:如果X0小于X1,则跳转到less_label
  3. 执行不同的代码块

    • 在每个标签(equal_labelgreater_labelless_label)处,根据比较结果执行不同的代码。
  4. 结束跳转

    • 使用B end_label确保在执行完某个条件下的代码后跳转到程序的结束部分。
  1. B.EQ (Equal): 当零标志(Z)被设置时跳转,即相等时跳转。
  2. B.NE (Not Equal): 当零标志(Z)没有被设置时跳转,即不相等时跳转。
  3. B.HS (Unsigned Higher or Same): 当进位标志(C)被设置时跳转,用于无符号比较(大于或等于)。
  4. B.LO (Unsigned Lower): 当进位标志(C)没有被设置时跳转,用于无符号比较(小于)。
  5. B.MI (Minus): 当负标志(N)被设置时跳转,表示结果为负。
  6. B.PL (Plus): 当负标志(N)没有被设置时跳转,表示结果为正或零。
  7. B.VS (Overflow Set): 当溢出标志(V)被设置时跳转。
  8. B.VC (Overflow Clear): 当溢出标志(V)没有被设置时跳转。
  9. B.HI (Unsigned Higher): 当进位标志(C)被设置且零标志(Z)没有被设置时跳转,用于无符号比较(严格大于)。
  10. B.LS (Unsigned Lower or Same): 当进位标志(C)没有被设置或零标志(Z)被设置时跳转,用于无符号比较(小于或等于)。
  11. B.GE (Signed Greater than or Equal): 当负标志(N)等于溢出标志(V)时跳转,用于有符号比较(大于或等于)。
  12. B.LT (Signed Less Than): 当负标志(N)不等于溢出标志(V)时跳转,用于有符号比较(小于)。
  13. B.GT (Signed Greater Than): 当零标志(Z)没有被设置且负标志(N)等于溢出标志(V)时跳转,用于有符号比较(严格大于)。
  14. B.LE (Signed Less than or Equal): 当零标志(Z)被设置或负标志(N)不等于溢出标志(V)时跳转,用于有符号比较(小于或等于)。

关于CMP指令 

在ARM64架构中,CMP指令用于比较两个寄存器的值,它实际上是一个“减法”操作,不存储结果,只更新条件标志寄存器(CPSR)的状态标志。具体来说,CMP指令会影响以下几个标志:

  1. N(负标志)

    • 当结果为负数时,N标志被设置。
    • 具体来说,如果减法结果的最高有效位(即符号位)为1,则N标志被设置。
  2. Z(零标志)

    • 当结果为零时,Z标志被设置。
    • 如果两个操作数相等,结果为零,Z标志被设置。
  3. C(进位标志)

    • 在无符号数减法中,如果借位发生,C标志被清除;如果没有借位,C标志被设置。
    • 具体来说,C标志被设置当被减数大于等于减数(即没有借位)时。
  4. V(溢出标志)

    • 在有符号数减法中,如果结果超出了表示范围(例如,从正数溢出到负数或从负数溢出到正数),V标志被设置。
    • 具体来说,如果被减数和减数的符号不同,而结果的符号与被减数的符号不同,则V标志被设置。

示例 1:无符号比较

假设我们有两个无符号整数X0X1

MOV X0, #8      // X0 = 8
MOV X1, #5      // X1 = 5
CMP X0, X1      // 比较 X0 和 X1
  • N标志:未设置,因为8 - 5 = 3,结果为正。
  • Z标志:未设置,因为8不等于5。
  • C标志:设置,因为8大于5,无借位。
  • V标志:未设置,因为无符号比较不涉及溢出。

示例 2:相等比较

MOV X0, #10     // X0 = 10
MOV X1, #10     // X1 = 10
CMP X0, X1      // 比较 X0 和 X1
  • N标志:未设置,因为10 - 10 = 0,结果非负。
  • Z标志:设置,因为10等于10,结果为零。
  • C标志:设置,因为10大于或等于10,无借位。
  • V标志:未设置,因为没有溢出。

示例 3:负数结果(有符号比较)

假设我们有两个有符号整数X0X1

MOV X0, #-3     // X0 = -3
MOV X1, #2      // X1 = 2
CMP X0, X1      // 比较 X0 和 X1
  • N标志:设置,因为-3 - 2 = -5,结果为负。
  • Z标志:未设置,因为-3不等于2。
  • C标志:未设置,因为-3小于2,有借位。
  • V标志:未设置,因为没有溢出。

示例 4:溢出情况

考虑有符号整数溢出:

MOV X0, #0x7FFFFFFF  // X0 = 最大正数
MOV X1, #-1          // X1 = -1
CMP X0, X1           // 比较 X0 和 X1
  • N标志:未设置,因为0x7FFFFFFF - (-1) = 0x80000000,结果为正。
  • Z标志:未设置,因为0x7FFFFFFF不等于-1。
  • C标志:设置,因为在无符号上下文中没有借位。
  • V标志:设置,因为0x7FFFFFFF - (-1)导致从正数溢出到负数。

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

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

相关文章

BLE core 内容整理解释

本文内容比较杂散,只是做记录使用,后续会整理的有条理些 link layer 基本介绍 **Link Layer Control(链路层控制)**是蓝牙低功耗(BLE)协议栈的核心部分,负责实现设备间可靠、安全、低功耗的数…

【疑难杂症】 HarmonyOS NEXT中Axios库的响应拦截器无法拦截424状态码怎么办?

今天在开发一个HarmonyOS NEXT的应用的时候,发现http接口如果返回的状态码是424时,我在axios中定义的拦截器失效了。直接走到了业务调用的catch中。 问题表现: 我的拦截器代码如下: 解决办法: 先说解决办法&#xff…

一起来看--红黑树

【欢迎关注编码小哥,学习更多实用的编程方法和技巧】 红黑树是一种自平衡的二叉搜索树,广泛应用于计算机科学中,尤其是在实现关联数组和集合时。它的设计旨在确保在最坏情况下,基本动态集合操作(如插入、删除和查找&am…

聚类评价指标

聚类评价指标分为 内部指标 和 外部指标 两大类,用于评估聚类算法的性能。 一、内部评价指标 内部评价指标不依赖真实标签,主要通过聚类结果本身的紧凑性和分离性进行评估。 轮廓系数(Silhouette Coefficient, SC) 衡量数据点与其…

flask后端开发(1):第一个Flask项目

目录 一、Helloworddebug、host、port的配置 gitcode地址: https://gitcode.com/qq_43920838/flask_project.git 一、Helloword 一般是会创建两个文件夹和app.py app.py from flask import FlaskappFlask(__name__)app.route(/) def hello_world():return Hello…

C++ 设计模式:抽象工厂(Abstract Factory)

链接:C 设计模式 链接:C 设计模式 - 工厂方法 链接:C 设计模式 - 原型模式 链接:C 设计模式 - 建造者模式 抽象工厂(Abstract Factory)是一种创建型设计模式,它提供一个接口,用于创…

docker 安装与配置 gitlab

前提条件 Docker:确保你已经安装了 Docker 和 Docker Compose。可以通过以下命令来检查是否安装 Docker:docker --version1. 拉取 GitLab Docker 镜像 首先,我们需要拉取 GitLab 的官方 Docker 镜像。可以使用以下命令来获取 GitLab CE&…

C语言-详细讲解-字符串加密

1.题目要求 编写加密程序,将用户输入的一个英文句子加密为加密字符串,然后输出加密字符串。假设句子长度不超过50个字符。根据给定的句子加密函数原型SentenceEncoding,编写函数SentenceEncoding调用字符加密函数CharEncoding完成句子加密。然…

stratovirt

title: 探索 Stratovirt:云时代的虚拟化新力量 date: ‘2024-12-29’ category: blog tags: Stratovirt云计算虚拟化技术技术解析 sig: Stratovirt archives: ‘2024-12’ author:way_back summary: Stratovirt 作为新兴的虚拟化技术,以其独特的架构和先…

一文复盘:RAG技术-大模型

原文:https://zhuanlan.zhihu.com/p/13962398269 RAG(Retrieval-Augmented Generation)之所以被关注,有两方面原因: 1、没有跑大模型的资源:大多数人没有GPU集群搞LLM的预训练。 2、大模型缺乏知识&…

使用 OpenCV 绘制线条和矩形

OpenCV 是一个功能强大的计算机视觉库,它不仅提供了丰富的图像处理功能,还支持图像的绘制。绘制简单的几何图形(如线条和矩形)是 OpenCV 中常见的操作。在本篇文章中,我们将介绍如何使用 OpenCV 在图像上绘制线条和矩形…

WinForm 美化秘籍:轻松实现 Panel 圆角虚线边框

文章目录 1、引言2、案例实现1、创建自定义 Panel 类2、定义圆角矩形3. 使用自定义 Panel4. 调整属性5、使用背景图片来实现5、拓展:使用 Panel 的 Paint重绘单独实现虚线边框效果 3、实现效果4、总结 1、引言 在 Winform 应用程序开发中,美化用户界面&…

Spring Cloud LoadBalancer (负载均衡)

目录 什么是负载均衡 服务端负载均衡 客户端负载均衡 Spring Cloud LoadBalancer快速上手 启动多个product-service实例 测试负载均衡 负载均衡策略 自定义负载均衡策略 什么是负载均衡 负载均衡(Load Balance,简称 LB) , 是高并发, 高可用系统必不可少的关…

OpenCloudOS简介

OpenCloudOS是一款开源的云操作系统,具有诸多特性和优势,广泛应用于多个领域。 一、项目背景 开源社区发起:由操作系统、云平台、软硬件厂商与个人共同倡议发起的操作系统社区项目,旨在打造全面中立、开放、安全、稳定易用、高…

NLP 中文拼写检测纠正论文 Automatic-Corpus-Generation

拼写纠正系列 NLP 中文拼写检测实现思路 NLP 中文拼写检测纠正算法整理 NLP 英文拼写算法,如果提升 100W 倍的性能? NLP 中文拼写检测纠正 Paper java 实现中英文拼写检查和错误纠正?可我只会写 CRUD 啊! 一个提升英文单词拼…

区块链安全常见的攻击合约和简单复现,附带详细分析——不安全调用漏洞 (Unsafe Call Vulnerability)【6】

区块链安全常见的攻击分析——不安全调用漏洞 Unsafe Call Vulnerability 区块链安全常见的攻击合约和简单复现,附带详细分析——不安全调用漏洞 (Unsafe Call Vulnerability)【6】1.1 漏洞合约1.2 漏洞分析1.3 攻击步骤分析1.4 攻击合约 区块链安全常见的攻击合约和…

生成excel文件(有备注和表头的情况)

要使用 Java 导出 Excel 文件,并且通过 ExcelProperty 注解进行列的映射,可以利用 EasyExcel 库。EasyExcel 是阿里巴巴开源的一款高性能 Excel 读写工具,它支持通过注解将类与 Excel 的列进行映射,简化了 Excel 操作的复杂性。 …

Excel 面试 01 “Highlight in red the 10 lowest orders”

要在 Excel 中完成“Highlight in red the 10 lowest orders”的任务,可以使用条件格式(Conditional Formatting)。以下是详细步骤: 步骤 1:选择数据范围 打开包含订单数据的工作表。选中包含订单金额或数量的单元格范…

留学生交流互动系统|Java|SSM|VUE| 前后端分离

【技术栈】 1⃣️:架构: B/S、MVC 2⃣️:系统环境:Windowsh/Mac 3⃣️:开发环境:IDEA、JDK1.8、Maven、Mysql5.7 4⃣️:技术栈:Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库可…

Junit如何禁用指定测试类,及使用场景

在JUnit中禁用指定测试类可以通过多种方式实现,具体取决于使用的JUnit版本(JUnit 4 或 JUnit 5)。以下是针对两个版本的详细说明以及它们可能的使用场景: JUnit 4 禁用整个测试类 可以使用Ignore注解来忽略整个测试类。这将导致…