|
|||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||
|
486+ CMPXCHG Порівняння і обмін
Команда cmpxchg виконує в одній операції порівняння і обмін операндів. Команда вимагає два параметри і неявним чином використовує третій операнд - регістр ЕАХ. Перший операнд (приймач) повинен знаходитися в 16- або 32-бітовому елементу пам'яті, другий операнд (джерело) - в регістрі загального призначення такого ж розміру. Команда виконує порівняння операнда-приймача з вмістом неявного операнда - регістра ЕАХ. Якщо порівнювані значення збігаються, операнд-приймач заміщається операндом-джерелом (тобто вміст регістра записується в пам'ять). Якщо порівнювані значення не збігаються, вміст пам'яті (приймач) поступає в регістр ЕАХ (мал. П1). Команда впливає на прапори OF, SF, ZF, AF, PF і CF. Рис.П1. Дія команди cmpxchg Приклад 1
Приклад 2 ; У полях даних mem dw 135 ;В програмному сегменті mov Ax,148 mov Bx,60 cmpxchg mem,bx ;mem<>AX. Пам'ять ® АХ ;mem=135, Bx=60, Ax=148
Pentium+ Cmpxchg8b Порівняння і обмін 8 байтів
Мал.
П2. Дія команди cmpxchg8b
; У полях даних mem dq 1122334455667788h ;В програмному сегменті mov Есх,9 mov Евх,5 mov Edx,11223344h mov Eax,55667788h cmpxchgsb mem ;mem=EDX:EAX. Ecx:ebx ® mem ; mem=0000000900000005h
Приклад 2 ; У полях даних mem dq 1122334455667788h ;B програмному сегменті mov Ecx,9 mov Ebx,5 mov Edx,11223344h mov Eax,55667789h cmpxchgsb mem ;memOEDX: EAX. Mem -" EDX : EAX ;mem=1122334455667788h ;EDX=11223344h, Eax=55667788h При роботі з багатобайтовими даними не слід забувати про те, що в пам'яті байти будь-яких даних завжди шикуються в порядку їх номерів, тобто від молодшим до все більш старшим, тоді як при зображенні чисел ми застосовуємо зворотний порядок - спочатку пишемо старші розряди числа, потім молодші. В той же час символьні рядки ми зображаємо так само, як вони розташовуються в пам'яті - для нас природно вважати, що у міру руху по рядку управо номер символу зростає. Приклад 3 ; У полях даних meml db '12345678' ;Строка-операнд mem2 db '12345678' ;Сравниваемая рядок ;У програмному сегменті mov Ecx,68676665h ;'efgh' mov Ebx,64636261h ;'abcd' mov Edx,dword ptr mem2+4 ;Забираем старшу ;частина рядка mov Eax,dword ptr mem2 ;Забираем молодшу ;частина рядка cmpxchg8b gword ptr meml ;Операнды збігаються ;Zf=1, mem1=''abcdefgh'' ;ECX:EBX без змін ;Edx:eax без змін
Приклад 4 ;У полях даних meml db '12345678' ;Строка-операнд mem2 db 'abcdefgh' ;Сравниваемая рядок ; У програмному сегменті mov Ecx,68676665h ;'efgh' mov Ebx,64636261h ;'abed' mov Edx,dword ptr mem2+4 ;3абираем старшу ;частина рядка mov Eax,dword ptr mem2 ;Забираем молодшу ;частина рядка cmpxchg8b qword ptm mem1 ;Операнды не збігаються ;Zf=0, Edx=38373635='5678' ;EAX=34333231='1234' ;mem1s без зміни ;При нерівності Есх:евх не беруть участь в операції Pentium+ CPUID Ідентифікація процесора
Приклад
CWD Перетворення слова в подвійне слово
Приклад 1 mov Ax,32767 ;AX=7FFFh cwd ;AX=7FFFh, Dx=ooooh. ;Dx:ax=32767 Приклад 2
386+ CWDE Перетворення слова в подвійне слово з розширенням
Приклад ; У полях даних mem dw - 3 ;В програмному сегменті mov Ax,mem ;AX=FFFD cwde ;EAX=FFFFFFFDh
|
|
|||||||||||||||||||||||||||||||||||||||||||||
|