Регістри асемблера: види, призначення та особливості команд

Клітинки процесора, які також називаються регістри асемблера, через керуючого ними низькорівневого програмування мови являють собою якийсь блок вільних елементів в пам’яті. Їх характерною особливістю є швидкий доступ до пам’яті. Найчастіше застосовуються регістри під час виконання команд процесора і для програміста недоступні. Наприклад, під час вибірки з наявною надшвидкої пам’яті наступного за номером команди її код у двійковій системі поміщається в регістр.

Безпосередньо звернутися до регістру неможливо. Крім того, є ряд доступних блоків пам’яті, однак звернутися до них можливо тільки з оболонки операційної системи. До таких відносять керуючі сегментні регістри, а також тіньові системи дескрипторів. Застосовують у своїй роботі дані регістри виключно девелопери ОС.

Види регістрів

Для різних потреб під час програмування застосовуються різні регістри Assembler. Використовують їх залежно від цілей. Наприклад, регістр лічильника застосовується для організації як простих, так і вкладених циклів. Нижче перераховані основні типи регістрів асемблера:

  • Регістри загального призначення.
  • Індексні регістри.
  • Регістри-вказівники.
  • Сегментні блоки пам’яті.
  • Регістри прапорів.

Фактично всі регістри займають в пам’яті 32 біта. Тобто можуть містити числа від нуля до 4294967295. Деякі з регістрів розділені на кілька частин по 16 і 8 біт. Це дозволяє управляти або частиною блоку пам’яті, або осередком цілком, записуючи в неї лише частина даних.

Регістри асемблера отримали назву відповідно до виконуваних функцій:

  • ЕАХ – Accumulator регістра акумулятора;
  • EBX – Base – база;
  • ECX – Counter – відповідає за рахунок;
  • EDX – Data – блок комірок даних;
  • ESI – Source Index – регістр джерела;
  • EDI – Destination Index – регістр приймача;
  • ESP – Pointer of stack – вказівник на стек;
  • EBP – Base Pointer – покажчик підстави стека.

Особливості використання реєстрів

Варто враховувати те, що кожен з позначених регістрів може застосовуватися не тільки для внесення даних. Приміром, у регістр бази можна внести будь-яке десяткове число і користуватися ним як лічильником. Однак при цьому небажано застосовувати в цих цілях блоки пам’яті, які відповідають вказівниками – ESP і EBP, так як при цьому можуть виникати проблеми з доступом до клітинок абстрактного типу даних. Призначення регістрів асемблера – зберігання якоїсь інформації, для чого може використовуватися будь-їх вид.

Регістри загального призначення

Даний вид регістрів створений для збереження даних після обчислювальних операцій. Фактично в них можна за допомогою команди mov внести інформацію в будь-якому вигляді та системі числення: двійковій, вісімковій, десятковій або шістнадцятковій. Інша назва – регістри даних асемблера. До переліку регістрів загального призначення assembler відносять:

  • ЕАХ (accumulator) регістр акумуляції. Складається з трьох молодших блоків по 8 біт: АХ, АН, AL. При необхідності можна звертатися до двом молодшим блокам.
  • ЕВХ (base) – блок даних, який відповідає за базу. Так само, як і всі регістри загального призначення, що складається з двох молодших розділів по 8 біт і одного шестнадцатибитного. Таким чином в один регістр можна помістити відразу кілька числових значень.
  • ЕСХ (counter) – відповідає за лічильник. Використовується під час виконання циклів. Без нього не працює команда loop. Складається з двох частин, одна з яких включає два восьмибітних блоку СН і CL.
  • EDX – Data – потрібно для операцій точного визначення адреси оперативної пам’яті для функцій вводу і виводу. Крім того, в цей регістр можна поміщати дані для переадресації на використання в процедурах і шаблонах.

Регістри покажчики

Для роботи зі стеком в assembler розробниками передбачено два види регістра. Для доступу до них здійснюється операція додавання до покажчика вершини абстрактного типу значень бітності певного типу даних, який був поміщений в стек. Всі розрахунки проводяться вручну. Таким чином зберігається велика кількість даних і передається до підпрограми – процедури та масиви. Серед регістрів покажчиків в асемблері виділяють:

  • Регістр ESP – вказівник на вершину стека. Завжди містить адресу першого елемента, який був поміщений в стек в кеш-пам’яті процесора. При необхідності може бути заповнений іншими даними. Включає молодший регістр SP, що складається з 16 біт.
  • Регістр ЄВР (Base Pointer) – являє собою блок комірок пам’яті, потрібний для адресації даних, які містяться в стеку. При цьому значно полегшує доступ до всіх даних і змінним. Включає молодший розряд ВР.

Регістри-індекси

Індексні блоки пам’яті потрібні для розширеної індексації. Крім того, вони беруть участь в роботі деяких арифметичних операцій і обробки байтових рядків – послідовності байт, які містять довільне значення. У assembler включено два регістри, які відповідають за індексування ESI і EDI. Опишемо їх:

  • ESI (Source index) включає індекс джерела (місце, звідки беруться дані) і потрібен для частини дій над байтовими рядками;
  • EDI (Destination index) потрібно для запису результатів обчислення. Також застосовується для частини строкових дій. Частково пов’язаний з регістром сегментів ES.

Сегментні регістри

Є першими блоками в пам’яті. Називаються поточними сегментами. Програмне забезпечення дозволяється розподіляти більш чотирьох блоків пам’яті. Однак при цьому обов’язково занести адреси блоків у комірки пам’яті між сегментними регістрами. Даний вид блоків пам’яті є строго специфічним, завдяки чому неможливо заповнювати їх окремим видом даних. Порядок блоків регістрів пам’яті може змінюватися. Зберігання сегментних регістрів здійснюється в довільному порядку у випадкових місцях пам’яті.

  • Регістр коду CS в звичайному вигляді містить адресу початку сегменту коду програмного забезпечення (початку машинного представлення коду). Таким чином здійснюється перехід по командам за рахунок командного покажчика IP.
  • Регістр даних містить адресу даних, які обробляє програма в момент початку запуску. Пересування за даними здійснюється за рахунок зміщення, яке записано в регістр EIP.
  • Stack Segment (ESS) потрібен для збереження початку сегмента абстрактного типу даних.
  • Extra segment – допоміжний регістр, що містить порожню область для запису даних під час деяких дій над байтовими рядками. Може містити інформацію, аналогічну регістра даних.

Регістр покажчика команд

Даний вид належить до командних. За допомогою даного покажчика здійснюється висновок регістра асемблера у лістинг. Включає дані щодо зміщення на наступну команду щодо попередньої. При розробці програмного забезпечення практично не використовується, однак потрібно для перегляду лістингу виконання коду. Таким чином відслідковують помилки.

Регістр прапорів асемблера

Відповідає за поточне стан центрального процесора. Складається з 16 біт, з яких можуть бути зайняті лише 9. Заповнення даного блоку пам’яті здійснюється після виконання пропуску або коду помилки в результаті попередньої команди. Крім того, частина бітів використовується процесором і може ініціалізується і видалятися за допомогою певної системи команд. Таким чином здійснюється управління системою команд.