ARM64汇编04 - 条件码

关于分支控制与条件码的作用可以去看 《CSAPP》的第 3.6 节,讲的非常清楚,建议看看,这里就不重复了。

我们直接使用一个例子来简单理解汇编是如何实现分支控制的:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
    time_t t;
    srand((unsigned) time(&t));

    int a = rand();
    int b = rand();

    printf("a = %d, b = %d\n", a, b);

    if (a > b)
    {
        printf("a win!!!\n");
    }
    else if (a < b)
    {
        printf("b win!!!\n");
    }
    else
    {
        printf("both win!!!\n");
    }

    return 0;
}

编译后,使用 ida 打开,查看其核心逻辑:

1处的 w19 与 w20 储存着 a 与 b 的值,CMP 会对这两个值做比较。

CSEL 指令介绍:

CSEL <Xd>, <Xn>, <Xm>, <cond>

cond 是有一个表可以查的,我们后面会说。这个指令的意思是,如果 cond == true,Xd = Xn,否则 Xd = Xm。

2 处的 CSEL 指令的意思是如果 LT 的值是 true,那么 x8 = x9,否则 x8 = x8。x9 的值是 b win。结合源代码,可以猜测出  CMP 就是做了一个减法操作。

综合一下,当 w19 < w20,那么输出 x9(b win),否则输出 x8(both win)。

3 处的分析与 2 一样就不展开了,当 w19 > w20,那么输出 x0(a win)

通常,在有分支的位置,会出现 CMP 等指令,它会修改 ZNCV 这些 flags 的值,然后后面会跟一些需要根据 flags 值来决定分支走向的汇编代码,比如 CSEL。

我们编写的程序,肯定是有很多分支的。所以,cond 非常的重要。

Condition code

arm64 的条件码如下,与 arm32 有点区别,但是不大:

我们在上面的例子中看到的 LTGT 这里都是有对应的。

LT 表示有符号的小于,GT 表示有符号的大于。

LT 需要检查 N 与 V 的值,GT 需要检查 Z,N,V的值。

关于 ZCNV 这几个标志位的解释,不太好描述,先简单理解:

  • N:当操作结果为负数时,设置为1,否则为0。

  • Z:当操作结果为0时,设置为1,否则为0。

  • C:当操作结果发生进位或者减法结果无借位时,设置为1,否则设置为0。

  • V:当操作导致溢出时,设置为1,否则设置为0。

实际上,会有相当多的指令会更新这些 flag 的值,比如,一些运算指令等。但是运算指令想要更新 flag,还需要加 S 后缀。比如,ADDS指令。

有符号与无符号

从上面的条件码表中可知:

  • 有符号的大于为:GT(Greater than)

  • 有符号的小于为:LT(Less than)

  • 无符号的大于为:HI(higher)

  • 无符号的小于等于为:LS(lower or same)

由于助记符设计的有符号的小于使用的单词是 Less,无符号的小于采用的 lower,导致它们看起来会比较像。

在汇编中出现了 LT 与 LS 后缀,很难会一下子反应过来,这到底是有符号还是无符号。

x86 中的有符号与无符号区分的比较开,有符号使用greater/less,无符号使用 above/below。

LS后缀

由于 cond 后缀有一个 LS,表示 less or same。而 B 指令也可以接 cond 后缀,所以会出现 BLS 指令。

这很好理解,但是对初学者来说,有一个麻烦的地方,就是还有一个 BL 指令,我们还记得有些指令是可以加 S 后缀的。

所以当我们看到  BLS 指令的时候,它到底表示的是 B + LS ,还是 BL + S 呢?

如果你翻arm手册,就知道,BL 是没有 S 后缀的,也就是说它不设置 flag:

C标志位的奇怪表现

使用 ida 来简单观察一下C flag 的变化情况。

测试加法,0 + 1,单步后,查看 C 位变化:

发现 C 位无变化,很正常。

再测试一个减法,2 - 1

单步后,查看 C 位变化:

发现,C 位居然变成了 1,这个表现就与x86中是相反的,设计的很奇怪。

再测试一个 1 -2

单步后,查看 C 位变化:

C 位无变化,N位变成了 1,因为结果是 -1。

对于C位,需要注意到,在减法中,它与 x86 中的表现是相反的,与直觉也是相反的。

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

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

相关文章

【MATLAB第98期】基于MATLAB的MonteCarlo蒙特卡罗结合kriging克里金代理模型的全局敏感性分析模型【更新中】

【MATLAB第98期】基于MATLAB的Monte Carlo蒙特卡罗结合kriging克里金代理模型的全局敏感性分析模型【更新中】 PS:因内容涉及较多&#xff0c;所以一时半会更新不完 后期会将相关原理&#xff0c;以及多种功能详细介绍。 麻烦点赞收藏&#xff0c;及时获取更新消息。 引言 在…

Easticsearch性能优化之索引优化

Easticsearch性能优化之索引优化 一、合理的索引设计二、合理的分片和副本三、合理的索引设置 对于性能优化&#xff0c;Elasticsearch&#xff08;以下简称ES&#xff09;的索引优化是提高性能的关键因素之一。合理的设计索引&#xff0c;合理的分片和副本以及合理的缓存设置等…

VSCode报错:/bin/sh: python: command not found

背景 以前都是直接用txt写python&#xff0c;然后直接命令行运行。 这次涉及的代码较多&#xff0c;决定用编译器。 写好的一段python点击运行报错&#xff01; 问题描述 因为我本地安装的是python3&#xff0c;但是vscode用的是另一个路径的python&#xff0c;所以找不到 解…

[React 进阶系列] React Context 案例学习:使用 TS 及 HOC 封装 Context

[React 进阶系列] React Context 案例学习&#xff1a;使用 TS 及 HOC 封装 Context 具体 context 的实现在这里&#xff1a;[React 进阶系列] React Context 案例学习&#xff1a;子组件内更新父组件的状态。 根据项目经验是这样的&#xff0c;自从换了 TS 之后&#xff0c;…

光谱整形1

华为张德江&#xff1a;下一代光传送网将走向400G80波WDM系统_通信世界网 (cww.net.cn) 张德江指出&#xff0c;400G WDM系统具有三大基本特征&#xff1a;支持400G80波&#xff0c;单纤32T超大容量&#xff0c;传输距离与100G相当&#xff1b;支持32维以上的光交叉&#xff1…

微前端之使用无界创建一个微前端项目

wujie 使用手册 使用简介 主应用配置 安装 wujie依赖main.js配置 是否开启预加载 生命周期函数 – lifecycle.js配置 子应用配置 跨域设置运行模式 生命周期改造 在主应用中&#xff0c;使用wujie&#xff0c;将子应用引入到主应用中去 wujie 使用手册 wujie 是一个基于 Web…

Linux环境下使用interrupt方式操作UART

目录 概述 1 Linux环境下UART设备 2 轮询方式操作UART功能实现 2.1 打开串口函数&#xff1a;usr_serial_open 2.2 关闭串口函数&#xff1a; usr_serial_close 2.3 发送数据函数&#xff1a; usr_serial_sendbytes 2.4 接收数据函数&#xff1a; usr_serial_readinterr…

Android 性能优化--APK加固(2)加密

文章目录 字符串加密图片加密如何避免应用被重新签名分发APK 加壳的方案简析DEX加密原理及实现 本文首发地址&#xff1a;https://h89.cn/archives/212.html 最新更新地址&#xff1a;https://gitee.com/chenjim/chenjimblog 通过 前文 介绍&#xff0c;我们知晓了如何使用代码…

前端网络请求异步处理——Promise使用记录

Promise是ES6中新增的一个处理复杂异步请求的工具&#xff0c;其主要形式为&#xff1a; const baseUrl http://localhost:80 export const $request (param {}) > {console.log(请求参数, param)return new Promise((resolve, reject) > {wx.request({url: baseUrl …

SpringMVC拦截器和过滤器执行顺序及区别

拦截器&#xff08;Inteceptor&#xff09;和过滤器&#xff08;Filter&#xff09;执行顺序&#xff1f; 拦截器和过滤器区别&#xff1f; 1、拦截次数不同&#xff1a; 过滤器&#xff1a;一次请求只能被一个过滤器拦截一次&#xff0c;它们按照在web.xml中的声明顺序依次执…

Python Web开发记录 Day7:Django(Web框架) part 1

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 七、Django1、快速了解Django①概述②核心功能③…

css flex 布局换行

默认使用display: flex;是不换行的&#xff0c;只需要加上flex-wrap: wrap;就行了&#xff0c;效果图 .app-center {display: flex;flex-wrap: wrap;justify-content:flex-start; } 通过上面我们发现虽然时间换行了&#xff0c;但是每行的边距不一样 加上这个就行了&#xff…

华为配置DHCP Snooping防止DHCP Server仿冒者攻击示例

配置DHCP Snooping防止DHCP Server仿冒者攻击示例 组网图形 图1 配置DHCP Snooping防止DHCP Server仿冒者攻击组网图 DHCP Snooping简介配置注意事项组网需求配置思路操作步骤配置文件 DHCP Snooping简介 在一次DHCP客户端动态获取IP地址的过程中&#xff0c;DHCP Snoopi…

开源分子对接程序rDock使用方法(1)-Docking in 3 steps

欢迎浏览我的CSND博客&#xff01; Blockbuater_drug …点击进入 文章目录 前言一、Docking in 3 steps 标准对接rDock 的基本对接步骤及注意事项 二、 三步对接案例Step 1. 结构文件准备Step 2. 产生对接位点Step 3. 运行分子对接3.1 检查输入文件3.2 测试-只进行打分3.3 运行…

maven项目结构管理统一项目配置操作

一、maven分模块开发 Maven 分模块开发 1.先创建父工程&#xff0c;pom.xml文件中&#xff0c;打包方式为pom 2.然后里面有许多子工程 3.我要对父工程的maven对所有子工程进行操作 二、解读maven的结构 1.模块1 <groupId>org.TS</groupId><artifactId>TruthS…

利用CesiumJS开发模拟飞机飞行的应用(添加飞行轨迹)

上一节介绍了利用CesiumJS开发模拟飞机飞行的应用(一&#xff0c;基本功能)&#xff0c;本节介绍如何在上节基础上添加飞行轨迹所使用数据是从旧金山到哥本哈根的真实航班&#xff0c;并使用 FlightRadar24收集的雷达数据。 添加单个3D点对象 FlightRadar24 使用多种方法&#…

[c/c++] const

const 和 #define 的区别 ? const 和指针一块出现的时候&#xff0c;到底谁不能修改 &#xff1f; const 和 volatile 能同时修饰一个变量吗 ? const 在 c 中的作用 ? 1 const 和 #define 的区别 const 和 #define 的相同点&#xff1a; (1) 常数 const 和 #define 定…

51-27 DirveVLM:自动驾驶与大型视觉语言模型的融合

本文由清华大学和理想汽车共同发布于2024年2月25日&#xff0c;论文名称DRIVEVLM: The Convergence of Autonomous Driving and Large Vision-Language Models. DriveVLM是一种新颖的自动驾驶系统&#xff0c;旨在针对场景理解挑战&#xff0c;利用最近的视觉语言模型VLM&…

蓝桥杯——web(ECharts)

ECharts 初体验 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><script src"echarts.js">&l…

【APB协议 UVM_Sequencer Driver Monitor_2024.03.04】

apb协议 写时序 地址、写信号、PSEL、写数据信号同时发生变化&#xff0c;即传输的第一个时钟被称为SETUP周期。在下个时钟上升沿,PENABLE信号拉高&#xff0c;表示ENABLE周期&#xff0c;在该周期内&#xff0c;数据、地址以及控制信号都必须保持有效。整个写传输在这个周期…