9

私は現在、クラスの ARM アセンブリを学習していて、「配列」を使用する必要がある問題に遭遇しました。ARMには配列のようなものがないことを知っているので、スペースを割り当ててそれを配列として扱う必要があります。2 つの質問があります。

  1. 配列に新しい値を正しく追加していますか、それとも以前の値を上書きしているだけですか? 値を上書きする場合、新しい値を追加するにはどうすればよいですか?
  2. 配列のさまざまな値をループするにはどうすればよいですか? 使用する必要loop:があることはわかっていますが、それを使用してさまざまな「インデックス」にアクセスする方法がわかりません。

これまでのところ、オンラインのリソースから収集した ARM のドキュメントを読んで得たものは次のとおりです。

        .equ SWI_Exit,  0x11

        .text
        .global _start

_start: .global _start
        .global main

        b       main

main:
        ldr     R0, =MyArray
        mov     R1, #42
        str     R1, [R0], #4
        mov     R1, #43
        str     R1, [R0], #4
        swi     SWI_Exit

MyArray: .skip 20 * 4
        .end

補足として、私は教授の要求に応じてARMSim#を使用しているため、GNU ツールで認識される一部のコマンドが ARMSim# で認識されないか、少なくともそうであると考えています。私が間違っている場合は、私を修正してください。

4

1 に答える 1

3
  1. 要素を上書きしているだけです。このレベルには「配列など」がありますが、固定サイズの事前に割り当てられた配列のみです。は.skip、固定サイズの配列を割り当てています。* 可変サイズの拡張可能な配列は、通常、スタックまたはヒープを使用して、より複雑な動的メモリ割り当てコードで実装されます。
  2. (実際の名前は任意です) のようなラベルがある場合は、loop:を使用してそれに分岐 (戻る) できますb loop。(おそらく、プログラムが永遠にループしないように、条件付きで分岐を実行する必要があります。) を変更することで、ループ内のさまざまな要素にアクセスできますR0が、これは既に行っています。

また、b main次の命令に分岐しているため、実際には何の役にも立ちません。コードを削除すると、コードは同じことを行います。

[*] あるいは、あなたの配列は と の間の単なる要素 (メモリポイントを含まない) であると言うことができますMyArrayR0変更R0するR0ことで配列を拡張しています。ただし、最大サイズは依然として.skipディレクティブによって固定されています。

于 2013-10-12T08:36:13.147 に答える