ARM指令语法和PSTATE寄存器详解

ARM指令语法如下:

adc <Xd>, <Xn>, <Xm>

adc指令代表带有进位的加法,其中的”c”代表英文”carry”。

指令语义:

整个指令等价于:

(Xd, _) = Xn + Xm + PSTATE.C

该指令将寄存器Xn、寄存器Xm和PSTATE中的进位标志相加,将结果写入寄存器Xd,但丢弃产生的进位。

adc指令只使用PSTATE中的进位标志,但最终结果不影响PSTATE中的进位标志。

PSTATE:

PSTATE代表处理器状态,存储着ARM CPU运行时的一些状态。PSTATE中最常见的状态是NZCV:

N: 借位标志 - Negative Condition flag
Z: 0 - Zero Condition flag
C: 进位标志 - Carry Condition flag
V: 溢出标志 - Overflow Condition flag

要表示PSTATE中的某一标志,比如进位,可以写成PSTATE.C。

除了NZCV这4个标志外,PSTATE还有其他标志。在ARM64和ARM32中,PSTATE的标志不尽相同。有些标志在ARM64和ARM32中都存在,有些只在其中一个版本中存在,比如标志BTYPE只存在于ARMv8.5版本中。

查看PSTATE:

根据ARM文档,在ARM32下只能通过CPSR寄存器查看PSTATE的部分标志。而在ARM64下,不同的标志都有单独对应的寄存器。比如查看NZCV标志,就有NZCV寄存器。在ARM64下已经没有CPSR寄存器。

// 按文档,ARM64 下查看 PSTATE 的寄存器
寄存器名       查看的标志
NZCV          N, Z, C, V
DAIF          D, A, I, F
CurrentEL     EL
SPSel         SP
PAN           PAN
UAO           UAO
DIT           DIT
SSBS          SSBS
TCO           TCO
ALLINT        ALLINT

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指令语法和PSTATE寄存器详解