ケンブリッジ大学のBaking Piコースでは、ラズベリーパイをターゲットにしたARMv6命令セットにシンプルなオペレーティングシステムが組み込まれています。ARMv6アセンブリの= label(等号)と[label](角かっこ)の違いは何ですか?
これまでのところ、ldr
命令を使用してデータをレジスタにロードする2つの方法を使用していましたが、今ではそれらを一緒に使用していることを認識しています。
ldr r0,[r1,#4]
:。私は実際のようなレジスタr0にメモリ位置0x20200000に格納されたデータを読み取る
をそれから私が使用したもの」として理解ldr r0,=0x20200000
よう
だから私が使用したもの、 。
0123:私があると理解しました「メモリアドレスに格納されたデータを読み出すには、レジスタR0に、4バイトのオフセットで、R1によって指し示さ」
をそして私はこれを遭遇します
ldr r0,=pattern
ldr r0,[r0]
pattern
ここでは.data
セクションの.int
(LEDのオン/オフ状態のシーケンスを表すビットマップ)です。私はこれを読んで、前の理解が=foo
であることが間違っていなければならないことを理解します。そうでなければ、上記の両方の指示が同じことをするでしょう。
=x
の構文は、基本的にCのポインタのようですが、[x]
の構文は、x
が指し示すメモリが実際に読み取られているかのようです。
以下のCのptr
がint*
であるとします。私のコメントは、同等のアセンブリ(概念的には、文字通りではない)について考えても意味がありませんか?
r0 = ptr; /* equivalent to: ldr r0,=ptr */
r0 = *ptr; /* equivalent to: ldr r0,[ptr] */
r0 = *(ptr+4) /* equivalent to: ldr r0,[ptr,#4] */
可能な重複します。http:// stackove rflow.com/questions/14046686/ldr-vs-mov-arm-assembly http://stackoverflow.com/questions/9374703/llvm-gcc-assembler-ldr-syntax http://stackoverflow.com/questions/9735169/ iphone-assembly-compilation-error-with-ldr-parameters –