Команди асемблера для Intel: 486+ CMPXCHG, Pentium+ Cmpxchg8b, Pentium+ CPUID, CWD, 386+ CWDE
ADO в Delphi AJAX Android C++ CakePHP CMS COM CSS Delphi Flash Flex HTML Internet Java JavaScript MySQL PHP RIA SCORM Silverlight SQL UML XML Бази даних Веб-розробка Генетичні алгоритми ГІС Гітара Дизайн Економіка Інтелектуальні СДН Колір Масаж Математика Медицина Музика Нечітка логіка ООП Патерни Подання знань Розкрутка сайту, SEO САПР Сесії в PHP Системне програмування Системний аналіз Тестологія Тестування ПЗ Фреймворки Штучний інтелект
|
Команди асемблера для 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 байтів
Рис. П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 Ідентифікація процесора
Якщо перед викликом команди 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
cwd ;AX=7FFFh, Dx=ooooh.
;Dx:ax=32767
Приклад 2
mov AX-32768 ;AX=8000h
cwd ;AX=8000h, Dx=ffffh.
;Dx:ax=-32768
386+ CWDE Перетворення слова в подвійне слово з розширенням
Приклад
; У полях даних
mem dw - 3
;В програмному сегменті
mov Ax,mem ;AX=FFFD
cwde ;EAX=FFFFFFFDh Зверніть увагу на додаткові посиланняГоловний розділСторінки, близькі за змістомзагрузка...
|
Сторінки, близькі за змістом Асемблер (англ. assembler) — загальноприйнята назва транслятора з автокоду. Асемблер переводить початкову програму, написану на автокоді, в переміщувану програму на мові машинній. Оскільки асемблер здійснює трансляцію на мову завантажувача, при завантаженні програми необхідна налаштування умовних адрес, тобто адрес, значення яких залежать від розташування даної програми в пам'яті ЦВМ і від її зв'язків з іншими незалежно трансльованими програмами. |
Copyright © 2008—2024 Портал Знань.
При використанні матеріалів посилання, для інтернет-ресурсів — гіперпосилання, на Znannya.org обов'язкове.
Зв'язок
|
НТУУ "КПІ" Інженерія програмного забезпечення КПІ Лабораторія СЕТ |
|