2009-10-24 7 views
26

あなたは私のことを言わなければならないでしょう。私はx86アセンブリの初心者であり、一般的にアセンブリです。AT&T構文の意味(%eax)?

だから、私の質問は、私のようなものがあります:

addl %edx,(%eax) 

%のEAXをいくつかの整数へのポインタを保持するレジスタです。それをxpと呼びましょう

これは、それが言っていることを意味しますか:*xp = *xp + %edx? (%edxは整数)

私はちょうどaddlが結果を格納する場所に混乱しています。 %eaxがintへのポインタである場合は、(%eax)がそのintの実際の値である必要があります。だからaddl%edx+(%eax)の結果を*xpに保存しますか?私は本当に誰かがこれを私に説明するのが大好きです!

本当に助けていただきありがとうございます。

答えて

50

はい、この指示は、あなたが行っていると思っている通りに正確に行っています。

ほとんどのx86算術演算命令は、ソースとデスティネーションの2つのオペランドをとります。 AT & T構文(ここで使用)では、デスティネーションは常に正しいオペランドになります。そうのような命令で:

addl %edx, %eax 

edxeaxの値が加算され、その結果がeaxに格納されています。しかし、あなたの例では、(%eax)はメモリオペランドです。それはAT &のT構文(NASM構文の角括弧のような)でかっこがどういう意味であるかです。

これはeaxがポインタとして扱われることを意味するので、右オペランドはeaxが指すアドレスから取得され、結果は同じアドレスに格納されます。

+0

+1すてきな簡単な答え。 –

+0

'(%eax)'は、[異なるアドレス指定モードの名前を付ける](https://stackoverflow.com/questions/46257018/do-terms-like-direct-indirect-addressingmode-実際にはIntel-x86-manに存在します)。 "メモリ間接"アドレッシングとは、CPUがメモリからアドレスをロードした後に、そのメモリを参照解除する*ことです(x86はメモリ間接アドレッシングをサポートしません)。 https://en.wikipedia.org/wiki/Addressing_mode#Memory_indirect –

関連する問題