web-dev-qa-db-ja.com

AT&T構文での(%eax)の意味は?

失礼します。私はx86アセンブリ、および一般的なアセンブリを初めて使用します。

だから私の質問は、私は次のようなものを持っています:

_addl %edx,(%eax)
_

%eaxは、ある整数へのポインタを保持するレジスタです。それをxpと呼びましょう

これは、次のように言っていることを意味します:_*xp = *xp + %edx_? (_%edx_は整数です)

Addlが結果をどこに保存するのか混乱しています。 _%eax_がintへのポインターである場合、_(%eax)_はそのintの実際の値である必要があります。では、addl%edx+(%eax)の結果を_*xp_に格納しますか?誰かが私にこれを説明してくれることを本当に望んでいます!

私は本当に助けに感謝します!

27
kodai

はい、この命令はあなたが思っていることを正確に実行しています。

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

addl %edx, %eax

edxeaxの値が合計され、結果がeaxに保存されます。ただし、あなたの例では、(%eax)はメモリオペランドです。これがAT&T構文での括弧の意味です(NASM構文の角括弧のように)。

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

51
Jay Conrod