2013-06-20 11 views
10

ケンブリッジ大学の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のptrint*であるとします。私のコメントは、同等のアセンブリ(概念的には、文字通りではない)について考えても意味がありませんか?

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

可能な重複します。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 –

答えて

14
ldr r0,=something 
... 
something: 

レジスタr0にラベル何かのアドレスをロードすることを意味します。アセンブラは、LDR命令の到達範囲のどこかに単語を追加し、

ldr r0,[pc,#offset] 

命令

ldr r0,=0x12345678 

をr0にロード0x12345678のことを意味ので、このショートカットに置き換えます。

はほとんどが固定長命令ですので、32ビットの即値を1命令のレジスタにロードすることはできません。32ビットのレジスタを完全にロードするには、いくつかの命令が必要です。番号に大きく依存します。例えば

ldr r0,=0x00010000 

は、単一の命令MOV R0とGNUアセンブラによって置き換えられてしまいます、#0x00010000これはARM命令の場合は、Thumb命令のために、それはまだのLDR R0でなければならないかもしれませんが、[PC、#オフセット]

これらのldr rd =は、ショートカットであり、擬似命令であり、実際のものではありません。

ldr rd,[rm,#offset] 
ldr rd,[rm,rn] 

は本当の命令であり、アドレスRMでメモリから読み出さ+オフセットまたは平均RM + RNと読み値を取り、レジスタrdに入れ

=何かがCでより多くのような&なものです。

unsigned int something; 
unsigned int r0; 
unsigned int r1; 

r0 = &something; 
r1 = *(unsigned int *)r0; 

とアセンブリで

something: 
    .word 0 

ldr r0,=something 
ldr r1,[r0] 
+0

これは非常に明確です。 :) – d11wtq

関連する問題