一文搞懂 ARM 64 系列: ADC
1 指令语法
adc <Xd>, <Xn>, <Xm>
2 指令语义
adc就是带「进位」加法,指令中的c就是英文carry。
整个指令等价于:
(Xd, _) = Xn + Xm + PSTATE.C
也就是将寄存器Xn,寄存器Xm,PSTATE中的「进位」标志相加,将相加的结果写入寄存器Xd,但是丢弃相加产生的「进位」。
也就是说,adc指令只是使用PSTATE中的「进位」标志,但是最终结果不影响PSTATE中的「进位」标志。
3 PSTATE
上面代码中PSTATE是Process State,存储着ARM CPU运行时的一些状态。
PSTATE 中最常见的状态就是 NZCV:
N: 借位标志 - Negative Condition flag
Z: 0 - Zero Condition flag
C: 进位标志 - Carry Condition flag
V: 溢出标志 - Overflow Condition flag
要表示PSTATE中的某一标志,比如「进位」,可以写成PSTATE.C。
PSTATE除了NZCV这4个标志外,还有其他标志。
如果将PSTATE定义成一个结构体,可以表示为:
type ProcState is (
    bits (1) N, // Negative condition flag
    bits (1) Z, // Carry condition flag
    bits (1) C, // Zero condition flag
    bits (1) V, // Overflow condition flag
    bits (1) D, // Debug mask bit [AArch64 only]
    bits (1) A, // SError interrupt mask bit
    bits (1) I, // IRQ mask bit
    bits (1) F, // FIQ mask bit
    bits (1) PAN, // Privileged Access Never Bit [v8.1]
    bits (1) UAO, // User Access Override [v8.2]
    bits (1) DIT, // Data Independent Timing [v8.4]
    bits (1) TCO, // Tag Check Override [v8.5, AArch64]
    bits (2) BTYPE, // Branch Type  [v8.5]
    bits (1) ZA, // Accumulation array [SME]
    bits (1) SM, // Streaming SVE mode  [SME]
    bits (1) ALLINT, // Interrupt mask bit
    bits (1) SS, // Software step bit
    bits (1) IL, // Illegal Execution state bit
    bits (2) EL, // Exception level
    bits (1) nRW, // not Register Width: 0=64, 1=32
    bits (1) SP, // Stack pointer select: 0=SP0, 1=SPx [AArch64 only]
    bits (1) Q, // Cumulative saturation flag [AArch32 only]
    bits (4) GE, // Greater than or Equal flags [AArch32 only]
    bits (1) SSBS, // Speculative Store Bypass Safe
    bits (8) IT, // If-then bits, RES0 in CPSR [AArch32 only]
    bits (1) J, // J bit, RES0  [AArch32 only, RES0 in SPSR and CPSR]
    bits (1) T, // T32 bit, RES0 in CPSR  [AArch32 only]
    bits (1) E, // Endianness bit [AArch32 only]
    bits (5) M // Mode field   [AArch32 only]
)
可以看到,PSTATE在ARM64和ARM32中不一样。有些标志在ARM64和ARM32都存在,有些却只在ARM64或者ARM32中单独存在。
同时,不同版本的ARM架构,PSTATE也不一样,比如标志BTYPE就存在ARMv8.5版本中。
4 查看 PSTATE
按照ARM文档,在ARM32下只能通过CPSR寄存器查看PSTATE的部分标志。
ARM64想要查看PSTATE,不同的标志都有单独对应的寄存器。比如查看NZCV标志,就有NZCV寄存器,ARM64下已没有CPSR寄存器。
CPSR是32bit寄存器,结构如下:

但是在实践过程中,iPhone 13 pro是64bit的ARM架构处理器,但是却提供了CPSR寄存器,而不能访问比如NZCV寄存器:
(lldb) p/t $cpsr
(unsigned int) 0b01100000000000000001000000000000
(lldb) p/t $nzcv
error: <user expression 2>:1:1: use of undeclared identifier '$nzcv'
$nzcv
^
一文搞懂 ARM 64 系列: ADC的更多相关文章
- 一文搞懂所有Java集合面试题
		Java集合 刚刚经历过秋招,看了大量的面经,顺便将常见的Java集合常考知识点总结了一下,并根据被问到的频率大致做了一个标注.一颗星表示知识点需要了解,被问到的频率不高,面试时起码能说个差不多.两颗 ... 
- 一文搞懂指标采集利器 Telegraf
		作者| 姜闻名 来源|尔达 Erda 公众号  导读:为了让大家更好的了解 MSP 中 APM 系统的设计实现,我们决定编写一个<详聊微服务观测>系列文章,深入 APM 系统的产品.架构 ... 
- 一文搞懂RAM、ROM、SDRAM、DRAM、DDR、flash等存储介质
		一文搞懂RAM.ROM.SDRAM.DRAM.DDR.flash等存储介质 存储介质基本分类:ROM和RAM RAM:随机访问存储器(Random Access Memory),易失性.是与CPU直接 ... 
- 基础篇|一文搞懂RNN(循环神经网络)
		基础篇|一文搞懂RNN(循环神经网络) https://mp.weixin.qq.com/s/va1gmavl2ZESgnM7biORQg 神经网络基础 神经网络可以当做是能够拟合任意函数的黑盒子,只 ... 
- 一文搞懂 Prometheus 的直方图
		原文链接:一文搞懂 Prometheus 的直方图 Prometheus 中提供了四种指标类型(参考:Prometheus 的指标类型),其中直方图(Histogram)和摘要(Summary)是最复 ... 
- Web端即时通讯基础知识补课:一文搞懂跨域的所有问题!
		本文原作者: Wizey,作者博客:http://wenshixin.gitee.io,即时通讯网收录时有改动,感谢原作者的无私分享. 1.引言 典型的Web端即时通讯技术应用场景,主要有以下两种形式 ... 
- 一文搞懂vim复制粘贴
		转载自本人独立博客https://liushiming.cn/2020/01/18/copy-and-paste-in-vim/ 概述 复制粘贴是文本编辑最常用的功能,但是在vim中复制粘贴还是有点麻 ... 
- 三文搞懂学会Docker容器技术(中)
		接着上面一篇:三文搞懂学会Docker容器技术(上) 6,Docker容器 6.1 创建并启动容器 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] --na ... 
- 三文搞懂学会Docker容器技术(下)
		接着上面一篇:三文搞懂学会Docker容器技术(上) 三文搞懂学会Docker容器技术(中) 7,Docker容器目录挂载 7.1 简介 容器目录挂载: 我们可以在创建容器的时候,将宿主机的目录与容器 ... 
- 一文搞懂 js 中的各种 for 循环的不同之处
		一文搞懂 js 中的各种 for 循环的不同之处 See the Pen for...in vs for...of by xgqfrms (@xgqfrms) on CodePen. for &quo ... 
随机推荐
- 基于rv1126 rkmeida 一路多出 原理
			基于rv1126 rkmeida 一路多出的坑 首先说要的是介绍一下rkmedia 相关内容  RKMedia提供了一种媒体处理方案,可支持应用软件快速开发.RKMedia在各模块基础API上做进一 ... 
- 北京思特奇2023年校招笔试(Java)
			北京思特奇2023年校招笔试(Java) 1.表达式 (short)10/10.2*2 运算后结果是什么类型? 答案:double,浮点数默认是double,自动类型向上转换为浮点数类型 2. ser ... 
- Android按钮_单选框_多选框_文字框
			1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android= ... 
- Python爬虫爬取全球疫情数据并存储到mysql数据库
			思路:使用Python爬虫对腾讯疫情网站世界疫情数据进行爬取,封装成一个函数返回一个 字典数据格式的对象,写另一个方法调用该函数接收返回值,和数据库取得连接后把 数据存储到mysql数据库 ... 
- 鸿蒙HarmonyOS实战-ArkUI组件(Radio)
			一.Radio Radio单选框是一种表单元素,允许用户从一组选项中选择一个选项.它由一个圆圈和一个标签组成,用户只能选择其中一个选项.Radio单选框通常用于表单中,用于收集用户选择的信息,例如用户 ... 
- #离线#洛谷 5358 [SDOI2019]快速查询
			题目传送门 分析 由于询问次数很多,只能离线去做,考虑全局的操作都可以打标记. 对于单点的操作,实际上的数为 \(x'=x*Mul+Add\) 由于这两个标记单独撤销比较困难, 不妨开一个数组直接维护 ... 
- #计数#CF10C Digital Root
			题目 定义\(d(x)\)为\(x\)的数位和嵌套,直至\(0\leq d(x)<10\) 询问在\([1\sim n]\)中有多少个三元组\((a,b,c)\)满足 \[ab\neq c,d( ... 
- DevEco Device Tool 3.0 Beta2新版本发布,新增实用功能一览
			DevEco Device Tool是面向智能设备开发者提供的一站式集成开发环境,支持HarmonyOS Connect/OpenHarmony的组件按需定制,支持代码编辑.编译.烧录和调试.性能监测 ... 
- oracle 数据库连接
			前言 关于oracle 数据库如何连接,我一开始以为和mysql 和 sql server一样,写好连接语句然后调用相应的dll. 知道我遇到了两个错误: 1.64位程序不能去驱动32位客户端 2.O ... 
- c# 深克隆与浅克隆
			前言 我们都知道memberwiseclone 会将浅克隆. 什么是浅克隆?如何深克隆呢? 正文 public class good{ private good(){ oneclass=new cla ... 
