2011-02-11 21 views
2

我對x86上按順序加載操作感興趣。就我從彙編程序列表中看到的,由編譯器生成的它在x86上以普通加載的形式實現,但就我所知,普通加載保證獲得語義,而普通存儲保證有釋放。順序一致的存儲實現爲鎖定的xchg,而作爲普通的加載進行加載。這聽起來很奇怪,請你詳細解釋一下嗎?x86上的按順序一致的原子加載

添加

就在互聯網上找到,因爲商店採用鎖定XCHG做到了連續一致的原子負載可以,只要做簡單MOV,但沒有證明和文檔沒有任何聯繫。你知道我在哪裏可以讀到嗎?

在此先感謝。

回答

0

註冊到內存傳輸,反之亦然據我所知在多處理器環境中不是原子的。

READING

XOR EAX, EAX 
LOCK XADD [address], EAX 

該第一指令將零EAX寄存器中,第二指令將交換既EAX與[地址]的內容和將兩者的總和再次存儲在[地址]。由於EAX寄存器之前爲零,因此沒有任何變化。

寫作

XCHG [address], EAX 

EAX寄存器將獲得值存儲到指定的地址。

編輯:LOCK ADD EAX,[地址]將導致「無效的操作碼異常」,因爲目標操作數沒有內存地址。

當LOCK前綴與任何其他 指令或當沒有寫操作到存儲器製成用於產生一個invalidopcode異常(#UD)。 8.1.2.2 Software Controlled Bus Locking

+0

從英特爾手冊卷3A中閱讀「8.1.1有保證的原子操作」。儘管如此,對於地址對齊知之甚少的情況(在第二個代碼中LOCK不需要,因爲處理器總是用XCHG指令鎖定) – LocoDelAssembly 2011-02-16 16:00:49

1

讀取在x86生性原子,只要它們對齊,在Intel組件手冊體積2A的MOV指令下的部分應提到這一點,相同的與LOCK前綴。其它卷也提到這一點

但是,如果你想要一個atomic read,您可以使用_InterlockedExchangeAdd((LONG*)&var,0)又名LOCK XADD,這將產生舊值,但不會改變其值,同樣可以用InterlockCompareExchange((LONG*)&var,var,var)又名LOCK CMPXCHG來完成,但國際海事組織,這是沒有必要這

8

x86上的純MOV足夠原子順序一致的負載,只要SC存儲完成與LOCK ed指令,值是正確對齊,並且「正常」WB使用緩存模式。

請參閱我的博客文章http://www.justsoftwaresolutions.co.uk/threading/intel-memory-ordering-and-c++-memory-model.html以獲取完整映射,以及英特爾處理器文檔http://developer.intel.com/products/processor/manuals/index.htm瞭解允許排序的詳細信息。

如果您使用「WC」緩存模式或「非暫存」指令(如MOVNTI),則所有投注都將關閉,因爲處理器無需及時將數據寫回主存儲器。