Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Serialization IA-32 |多处理器环境中的重新排序问题_Serialization_Assembly_X86 - Fatal编程技术网

Serialization IA-32 |多处理器环境中的重新排序问题

Serialization IA-32 |多处理器环境中的重新排序问题,serialization,assembly,x86,Serialization,Assembly,X86,我想在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

我想在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
谢谢你的回答。致以最良好的祝愿

编辑: 换言之:
我想在“处理器0”中执行连接,需要获取初始值。

引用内存的xchg会自动锁定总线(或在数据已在缓存中时锁定缓存)。见第8.3.1条。(警告:我最近没怎么看,但英特尔过去经常重新安排他们的网站,相当快地使链接失效。如果是这样,谷歌搜索“英特尔参考3a”之类的东西应该会打开它)。

我已经一遍又一遍地读了《系统编程指南3a:第8.3节》,但尤其是上面的情况我并不完全清楚。顺便说一句,这根本不是关于原子性,而是关于指令顺序。@FrEEzE2046:对不起,我倒读了一些东西,还以为你在问另一个存储是否会发生在
xchg
中隐含的加载和存储之间。您是说
和[edx],ecx
中隐含的信用证吗?让我们假设var的初始值为'31',mask为'15'处理器0'正在从var的地址(mov eax,[edx])加载。紧接着,他正在执行读-修改-写连接(lock和[edx],ecx)。但,可能同时,“处理器1”也在对该内存位置(mov eax,0xff,xchg[edx],eax)执行写操作。现在我不确定,如果保证我在'Procesor 0'中存储到eax-寄存器的值与我执行连接的值相同。我需要确定,因为我使用这个值作为结果,它应该是预期的。