1
IA-32でアトミックな 'and'演算を実行したい。私はそれがプロセッサ1による「VAR」にストアがまたは負荷と「VAR」に格納することにより間occureすることはできません可能性がありますかどうかわからないんだけどIA-32 |
; processor 0
lea edx, var
mov ecx, mask
mov eax, [edx]
lock and [edx], ecx
; processor 1
lea edx, var
mov eax, 0xff
xchg [edx], eax
:
次のような状況を考えてみてください。プロセッサ0 だから、この作業であるか、私はこのようなロックをスピンする必要があります:すべての答えを
; processor 0
push ebx
lea edx, var
mov ecx, mask
@@loop:
mov ebx, [edx]
mov eax, ebx
and eax, ecx
lock cmpxchg [edx], eax
cmp eax, ebx
jne @@loop
pop ebx
感謝。宜しくお願いします。
EDIT: 他の言葉: 「プロセッサ0」で接続を実行して、初期値を取得する必要があります。
私はSystem Programming Guide 3A:Section 8.3を何度も繰り返し読んだことがありますが、特に上記の状況は私にはっきりと分かりません。副次的なこととして、これは原子性に関するものではなく、命令の順序付けに関するものです。 – 0xbadf00d
@ FrEEzE2046:申し訳ありません - 私は物事を逆に読んで、あなたが 'xchg'に暗黙的にロードとストアの間で他のストアが起こるかどうかを尋ねていると思っていました。あなたは ''と[edx]、ecx''に暗黙のL/Sについて話していますか? –
var = '31'とmask = '15'の初期値を仮定しましょう。 'プロセッサ0'は、varのアドレス(mov eax、[edx])からロードしています。その直後に、彼はリード・モディファイ・ライト・コネクションを実行しています(ロックとエックスエックス)。しかし、潜在的に同時に「プロセッサ1」はそのメモリ位置(mov eax、0xff、xchg [edx]、eax)への書き込み操作も実行しています。今私は確信していません、もし私が 'Procesor 0'にeax - registerに保存している値が同じであれば、私は接続を実行しています。私は結果としてこの値を使用しているので、確かめる必要があります、そして、それは期待されるべきです。 – 0xbadf00d