procedure DoSomethingCritical(var Lock: integer); var Temp: integer; begin { Initialize lock } Lock := -1; { Enter Lock } repeat Inc(Lock); Temp := Lock; if Temp > 0 then Dec(Lock); until not (Temp > 0); { Perform operations } { Leave Lock } Dec(Lock); end; procedure AsmDoSomethingCritical(var Lock: integer); asm { Initialize lock } lock mov dword ptr[eax],$FFFFFFFF { Enter Lock } @spin: lock inc dword ptr[eax] mov edx,[eax] test edx,edx jng @skipdec lock dec dword ptr[eax] @skipdec: test edx,edx jg @spin { Perform operations } { Leave Lock } lock dec dword ptr[eax] end;