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
; В полях данных
Pentium+ CMPXCHG8B Сравнение и обмен 8 байтов
Команда cmpxchgSb выполняет в одной операции сравнение и обмен 8-байтовых операндов.
Команда требует один параметр и неявным образом использует еще два операнда
- пары регистров EDX:EAX и ЕСХ:ЕВХ. В качестве явного операнда команды (приемника)
может выступать только 64-битная (8-байтовая) ячейка памяти. Команда выполняет
сравнение операнда-приемника в памяти с содержимым
EDX:EAX. Если сравниваемые
значения совпадают, то операнд-приемник в памяти замещается 64-битным значением
ЕСХ:ЕВХ. Если сравниваемые значения не совпадают, содержимое памяти поступает
в пару регистров EDXrEAX, замещая один из сравниваемых операндов (рис. П2).
Команда воздействует на флаг ZF.
Рис.
П2. Действие команды
cmpxchg8b
Пример 1
; В полях данных
Пример 2
; В полях данных
При работе с многобайтовыми данными не следует забывать о том, что в памяти байты любых данных всегда выстраиваются в порядке их номеров, т.е. от младшим к все более старшим, в то время как при изображении чисел мы применяем обратный порядок - сначала пишем старшие разряды числа, затем младшие. В то же время символьные строки мы изображаем так же, как они располагаются в памяти - для нас естественно считать, что по мере движения по строке вправо номер символа возрастает.
Пример 3
; В полях данных
Пример 4
;В полях данных
Pentium+ CPUID Идентификация процессора
Команда cpuid позволяет получить код идентификации процессора, установленного
на данном компьютере. Команда в качестве неявного операнда использует регистр
ЕАХ. Для процессоров Pentium регистр ЕАХ перед вызовом команды cpuid может принимать
два значения: 0 и 1. Если ЕАХ=0, то команда возвращает в регистре ЕАХ код 1, а
в регистрах ЕВХ, EDX и ЕСХ (именно в таком порядке) - три части символьной строки,
идентифицирующей изготовителя процессора. Для процессоров Intel возвращаемая строка
в целом имеет вид "Genumclatcl".
Если перед вызовом команды cpuid значение ЕАХ равно 1, то команда возвращает в
регистре ЕАХ коды разработки конкретной версии процессора, а в регистре EDX код
IBFli, содержащий информацию о возможностях процессора.
Коды разработки в регистре ЕАХ хранятся в следующем формате:
биты 0 ... 3 - номер поколения (например, 3);биты 4 ... 7 - модель (например, 4);
биты 8 ... 11 - семейство (5 для Pentium).
Пример
;В полях данных mem dd 0,0,0 ;В программном сегменте
mov ЕАХ,О
cpuid ;EAX=0001h
mov mem, ЕВХ
mov mem+4, EDX
mov mem+8, ECX ;mem='Genuinelntel'
cpuid EAX=543h (например) ,EDX = lBFh
CWD Преобразование слова в двойное слово
Пример 1
mov AX,32767 ;AX=7FFFh
Пример 2
mov AX,-32768 ;AX=8000h
cwd ;AX=8000h, DX=FFFFh.
;DX:AX=-32768
386+ CWDE Преобразование слова в двойное слово с расширением
Пример
; В полях данных