Как использовать префикс LOCK ASM для чтения значения? - PullRequest
6 голосов
/ 27 июля 2010

Я знаю, как использовать LOCK для поточного увеличения значения:

  lock inc     [J];

Но как мне прочитать [J] (или любое значение) в поточно-ориентированном режиме?Префикс LOCK нельзя использовать с mov.И если я сделаю следующее:

  xor eax, eax;
  lock add eax, [J];
  mov [JC], eax;

В строке 2 появится ошибка.

1 Ответ

9 голосов
/ 27 июля 2010

Используйте XADD или MOV вместо инструкции ADD! См. Также MFENCE , LFENCE и SFENCE инструкции!

EDIT: Вы не можете использовать инструкцию LOCK с командой ADD, если исходный операнд является операндом памяти!

От: «Руководство разработчика программного обеспечения Intel® 64 и IA-32 Architectures»

Префикс LOCK может быть добавлен только перед к следующим инструкциям и только к этим формам инструкций где целевой операнд является операнд памяти: ADD, ADC, AND, BTC, БТР, БТС, CMPXCHG, CMPXCH8B, DEC, INC, NEG, НЕ, ИЛИ, SBB, SUB, XOR, XADD и XCHG. Если префикс LOCK используется с одна из этих инструкций и операнд источника является операндом памяти, неопределенное исключение кода операции (#UD) может быть сгенерированным. Неопределенный код операции исключение также будет сгенерировано, если префикс LOCK используется с любым инструкция не в списке выше. Инструкция XCHG всегда утверждает LOCK # сигнал независимо от наличие или отсутствие префикса LOCK

EDIT2: Форма: «Руководство разработчика программного обеспечения Intel® 64 и IA-32, Volume3A»

8.1.1 Гарантированные атомные операции. Процессор Intel486 (и новее процессоры, так как) гарантирует, что следующие основные операции с памятью всегда выполняется атомарно:

  • Чтение или запись байта
  • Чтение или запись выровненного слова на 16-битной границе
  • Чтение или запись двойного слова, выровненного по 32-битной границе

Процессор Pentium (и новее процессоры, так как) гарантирует, что следующие дополнительные операции с памятью всегда будет выполняться атомарно:

  • Чтение или запись четырех слов, выровненных по 64-битной границе
  • 6-битный доступ к не кэшированным областям памяти, которые вписываются в 32-битный
    шина данных Процессоры семейства P6
    (и более новые процессоры с тех пор)
    гарантировать, что следующие
    дополнительная операция памяти будет
    всегда выполняется атомарно:
  • Нераспределенные 16-, 32- и 64-битные обращения к кешируемой памяти, которые соответствуют
    внутри строки кэша

Доступ к кэш-памяти, которые разделить по ширине шины, строки кэша, и границы страницы не гарантируются Intel Core 2 Duo, чтобы быть атомным, Intel Core Duo, Pentium M, Pentium 4, Intel Xeon, семейство P6, Pentium и Процессоры Intel486. Intel Core 2 Duo, Intel Core Duo, Pentium M, Pentium 4, Intel Xeon и семейство P6 процессоры обеспечивают сигналы управления шиной которые разрешают подсистемы внешней памяти сделать разделенный доступ атомарным; однако доступ к данным без выравнивания будет серьезно повлиять на производительность процессор и его следует избегать.

Итак, для чтения я предпочитаю использовать CMPXCHG инструкцию с префиксом LOCK, например:

LOCK        CMPXCHG   EAX, [J]

Для записи:

MOV   [J], EAX
SFENSE

.

...