Я хочу выполнить атомарную 'и' операцию на 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
Я не уверен, возможно ли, что сохранение в 'var' процессором 1 может или не может происходить между загрузкой и сохранением в 'var' процессором 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» и мне нужно получить начальное значение.