iOS で ARM の理解を開始する方法に興味があります。どんな助けでもとてもいいでしょう。
1 に答える
私の意見では、始めるための最良の方法は
- Cコードの小さなスニペットを書く(後のObjective-C)
- 対応するアセンブリコードを見てください
- アセンブリコードを理解するのに十分な情報を得る
- 繰り返す!
これを行うには、Xcode を使用できます。
- 新しい iOS プロジェクトを作成します (シングル ビュー アプリケーションで問題ありません)。
- C ファイルの scratchpad.c を追加します。
- プロジェクトのビルド設定で、「デバッグ シンボルの生成」を「いいえ」に設定します。
- ターゲットがシミュレーターではなく iOS デバイスであることを確認してください
- Scratchpad.c を開き、アシスタント エディターを開きます
- アシスタント エディターをアセンブリに設定し、[リリース] を選択します。
例 1
次の関数を scratchpad.c に追加します。
void do_nothing(void)
{
return;
}
アシスタント エディターでアセンブリを更新すると、ドット (ディレクティブ) で始まり、その後に続く多数の行が表示されます。
_do_nothing:
@ BB#0:
bx lr
ここではディレクティブを無視して、これらの 3 行を見てみましょう。インターネットで少し検索すると、これらの行が次のとおりであることがわかります。
- ラベル (アンダースコアで始まる関数の名前)。
- コンパイラによって発行された単なるコメント。
- リターンステートメント。手段分岐は、今のところ
b
無視しx
(命令セット間の切り替えと関係があります)、lr
呼び出し元が戻りアドレスを格納するリンク レジスタです。
例 2
少し強化して、コードを次のように変更しましょう。
extern void do_nothing(void);
void do_nothing_twice(void)
{
do_nothing();
do_nothing();
}
アセンブリを保存して更新すると、次のコードが得られます。
_do_nothing_twice:
@ BB#0:
push {r7, lr}
mov r7, sp
blx _do_nothing
pop.w {r7, lr}
b.w _do_nothing
繰り返しますが、インターネットで少し検索すると、各行の意味がわかります。2 つの呼び出しを行うため、さらに作業を行う必要があります。最初の呼び出しは返される必要があるため、変更する必要がありますlr
。これはblx
、 に分岐するだけでなく_do_nothing
、次の命令のアドレス (戻りアドレス) を に格納する命令によって行われlr
ます。
リターン アドレスを変更するため、どこかに格納する必要があるため、スタックにプッシュされます。2 番目のジャンプには.w
接尾辞が付いていますが、ここでは無視しましょう。関数がこのように見えないのはなぜですか?
_do_nothing_twice:
@ BB#0:
push {lr}
blx _do_nothing
pop.w {lr}
b.w _do_nothing
それもうまくいきますが、iOS では、フレーム ポインタを に格納するのが慣習ですr7
。フレーム ポインターは、前のフレーム ポインターと前の戻りアドレスを格納するスタック内の場所を指します。
つまり、コードは次のようになります。まず、スタックにプッシュし、次に新しいスタック フレーム (スタックの一番上にあり、スタックの一番上を指す) を指すように設定r7
し、次に次のように分岐します。 1回目、それから復元して、最後に2回目の分岐。呼び出された関数は、呼び出し元を指す に戻るため、最後の a は必要ありません。lr
r7
sp
r7
lr
bx lr
lr
例 3
最後の例を見てみましょう。
void swap(int *x, int *y)
{
int temp = *x;
*x = *y;
*y = temp;
}
アセンブリ コードは次のとおりです。
_swap:
@ BB#0:
ldr r2, [r0]
ldr r3, [r1]
str r3, [r0]
str r2, [r1]
bx lr
少し検索すると、引数と戻り値がレジスタに格納されていることがわかりますr0
- r3
、およびそれらを計算に自由に使用できることがわかります。コードが行うことは簡単です。と が指す値をr0
とにロードし、それらを交換した順序で格納し、分岐して戻します。r1
r2
r3
等々
それだけです: 小さなスニペットを書き、各行で何が起こっているかを大まかに理解するのに十分な情報を取得し、繰り返します。それが役立つことを願っています!