| LOCK |
| Заключване на шината |
| Общи форми: |
LOCK |
| |
| Форма |
КОП |
|
I8086 |
I80386 |
I80486 |
| LOCK |
F0 |
|
2 |
2 |
2 |
|
| Действие: |
Указва на процесора да забрани предаването на шината на друго устройство през цялото време, за което се изпълнява инструкцията. Външно това се индицира чрез активиране на сигнала LOCK. Този префикс позволява изпълнението на неделими операции четене-модификация-запис за всички инструкции от този тип.
386+ поставят ограничение върху инструкциите, които могат да използват префикс LOCK. Това са само точно инструкциите от типа четене-модифициране-запис:
- BTS, BTR, BTC m, r/i
- АDD, ADC, SUB, SBB, AND, OR, XOR m, r/i
- NOT, NEG, INC, DEC m
- XADD, CMPXCHG m,r
- CMPXCHG8B, CMPXCHG16B
- XCHG m,r
Във всички останали случаи процесорът генерира #UD.
Като недостатък може да отбележи, че инструкциите за изместване и ротация (също от вида четене-модифициране-запис) не позволяват използване на LOCK.
I80286 няма ограничение върху LOCK, но при него той е зависим от IOPL: ако IOPL < CPL, инструкция с LOCK предизвиква #GP(0). В 386 тази зависимост е премахната като излишна (и дори вредна).
Процесорът автоматично активира LOCK при следните случаи:
- инструкция XCHG m, r
- установяване бита A на дескриптор (I80486+: само ако още не е установен. За целта втората двойна дума на дескриптора се чете без блокиране; ако A = 0, шината се блокира, двойната дума се прочита отново, битът се вдига и се записва обратно. Първата двойна дума се прочита при блокирана шина. Ако A = 1, се прочита и първата двойна дума без блокировка. В многопроцесорна система свалянето на бита A задължително трябва да става с инструкция LOCK BTR или LOCK AND);
- промяна на бита за заетост в дескриптор на задача
- установяване битовете A и/или D в описанието на страница. Осъществява се по горната схема.
|
| Флагове |
| PE |
VM |
NT |
IOPL |
OF |
DF |
IF |
TF |
SF |
ZF |
AF |
PF |
CF |
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| CPU |
| 8086 |
186 |
V20 |
286 |
386 |
486 |
P |
P-P |
P-II |
MMX |
SSE |
3D! |
E64 |
| • |
• |
• |
• |
• |
• |
• |
• |
• |
|
|
|
• |
|
| Изключения |
| Реален режим |
| #UD |
Неправилно използване на префикса |
| Защитен режим |
| #UD |
Неправилно използване на префикса |
| #GP(0) |
Само I80286: CPL > IOPL |
| V86 режим |
| #UD |
Неправилно използване на префикса |
|