私は、ケンブリッジ大学の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] */