暗号化および復号化アプリを開発しています。bignum アルゴリズムを使用しています。それが polarSSL です。Xcode シミュレーターでは問題なく動作し、ファイルの復号化に成功しましたが、実際のデバイス (iPad 4) で同じプロジェクトを実行すると、クラッシュしました。
だから私はそれをデバッグし、理由を見つけました。シミュレーターでは、次のコードを実行します。
#if defined(__i386__)
#define MULADDC_INIT \
asm( "movl %0, %%esi " :: "m" (s)); \
asm( "movl %0, %%edi " :: "m" (d)); \
asm( "movl %0, %%ecx " :: "m" (c)); \
asm( "movl %0, %%ebx " :: "m" (b));
#define MULADDC_CORE \
asm( "lodsl " ); \
asm( "mull %ebx " ); \
asm( "addl %ecx, %eax " ); \
asm( "adcl $0, %edx " ); \
asm( "addl (%edi), %eax " ); \
asm( "adcl $0, %edx " ); \
asm( "movl %edx, %ecx " ); \
asm( "stosl " );
#define MULADDC_STOP \
asm( "movl %%ecx, %0 " :: "m" (c)); \
asm( "movl %%edi, %0 " :: "m" (d)); \
asm( "movl %%esi, %0 " :: "m" (s) : \
"eax", "ecx", "edx", "ebx", "esi", "edi" );
while in iPad4, it execute the following code:
#if defined(__arm__)
#define MULADDC_INIT \
asm( "ldr r0, %0 " :: "m" (s)); \
asm( "ldr r1, %0 " :: "m" (d)); \
asm( "ldr r2, %0 " :: "m" (c)); \
asm( "ldr r3, %0 " :: "m" (b));
#define MULADDC_CORE \
asm( "ldr r4, [r0], #4 " ); \
asm( "mov r5, #0 " ); \
asm( "ldr r6, [r1] " ); \
asm( "umlal r2, r5, r3, r4 " ); \
asm( "adds r7, r6, r2 " ); \
asm( "adc r2, r5, #0 " ); \
asm( "str r7, [r1], #4 " );
#define MULADDC_STOP \
asm( "str r2, %0 " :: "m" (c)); \
asm( "str r1, %0 " :: "m" (d)); \
asm( "str r0, %0 " :: "m" (s) : \
"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7" );
理由は明らかです。デバイスの cpu は ARM アーキテクチャであり、シミュレータは i386 です。しかし、i386 コードはアームが失敗したときに正常に実行できたので混乱しました。これらの asm コードは polarSSL から来ており、標準のアーム命令で書かれています。ですから、Apple Inc が CPU アーキテクチャを変更したのではないかと思います。ご存じのように、iPad 4 の CPU は Apple が設計した A6X です。だから私はこの問題を解決する方法がわかりません.誰かが私を助けてくれることを願っています.どうもありがとう