2011-02-04 8 views
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」で接続を実行して、初期値を取得する必要があります。

答えて

0

メモリを参照するxchgは、自動的にバスをロックします(または、データがキャッシュに既に存在する場合はキャッシュをロックします)。 Intel reference manual、§8.3.1を参照してください。 (警告:最近は難しくはないが、インテルはウェブサイトを再編成し、リンクをかなり早く無効にしていた。「インテルリファレンス3a」のようなものでグーグル化すればよい)。

+0

私はSystem Programming Guide 3A:Section 8.3を何度も繰り返し読んだことがありますが、特に上記の状況は私にはっきりと分かりません。副次的なこととして、これは原子性に関するものではなく、命令の順序付けに関するものです。 – 0xbadf00d

+0

@ FrEEzE2046:申し訳ありません - 私は物事を逆に読んで、あなたが 'xchg'に暗黙的にロードとストアの間で他のストアが起こるかどうかを尋ねていると思っていました。あなたは ''と[edx]、ecx''に暗黙のL/Sについて話していますか? –

+0

var = '31'とmask = '15'の初期値を仮定しましょう。 'プロセッサ0'は、varのアドレス(mov eax、[edx])からロードしています。その直後に、彼はリード・モディファイ・ライト・コネクションを実行しています(ロックとエックスエックス)。しかし、潜在的に同時に「プロセッサ1」はそのメモリ位置(mov eax、0xff、xchg [edx]、eax)への書き込み操作も実行しています。今私は確信していません、もし私が 'Procesor 0'にeax - registerに保存している値が同じであれば、私は接続を実行しています。私は結果としてこの値を使用しているので、確かめる必要があります、そして、それは期待されるべきです。 – 0xbadf00d

関連する問題