メモ - LOCK prefix

IA-32のLOCKは、後に続く命令がatomicな動作をするようにLOCK# signalをアサートする。だから、LOCK prefixなわけか。そして、LOCKに続く命令は決まっていて、違う命令がLOCKに続いた場合、invalid-opcode exceptionが投げられると。

DWORD x = 4;
_asm
{
	push eax
	mov eax, 100
	lock xadd x, eax //xaddはlockのあとにおける命令。
	pop eax
}

は何も問題なく実行されて、アプリケーションが終了したけれども、

DWORD x;
_asm
{
	lock mov x, eax //movはlockのあとにおけない命令。
}

は、例外が投げられた。なるほどね。
(上の例はVC++6.0のインラインアセンブラです)
あと、XCHGはメモリーオペランドの場合、自動的にLOCK# signalをアサートすると。