1. ホーム
  2. assembly

[解決済み] 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が私の主張の証明です。ですから、もしあなたが私のアプローチを取るなら、あなたが入手できる最新のツールチェーンを使用してください。