メモ - 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をアサートすると。