→ Пошук по сайту       Увійти / Зареєструватися

Команди асемблера для Intel: 486+ CMPXCHG, Pentium+ Cmpxchg8b, Pentium+ CPUID, CWD, 386+ CWDE

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


Приклад 1

 
; У полях даних
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 Ідентифікація процесора


Команда cpuid дозволяє отримати код ідентифікації процесора, встановленого на даному комп'ютері. Команда як неявний операнд використовує регістр ЕАХ. Для процесорів Pentium регістр ЕАХ перед викликом команди cpuid може набувати два значення: 0 і 1. Якщо Еах= 0,то команда повертає в регістрі ЕАХ код 1, а в регістрах ЕВХ, EDX і ЕСХ (саме у такому порядку) - три частини символьного рядка, що ідентифікує виготівника процесора. Для процесорів Intel повертаний рядок в цілому має вид "Genumclatcl".

Якщо перед викликом команди cpuid значення ЕАХ дорівнює 1, то команда повертає в регістрі ЕАХ коди розробки конкретної версії процесора, а в регістрі EDX код Ibfli, що містить інформацію про можливості процесора.

Коди розробки в регістрі ЕАХ зберігаються в наступному форматі:

 
биті 0 ... 3 - номер покоління (наприклад, 3);

биті 4 ... 7 - модель (наприклад, 4);

биті 8 ... 11 - сімейство (5 для Pentium). 


Вміст регістра EDX включає конфіденційну інформацію виготівника, а також говорить про наявність на кристалі мікропроцесора арифметичного співпроцесора (битий 0) і підтримці команди cmpxchgsb (битий 8).

Приклад

;У полях даних 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 Перетворення слова в подвійне слово


Команда cwd заповнює регістр DX знаковим бітом вмісту регістра АХ, перетворюючи тим самим 16-розрядне число із знаком в 32-розрядне, розміщуване в регістрах Dx:ax. Команду зручно використовувати для перетворення двобайтового ділимого в чотирьохбайтове (подвійне слово) при діленні на 16-розрядний операнд. Команда не має параметрів і не впливає на прапори процесора.

Приклад 1

mov Ax,32767 ;AX=7FFFh
cwd ;AX=7FFFh, Dx=ooooh.
;Dx:ax=32767 

Приклад 2

mov AX-32768 ;AX=8000h
cwd ;AX=8000h, Dx=ffffh.
;Dx:ax=-32768 

 

386+ CWDE Перетворення слова в подвійне слово з розширенням


Команда cwde заповнює старшу половину регістра ЕАХ знаковим бітом вмісту регістра АХ, перетворюючи тим самим 16-розрядне число із знаком в 32-розрядне, розміщуване в розширеному регістрі ЕАХ. Команда не має операндів і не впливає на прапори процесора.

Приклад

; У полях даних
mem dw - 3
;В програмному сегменті
mov Ax,mem ;AX=FFFD
cwde ;EAX=FFFFFFFDh 

загрузка...
Сторінки, близькі за змістом