失礼します。私はx86アセンブリ、および一般的なアセンブリを初めて使用します。
だから私の質問は、私は次のようなものを持っています:
_addl %edx,(%eax)
_
%eaxは、ある整数へのポインタを保持するレジスタです。それをxpと呼びましょう
これは、次のように言っていることを意味します:_*xp = *xp + %edx
_? (_%edx
_は整数です)
Addlが結果をどこに保存するのか混乱しています。 _%eax
_がintへのポインターである場合、_(%eax)
_はそのintの実際の値である必要があります。では、addl
は%edx+(%eax)
の結果を_*xp
_に格納しますか?誰かが私にこれを説明してくれることを本当に望んでいます!
私は本当に助けに感謝します!
はい、この命令はあなたが思っていることを正確に実行しています。
ほとんどのx86算術命令は、ソースとデスティネーションの2つのオペランドを取ります。 AT&T構文(ここで使用)では、宛先は常に正しいオペランドです。したがって、次のような命令で:
addl %edx, %eax
edx
とeax
の値が合計され、結果がeax
に保存されます。ただし、あなたの例では、(%eax)
はメモリオペランドです。これがAT&T構文での括弧の意味です(NASM構文の角括弧のように)。
これは、eax
がポインタとして扱われることを意味します。したがって、右のオペランドはeax
が指すアドレスから取得され、結果は同じアドレスに格納されます。