C
486+ CMPXCHG Сравнение и обмен
Команда cmpxchg выполняет в одной операции сравнение и обмен операндов. Команда требует два параметра и неявным образом использует третий операнд – регистр ЕАХ. Первый операнд (приемник) должен находиться в 16 – или 32-битовой ячейке памяти, второй операнд (источник) – в регистре общего назначения такого же размера. Команда выполняет сравнение операнда-приемника с содержимым неявного операнда – регистра ЕАХ.
Если сравниваемые значения совпадают, операнд-приемник замещается операндом-источником (т.е. содержимое регистра записывается в память). Если сравниваемые значения не совпадают, содержимое памяти (приемник) поступает в регистр ЕАХ (рис. П1). Команда воздействует на флаги OF, SF, ZF, AF, PF и CF.
Рис. П1. Действие команды cmpxchg
Пример 1:
; В полях данных mem dw 135 ; В программном сегменте mov AX,135 mov BX,60 cmpxchg mem,BX; mem=AX. Регистр ® память; mem=60, BX=60, АХ=135
Пример 2:
; В полях данных mem dw 135 ;В программном сегменте mov AX,148 mov BX,60 cmpxchg mem,BX; mem<>AX. Память ® АХ ;mem=135, BX=60, AX=148
Pentium+ CMPXCHG8B Сравнение и обмен 8 байтов
Команда cmpxchgSb выполняет в одной операции сравнение и обмен 8-байтовых операндов. Команда требует один параметр и неявным образом использует еще два операнда – пары регистров EDX:EAX и ЕСХ:ЕВХ. В качестве явного операнда команды (приемника) может выступать только 64-битная (8-байтовая) ячейка памяти. Команда выполняет сравнение операнда-приемника в памяти с содержимым EDX:EAX. Если сравниваемые значения совпадают, то операнд-приемник в памяти замещается 64-битным значением ЕСХ:ЕВХ. Если сравниваемые значения не совпадают, содержимое памяти поступает в пару регистров EDXrEAX, замещая один из сравниваемых операндов (рис. П2). Команда воздействует на флаг ZF.
Рис. П2. Действие команды cmpxchg8b