上篇文章介绍arm64程序调用规则,这篇介绍iOS平台上的特定规则。html
在iOS平台上,基本是遵循上篇文章上的规则。可是也有几个不一样规则。ios
void two_stack_args(char w0, char w1, char w2, char w3, char w4, char w5, char w6, char w7, char s0, char s1) {}
复制代码
s0在sp处占用1个字节,s1在sp + 1处占用1个字节。而后填充知足内存对齐(sp必须是16的倍数)。 2. 在arm64标准中,当传递16字节对齐的参数时,从偶数寄存器xN开始。可是iOS中,没有这个要求。例如:bash
void large_type(int x0, __int128 x1_x2) {}
复制代码
在iOS平台,参数x1_x2在x1和x2中传递;arm64标准里,参数应该在x2和x3中传递。 3. 在arm64标准中,被调用者负责对少于32bits的参数进行0扩展或者标记;在iOS中,调用者负责扩展至32bits。app
iOS ABI和arm64标准彻底不一样。函数
typedef int __cdecl (*PInvokeFunc) (const char*, int);
int test()
{
PInvokeFunc fp = (PInvokeFunc)printf;
fp("Hello World: %d", 10); //不必定打印出Hello World: 10
return 0;
}
复制代码
解决办法是:经过IL2CPP生成包装函数。post
Data type | Size (in bytes) | Natural alignment (in bytes) |
---|---|---|
BOOL, bool | 1 | 1 |
char | 1 | 1 |
short | 2 | 2 |
int | 4 | 4 |
long | 8 | 8 |
long long | 8 | 8 |
pointer | 8 | 8 |
size_t | 8 | 8 |
NSInteger | 8 | 8 |
CFIndex | 8 | 8 |
fpos_t | 8 | 8 |
off_t | 8 | 8 |
--EOF-- 转载请保留连接,谢谢ui