一文搞懂 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 ...
随机推荐
- 学生成绩管理--C语言
# 学生成绩管理系统 效果 1.菜单选项 void welcome()//菜单 { printf("欢迎使用学生管理系统\n"); printf(" 1.增加学生信息\n ...
- 算法学习笔记【1】| LCA(最近公共祖先)
LCA(最近公共祖先) Part 1:逐步上跳 假设u,v是所求的两点,先把深度大的点逐步上移直到深度相同. 然后两者同时上移,直到第一次遇到相同的点为止. 时间复杂度: O(n)<script ...
- #费马小定理#JZOJ 4015 数列
题目 给出\(x_n=(ax_{n-1}^2+bx_{n-1}+c)\bmod m\) 给出\(x_0.a,b,c,n,m\),求\(x_n\) \(\text{Subtask 1:}n\leq 10 ...
- #环#nssl 1487 图
题目 在一个\(n\)个节点\(n\)条边的连通图中, 每条边的权值为两个端点的权值的和. 已知各边权值,求各点权值 (保证环的大小一定是奇数) 分析 考虑断掉环的某一条边,设根节点的答案为\(ax+ ...
- JDK12的新特性:CompactNumberFormat
目录 简介 CompactNumberFormat详解 自定义CompactNumberFormat 解析CompactNumber 总结 JDK12的新特性:CompactNumberFormat ...
- 实战:如何优雅的从 Skywalking 切换到 OpenTelemetry
背景 最近公司将我们之前使用的链路工具切换为了 OpenTelemetry. 我们的技术栈是: OTLP Client──────────►Collect────────►StartRocks (Ag ...
- openGauss中的sequence跟Oracle的sequence有什么区别?
openGauss 中的 sequence 跟 Oracle 的 sequence 有什么区别? openGauss 中也提供了 sequence 序列功能,使用 Oracle 的用户应该都非常喜欢使 ...
- VSCode如何通过Ctrl+P快速打开node_modules中的文件
背景 咱们新建一个NodeJS项目,必然会安装许多依赖包,因此经常需要查阅某些依赖包的源码文件.但是,由于node_modules目录包含的文件太多,出于性能考虑,在VSCode中默认情况下是禁止搜索 ...
- Python3学习--正则表达式
import rer = re.match("Chen\d+","Chen123ronghua123")r = re.match(".+", ...
- 重新点亮linux 命令树————用户和用户组的配置文件[八]
前言 简单整理一下 正文 首先看下vim /etc/passwd 这个东西. 可以看到这些就是我们的用户表. 刚才我们创建的user1就在末尾了. 那么下面有这个x:1001:1001 这个是什么意思 ...