上篇文章介紹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