我想在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
我不确定处理器1的'var'存储是否可能或者不能在处理器0的负载和存储之间发生'var'。 那么,这是工作还是我需要像这样旋转锁:
; 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
感谢您的回答。最好的问候。
编辑: 换一种说法: 我想在'Processor 0'中执行连接并需要获取初始值。
答案 0 :(得分:0)
引用内存的xchg会自动锁定总线(或者当数据已经存在于缓存中时锁定缓存)。参见Intel reference manual,§8.3.1。 (警告:我最近没有看好,但是英特尔过去常常重新安排他们的网站,很快就会使链接无效。如果是这样的话,谷歌搜索“intel reference 3a”这样的东西应该会把它打开)。