[解決済み] ARMアセンブリループ
2022-02-15 18:31:02
質問内容
for (int i = 0; i < 10000; i++)
a[i] = b[i] + c[i]
この高級言語のARMアセンブリはどのようなものでしょうか?
編集する また、AのベースアドレスはR8、BのベースアドレスはR7と仮定しています。 BのベースアドレスはR9、CのベースアドレスはR10になります。 で、A,B,Cはすべてint型配列です。
ありがとうございました。
試してみました。
MOV R0, #0 ; Init r0 (i = 0)
Loop:
a[i] = b[i] + c[i] //How to fix this?
ADD R0, R0, #1 ;Increment it
CMP R0, #1000 ;Check the limit
BLE Loop ;Loop if not finished
解決方法は?
この高級言語がC言語と衝突することがないと仮定すると、アームCコンパイラを使ってスニペットからアセンブリコードを作成することができます。例えば、test.cに以下のような記述があったとします。
void test() {
register int i asm("r0");
register int *a asm("r8");
register int *b asm("r9");
register int *c asm("r10");
for (i = 0; i < 10000; i++) {
a[i] = b[i] + c[i];
}
}
を実行することができます。
arm-linux-androideabi-gcc -O0 -S test.c
を実行して test.s ファイルを作成します。このファイルには、テスト関数のアセンブリコードと、いくつかの追加要素が含まれます。ループがどのようにアセンブリにコンパイルされたかは、以下で見ることができます。
<snipped>
.L3:
mov r2, r8
mov r3, r0
mov r3, r3, asl #2
add r3, r2, r3
mov r1, r9
mov r2, r0
mov r2, r2, asl #2
add r2, r1, r2
ldr r1, [r2, #0]
mov ip, sl
mov r2, r0
mov r2, r2, asl #2
add r2, ip, r2
ldr r2, [r2, #0]
add r2, r1, r2
str r2, [r3, #0]
mov r3, r0
add r3, r3, #1
mov r0, r3
.L2:
mov r2, r0
ldr r3, .L5
cmp r2, r3
ble .L3
sub sp, fp, #12
ldmfd sp!, {r8, r9, sl, fp}
bx lr
<snipped>
この方法の問題点は、コンパイラがあなたの研究に最適なコードを生成してくれると信じていることです。必ずしもそうではないかもしれませんが、人を待たせる代わりに、上記のようにあなたの質問に素早く答えてくれるようになります :)
-- おまけ --
GCC では、変数を特定のレジスタに入れることができます。 関連ドキュメント .
アーム・インストラクション・チートシートを入手することができます こちら .
GCCの新しいバージョンは、期待されるように、より良いarmコードを作成します。上記はバージョン4.4.3で生成されたものですが、私は以下のことを確認できました。 リナロ の4.7.1が私の主張の証明です。ですから、もしあなたが私のアプローチを取るなら、あなたが入手できる最新のツールチェーンを使用してください。
関連
-
[解決済み】Nasmエラー:オペコードとオペランドの無効な組み合わせ
-
[解決済み] テスト
-
[解決済み] MIPSでディブディブ
-
[解決済み] MIPS分岐実行順序(beqz)
-
[解決済み] .quadディレクティブはアセンブリでどのように機能するのですか?
-
[解決済み] この状況でのlwとbneは何を意味するのか?
-
[解決済み] JavaScriptのオブジェクトをループスルーまたは列挙するにはどうすればよいですか?
-
[解決済み] Javaでenumを繰り返し処理するためのforループ
-
[解決済み] Collatz予想の検証を行うC++のコードは、なぜ手書きのアセンブリよりも高速に動作するのでしょうか?
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン