Статті - процесори - заклинання коду бет
В апокрифічних переказах говориться, що сам Баал не була проти побалуватися на дозвіллі ассемблером, поки не написав на ньому свій Бейсік. Так чому б і нам цим не зайнятися?
У минулому розділі даного фоліанта я обіцяв розповісти вам про те, як заклинати інструкцію NOP. Це просто і може це зробити будь-який, який володіє основами асемблера. Але для початку ви повинні дізнатися, що таке опкод. Насправді я впевнений, що майже будь-який з взялися за вивчення заклинання коду знає, що це таке, але, тим не менш, повідаю це на випадок, якщо комусь це невідомо.
Як вам повинно бути відомо, асемблери переводять інструкції з зрозумілою і такою, що запам'ятовується (мнемонічною) людині форми в форму, зрозумілу ЕОМ - в машинний код. Інструкції в машинному коді мають певний формат і складаються з декількох полів, головним з яких є опкод - код операції. А деякі, прості інструкції, складаються тільки з опкода і інших полів у них немає.
Однією з таких інструкцій є NOP. Її опкод - 90h. У цій інструкції немає параметрів, тому знання її опкода досить для заклинання. Ось приклад програми:
Сподіваюся, у Новомосковсктелей цієї глави, новоявлених заклинателів, не виникне питання, чому ця програма нічого не робить. А для тих, у кого виникне, пояснюю: інструкція NOP нічого не робить (звідси і її мнемноніка - No OPerations). Якщо бути більш точним, то NOP має той же опкод, що і інструкція XCHG EAX, EAX, однак результат (відсутність змін) від цього не змінюється.
Але NOP - це не дуже цікаво. Безумовно, спочатку заклинання вселяє, проте на практиці воно не дуже корисно. Було б непогано, якби ми могли заклинати що-небудь більш корисне - наприклад, збільшувати або зменшувати значення в eax на 1.
Це можливо. Для цього є мнемоніки INC (INCrement) і DEC (DECrement). Опкод INC EAX - 40h, опкод DEC EAX - 48h. Далі я приведу текст програми, в якій в eax кладеться число 10, потім вміст eax збільшується на 1 п'ять разів, потім - тричі зменшується на 1. Використовуючи абак нескладно порахувати, що в результаті повинно вийти 12. Це число ми відобразимо за допомогою MessageBox.
Скомпілювавши і запустивши програму можна переконатися, що в результаті виходить 12. Наше заклинання вірно і помилок немає. На дозвіллі можете поекспериментувати з PUSH EAX (опкод 50h) і POP EAX (опкод 58h).
Однак цього вам може здатися мало. Можливо, ви захочете зробити заклинання PUSH EBX або навіть INC EDX - і це цілком вам під силу! Я дам вам загальну формулу для цих інструкцій, коли операндом є регістр (саме регістр, а не осередок пам'яті, причому 32-х бітний!). Загальна формула така:
Базовий опкод + номер регістра
Базові опкоди:- INC - 40h
- DEC - 48h
- PUSH - 50h
- POP - 58
- EAX - 0
- ECX - 1
- EDX - 2
- EBX - 3
- ESP - 4
- EBP - 5
- ESI - 6
- EDI - 7
Використовуючи цю формулу легко обчислити, наприклад, опкод PUSH EDX: 48h + 2 = 4Ah. Я рекомендую потренуватися в складання простих заклинань на основі наведених вище.
Досить практики, перейдемо до теоретичних питань. Якої довжини може бути опкод? Для процесорів сімейств x86 він може бути довжиною до 3 байт. Також, під опкод може використовуватися частина байта ModR / M, про яке буде розказано в наступних розділах.
Так, інструкції можуть відрізнятися за розміром. А в деяких процесорах з іншою архітектурою інструкції мають фіксовану довжину. Чому ж в x86 це не так? Згідно з легендою, коли интеловские гноми добували руду для перших процесорів, вони ще не вміли дробити руду на однакові за розміром інструкції. Знання ж і вміння робити це прийшло пізніше. Але і після цього интеловские гноми продовжували дробити руду на різнорозмірні інструкції, оскільки вони вміли це робити добре, а їхні вироби знали і використовували вже багато.
Також я хотів розглянути, навіщо знадобилося робити окремий мнемонік для XCHG EAX, EAX - NOP. Причина, безсумнівно, в метафізичному сенсі числа 90h. В якомусь сенсі дев'ятка (як потроєна тріада) символізує Інь і Янь, а нуль серед своїх інших значень символізує Абсолют. Внесення такого потужного магічного слова в асемблер зміцнило становище x86 на астральному плані.
У наступній главі ми спробуємо помістити в EAX одиницю. Більш того, наша спроба виявиться успішною. )
[C] Aquila / WASM.RU