22

私は、ケンブリッジ大学のBaking Piコースに従っています。このコースでは、Raspberry Pi を対象とした、ARMv6 命令セットで構築された単純なオペレーティング システムを説明しています。

これまで、命令を介してデータをレジスタにロードする 2 つの方法を使用してきましたがldr、それらを一緒に使用していることに気づきました。両方が何をするのか完全には理解できません。

ldr r0,=0x20200000そのため、実際には「メモリ位置 0x20200000 に格納されているデータをレジスタ r0 に読み込む」と理解したようなものを使用しました。

次に、次のようなものを使用しました。

ldr r0,[r1,#4]

これは、「r1が指すメモリアドレスに格納されているデータを、4バイトのオフセットでレジスタr0に読み込む」と理解しています。

次に、これに遭遇します:

ldr r0,=pattern
ldr r0,[r0]

pattern.intこれはセクションの です.data(LED の一連のオン/オフ状態を表すビットマップ)。これを読んで、私の以前の理解=fooが間違っているに違いないことに気付きました。

構文は=x基本的にCのポインターに似ていますが、[x]構文は、指されているメモリxが実際に読み取られているかのようですか?

ptr以下の C が であるとしましょうint*。同等のアセンブリ (文字通りではなく概念的に) について考えている私のコメントは意味がありますか?

r0 = ptr;     /* equivalent to: ldr r0,=ptr     */
r0 = *ptr;    /* equivalent to: ldr r0,[ptr]    */
r0 = *(ptr+4) /* equivalent to: ldr r0,[ptr,#4] */
4

2 に答える 2