ARMv8 arch overview
32bit user @ 64 bit kernel
ARMv8支持64-bit 和32-bit所规范的层次结构
ARMv8arch overview-generalregister layout
Armv8架构下有31个通用寄存器(R0-R30),每个寄存器有64bit的位宽。访问方式:
Programming Type | ILP32 | LP64(linux) | LLP64(windows) |
char | 8-bit | 8-bit | 8-bit |
short | 16-bit | 16-bit | 16-bit |
int | 32-bit | 32-bit | 32-bit |
long | 32-bit | 64-bit | 32-bit |
long long | 64-bit | 64-bit | 64-bit |
float | 32-bit | 32-bit | 32-bit |
double | 64-bit | 64-bit | 64-bit |
size_t | 32-bit | 64-bit | 64-bit |
void * (pointer) | 32-bit | 64-bit | 64-bit |
intptr_t | 32-bit | 64-bit | 64-bit |
ptrdiff_t | 32-bit | 64-bit | 64-bit |
3. 高位截断
longlongSetBitN(longlong value, unsignedbitNum)
{
longlong mask
mask = (longlong) 1 <<bitNum;
return value |msk;
}
或者
{
longlong mask
mask = 1LL<<bitNum;
return value |mask;
}
5.位域操作#defineINVALID_POINTER_VALUE 0xFFFFFFFF
Const signedintINVALID_POINTER_VALUE = 0xFFFF FFFF
代码检查check list
声明 | (1)如果变量32bit平台是32位的,64bit平台是32位的,根据需要可以将其类型定义为int |
(2)如果变量32bit平台是32位的,64bit平台是64位的,根据需要可以将其类型定义为long | |
(3)防止符号扩展,需要Check变量是否可以定义成unsigned. | |
(4)防止符号扩展,需要Check常量是否需要添加“L”或者“U”来约束. | |
表达式 | (1)Check表达式是否存在显示类型转换 |
(2)注意隐形转化,需要Check表达式操作数是否混合使用不同数据类型. | |
(3)注意隐形转化,需要Check表达式操作数是否混合使用有符号数与无符号数. | |
赋值 | (1)Check是否存在把指针变量赋值给int |
(2)Check是否存在把int赋值给指针变量 | |
(3)Check是否存在左值&&右值数据类型不一致 | |
函数参数相关 | (1)Check调用到的函数,是否已经声明。 |
(2)Check实参数据类型与形参数据类型是否匹配。 | |
字符串格式化 | (1)Check地址打印,尽量使用printk("addr=%p\n", addr)格式. |
(2)Check整型打印,例如int型用%d或者%x、long型用%ld或者%lx. |