附录B ARM

B.1 术语

初代ARM处理器就是32位CPU。所以它的word型数据都是32位数据。这方面它和x86有所不同。

byte     8位数据。声明byte型数组和变量的指令是DB。

halfword  16位数据。声明halfword型数组和变量的指令是DCW。

word    32位数据。声明word型数组和变量的指令是DCD。

doubleword 64位数据。

quadword  128位数据。

B.2 版本差异

B.3 32位ARM(AArch32)

B.3.1 通用寄存器

R0~R3也被称为临时寄存器(scratch registers)。它们通常用于传递函数的参数;在函数结束时,也不必恢复它们的初始状态。

B.3.2 程序状态寄存器/CPSR

CPSR的全称是Current Program Status Register,其规格如下表所示。

位  序

描  述

0~4

M—处理器模式控制位

5

T—Thumb模式控制位

6

F—FIQ禁止位

7

I—IRQ/中断禁止位

8

A—imprecise data abort disable

9

E—数据字节序状态位

10..15,25,26

IT—if–then状态位

16..19

GE—greater-than-or-equal-to

20..23

DNM—Do Not Modify

24

J—Java state

27

Q—sticky overflow表达式整体溢出(相对于各独立因子溢出)标识位

28

V—Overflow溢出标识位

29

C—进位/借位/扩展位

30

Z—零标识位

31

N—负号位/小于标识位

B.3.3 VFP(浮点)和NEON寄存器
0~31bits 32~64 65~96 97~127
Q0128bits
D064bits
D1
S032bits
S1
S2
S3

S寄存器为32位寄存器,用于存储单精度数。

D寄存器位64位寄存器,用于存储双精度数。

D寄存器和S寄存器的存储地址相通。程序可以通过S寄存器的助记符访问D寄存器的数据。虽然这种操作毫无实际意义,但是确实可行。

与之相似的是,NEON的Q寄存器是128位寄存器,与其他浮点数寄存器共用CPU的物理存储空间。

VFP里有32个S寄存器,即S0~S31。VFP v2里又新增了16个D寄存器,实际上这些D寄存器用的还是S0~S31的存储空间。

再后来,VFPv3(NEON或者叫作“Advanced SIMD”)再次添加了16个D寄存器,形成了D0~D31。这几个新增的寄存器,即D16~D31寄存器的存储空间,终于和S寄存器的存储空间相互独立。

NEON或Advanced SIMD也有16个128位Q寄存器,它们使用的是D寄存器(D0~D31)的存储空间。

B.4 64位ARM(AArch64)

通用寄存器

64位ARM的寄存器总数,是32位ARM的两倍之多。

详细内容请参见官方的ARM资料《Procedure Call Standard for the ARM 64-bit Architecture (AArch64)》(http://infocenter.arm.com/help/topic/com.arm.doc.ihi0055b/IHI0055B_ aapcs64.pdf

)。

程序还可通过其W寄存器这样的助记符访问64位X寄存器的低32位空间。W寄存器和X寄存器的对应关系如下表所示。

高32位部分
低32位部分
X0
W0

B.5 指令

ARM64的部分指令存在对应的、带S后缀的指令。这个后缀代表着该指令会根据结果设置相应的标识位,而不带S后缀的指令就不设置标识位。以ADD和ADDS指令为例,前者只进行数学运算而不会设置标识位。这种功能划分,为ARM系统的预处理功能提供了可靠的保证,绝不会意外地影响到CMP指令和其他条件转移需要的各标识位。

Conditional codes速查表

代  码

描  述

标 识 位

EQ

相等

Z==1

NE

相异

Z==0

CS/HS

Carry置位/Unsigned,大于或等于

C==1

CC/LO

Carry为零/Unsigned,小于

C==0

MI

Minus,负数/小于

N==1

PL

Plus,正数或零/大于或等于

N==0

VS

溢出

V==1

VC

未溢出

V==0

HI

Unsigned大于

C==1 and Z==0

LS

Unsigned小于或等于

C==0 or Z==1

GE

Signed大于或等于

N==V

LT

Signed小于

N !=V

GT

Signed大于

Z==0 and N==V

LE

Signed小于或等于

Z==1 or N !=V

None/AL

Always

Any