初代ARM处理器就是32位CPU。所以它的word型数据都是32位数据。这方面它和x86有所不同。
byte 8位数据。声明byte型数组和变量的指令是DB。
halfword 16位数据。声明halfword型数组和变量的指令是DCW。
word 32位数据。声明word型数组和变量的指令是DCD。
doubleword 64位数据。
quadword 128位数据。
ARMv4:开始支持Thumb模式的指令。
ARMv6:用于第一代iPhone、iPhone 3G(这些设备的处理器采用了Samsung 32位RISC ARM 1176IZ(F)-S,支持Thumb-2指令)。
ARMv7:实现了Thumb-2指令(2003)。用于iPhone 3GS、iPhone 4、iPad 1(ARM Crotex-A8)、iPad 2(Cortex-A9)和iPad 3。
ARMv7s:添加了新的指令。用于iPhone 5、iPhone 5c和iPad 4(Apple A6)。
ARMv8:64位CPU,又叫作ARM64、AArch64。用于iPhone 5S、iPad Air(Apple A7)。64位平台不支持Thumb模式,只支持ARM模式的指令(4字节指令)。
R0。函数的返回结果通常通过R0传递。
R1~R12。通用寄存器GPRs。
R13。SP(Stack Pointer/栈指针)。
R14。LR(link register/链接寄存器)。
R15。PC(程序计数器)。
R0~R3也被称为临时寄存器(scratch registers)。它们通常用于传递函数的参数;在函数结束时,也不必恢复它们的初始状态。
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—负号位/小于标识位 |
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)的存储空间。
64位ARM的寄存器总数,是32位ARM的两倍之多。
X0。常用于传递函数运算结果。
X0~X7。传递函数参数。
X8。
X9~X15。临时寄存器,供被调用方函数使用,函数退出时无需恢复。
X16。
X17。
X18。
X19~X29。被调用方函数使用的寄存器,在函数退出时需要恢复原值。
X29。用作帧指针/FP(至少GCC把它当作FP)。
X30。链接寄存器/LR(link register)。
X31。这个寄存器一直为0,又称为XZR、“零寄存器”。它的32位(word型)部分还叫作WZR。
SP,64位系统有单独的栈指针寄存器,不再使用通用寄存器。
详细内容请参见官方的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
|
ARM64的部分指令存在对应的、带S后缀的指令。这个后缀代表着该指令会根据结果设置相应的标识位,而不带S后缀的指令就不设置标识位。以ADD和ADDS指令为例,前者只进行数学运算而不会设置标识位。这种功能划分,为ARM系统的预处理功能提供了可靠的保证,绝不会意外地影响到CMP指令和其他条件转移需要的各标识位。
代 码 |
描 述 |
标 识 位 |
---|---|---|
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 |