Сборка Intel x86 для сравнения и сброса памяти

Возможно ли на процессоре Intel x86 сравнивать одно значение с другим в определенной ячейке памяти, сбрасывая память, если сравнение прошло успешно, не беспокоясь о проблемах многопоточности/процессора? Вижу инструкцию CMPXCHG - подойдет? Или есть что-то для варианта использования сравнения и установки?


person thel0rax    schedule 29.03.2014    source источник


Ответы (1)


Инструкция CMPXCHG сравнивает значение в подразумеваемом регистре (EAX) с адресатом и обновляет нулевой флаг (EFLAGS.ZF), чтобы указать, соответствует ли значение в адресате значению, указанному в EAX, и в этом случае значение в исходном операнде ( явный регистр) хранится в месте назначения. CMPXCHG также обновляет EAX значением, считанным из пункта назначения.

Википедия описывает compare-and-set как вариант compare-and-swap, где вы получаете истинное/ложное указание на то, соответствуют ли данные в ячейке памяти заданному значению и, следовательно, была ли обновлена ​​ячейка памяти. Альтернатива compare-and-swap возвращает содержимое, считанное из памяти, и вы можете самостоятельно сравнить его с заданным значением.

http://en.wikipedia.org/wiki/Compare-and-set

... перенаправляет на

http://en.wikipedia.org/wiki/Compare-and-swap

В этом смысле CMPXCHG является одновременно compare-and-set и compare-and-swap..

Вы должны использовать префикс LOCK, чтобы гарантировать атомарное выполнение CMPXCHG, то есть поток, выполняющий CMPXCHG, получает возможность прочитать, а затем записать ячейку памяти до того, как любой другой поток получит к ней доступ.

Вы говорите resetting the memory if the compare succeeded, если вы имеете в виду установку ячейки памяти на ноль, тогда ноль - это значение, которое вы хотите в исходном регистре.

Для портативных способов выполнения compare-and-swap см. ресурсы в этот вопрос SO

Обратите внимание, что инструкция CMPXCHG позволяет операнду назначения быть как регистром, так и ячейкой памяти. При тестировании 8 байтов вы должны использовать инструкцию CMPXCHG8B. В процессоре Pentium есть ошибка, когда вы указываете префикс LOCK в инструкции CMPXCHG8B и указываете регистр в качестве места назначения, вы можете прочитать об этом подробнее здесь

person amdn    schedule 29.03.2014
comment
У вас есть ссылки на разницу между сравнением и обменом, и сравнением и установкой? - person Evan Carroll; 20.10.2018
comment
@EvanCarroll Я обновил ответ, включив в него ссылку на статью Википедии о сравнении и установке, которая перенаправляет на сравнение и обмен. Я также обновил описание инструкции CMPXCHG, которое было неверным. Спасибо. - person amdn; 21.10.2018