これは iPhone での syscall() の逆アセンブルです。
(gdb) disass syscall
Dump of assembler code for function syscall:
0x3195fafc <syscall+0>: mov r12, sp
0x3195fb00 <syscall+4>: push {r4, r5, r6, r8}
0x3195fb04 <syscall+8>: ldm r12, {r4, r5, r6}
0x3195fb08 <syscall+12>: mov r12, #0 ; 0x0
0x3195fb0c <syscall+16>: svc 0x00000080
0x3195fb10 <syscall+20>: pop {r4, r5, r6, r8}
0x3195fb14 <syscall+24>: bcc 0x3195fb2c <syscall+48>
0x3195fb18 <syscall+28>: ldr r12, [pc, #4] ; 0x3195fb24 <syscall+40>
0x3195fb1c <syscall+32>: ldr r12, [pc, r12]
0x3195fb20 <syscall+36>: b 0x3195fb28 <syscall+44>
0x3195fb24 <syscall+40>: cfldrdeq mvd15, [r12], #992
0x3195fb28 <syscall+44>: bx r12
0x3195fb2c <syscall+48>: bx lr
End of assembler dump.
オフセット +28、+32 の命令が何をしているのか説明してもらえますか? +28 では r12 の値は 0 (+12 で設定) であるため、r12 は (C 表記で) *(pc + 4) に設定されているように見えます。+32 では、r12 は *(pc + r12) に設定されます。この命令はコンパイルされていないことに注意してください。以下の #3 を参照してください。+36 の 'b' は +44 にジャンプし、r12 のアドレスに戻ります。では、+28 と +32 によって r12 にロードされた値は?
+40 の cfldrdeq 命令は何をしますか? ARM命令セットをチェックして検索しましたが、何も見つかりませんでした。
asm ()を使用して、このコードを C プログラムに追加しました。コンパイル時に、コンパイラはこれらのエラーを表示します。これを回避する方法はありますか?
/var/folders/62/3px_xsd56ml5gz18lp8dptjc0000gv/T//ccDThXFx.s:7607: PC 相対アドレッシングでレジスタ インデックスを使用できません --ldr r12,[pc,r12]' /var/folders/62/3px_xsd56ml5gz18lp8dptjc0000gv/T//ccDThXFx.s:7609:selected processor does not support
cfldrdeq mvd15,[r12],#992'