Які функції виконують регістри загального призначення
Реєстри загального призначення
Реєстри загального призначення (GPR - General purpose registers) призначені для тимчасового зберігання даних у процесі обчислень. Розрядність регістрів визначає розрядність обчислень і, зрештою, розрядність самого мікроконтролера. Кількість регістрів може бути довільною. Зазвичай у цих регістрах зберігається інформація, оброблена в арифметико-логическом пристрої, і отриманий результат обчислень. Наприклад, ядро AVR має 32 регістри загального призначення. Кожному регістру (рис. 3.1) відповідає додатково адреса пам'яті даних, що відображає їх у перших 32 осередках простору даних. Хоча вони не використовуються як фізичні осередки SRAM, така організація пам'яті забезпечує гнучке звернення до регістрів.
Мал. 3.1. Файл регістрів загального призначення AVR Найзагальніші арифметичні та логічні інструкції між двома регістрами або з одним регістром використовують для запису результату теж регістри цього регістрового файлу. Шість з 32 регістрів (R26 . R31), крім звичайної інших регістрів функцій, виконують функцію 16-бітних покажчиків адреси при непрямій адресації пам'яті даних і пам'яті програм. Ці три регістри непрямої адресації визначаються як регістри X, Y і Z. У парних регістрах зберігаються молодші байти 16-битных змінних, а непарних - старші (рис. 3.2). Мал. 3.2. Регістри непрямої адресації архітектури AVR Реєстри введення/виводу
Характеристика регістрів процесора
Регістри процесора є по суті осередки дуже швидкої пам'яті і служать для тимчасового зберігання різних кодів: даних, адрес, службових кодів.Операції з цими кодами виконуються гранично швидко, тому, чим більше внутрішніх регістрів, тим краще, на швидкодія процесора сильно впливає розрядність регістрів. .
По відношенню до призначення внутрішніх регістрів існує два основних підходи. Наприклад, компанія Intel, яка кожному регістру відводить суворо певну функцію. та уповільнює роботу програми Наприклад, деякі арифметичні операції та обмін з пристроями вводу/виводу проводяться лише через один регістр. — акумулятор, в результаті чого при виконанні деяких процедур може знадобитися кілька додаткових пересилок між регістрів. При цьому досягається висока гнучкість, але потрібне ускладнення структури процесора. Існують і проміжні рішення, зокрема, в процесорі. MC68000 фірми Motorola половина регістрів використовувалася для даних, і вони були взаємозамінні, а інша половина - для адрес, і вони також взаємозамінні.
У першу групу входять регістри загального призначення. У процесорах 386 і вище є вісім 32-бітових регістрів загального призначення EAX, ECX, EDX, ESI, EBP, ESP. -бітових регістрів.При необхідності можлива робота з половинами регістрів, оскільки вони поділені на старшу та молодшу половину, звані AH та AL, BH та BL тощо. Такий поділ регістрів є у всіх процесорах. Значна частина внутрішніх операцій комп'ютерів провадиться з використанням регістрів загального призначення.
Наступна група із шести регістрів допомагає процесору звертатися до пам'яті. Вони називаються сегментними регістрів і кожен з них допомагає звертатися до області (або сегменту) пам'яті. У колишніх процесорах розмір сегментів становив 64 Кбайт, а нових процесорах довжина сегмента змінна і варіюється від одного байта до 4 Гбайт.
Регістр CS сегмента коду (програми) показує, де пам'яті перебуває програма. Регістр DS сегмента даних локалізує дані, що використовуються програмою. Регістр додаткового сегмента ES доповнює сегмент даних. Регістр SS сегмента стека визначає стек комп'ютера. У процесорах 386 і вище є ще два сегментні регістри: FS і GS, призначених для адресації пам'яті.
Якщо сегментні регістри забезпечують доступ до великих блоків пам'яті, остання група використовується разом із сегментним регістром для локалізації у пам'яті конкретних байтів. Регістр покажчика команди IP визначає точку, де виконується програма. Регістри вказівника стека SP та вказівника бази BP допомагають стежити за інформацією в стеку (стек – це область пам'яті, де зберігається інформація про поточні дії комп'ютера). Регістри індексу джерела SI та індексу одержувача DI допомагають програмам пересилати великі блоки даних з одного місця до іншого.
Які функції виконують регістри загального призначення
Ключову роль в обробці даних у процесорі відіграють спеціальні осередки, відомі як регістри . регістри загального призначення (general-purpose registers), які в основному та використовуються у додатках на асемблері.
Почнемо з того, що процесор архітектури x86 мав вісім 32-бітових регістрів загального призначення, регістр прапорів та вказівник інструкцій.
- EAX (Accumulator): для арифметичних операцій
- ECX (Counter): для зберігання лічильника циклу
- EDX (Data): для арифметичних операцій та операцій введення-виведення
- EBX (Base): покажчик на дані
- ESP (Stack pointer): покажчик на верхівку стека
- EBP (Base pointer): покажчик на базу стека всередині функції
- ESI (Source index): покажчик на джерело при операціях з масивом
- EDI (Destination index): покажчик на місце призначення в операціях з масивами
- EIP : вказівник адреси наступної інструкції для виконання
- EFLAGS : регістр прапорів, що містить біти стану процесора
Можна отримати доступ до частин 32-бітових регістрів з меншою розрядністю. Наприклад, молодші 16 біт 32-бітного регістру EAX позначаються як AX. .
В архітектурі х64 ці регістри були розширені до 64 біт, а нові розширені регістри отримали імена, які починаються з літери R, наприклад, RAX, RBX і т.д.
Для звернення до 32-, 16- та 8-бітної частини 64-розрядних регістрів використовуються стандартні для архітектури x86 імена регістрів. Для доступу до підреєстрів нових 64-бітових регістрів R8 - R15 застосовується відповідний суфікс:
- D : для отримання молодших 32 біт регістру, наприклад, R11D
- W : для отримання молодших 16 біт регістру, наприклад, R11W
- B : для отримання молодших 8 біт регістру, наприклад, R11B
Таким чином, в архітектурі x86-64 ми можемо використовувати наступні регістри загального користування:
- Шістнадцять 64-розрядних регістрів RAX, RBX, RCX, RDX, RSI, RDI, RBP, RSP, R8, R9, R10, R11, R12, R13, R14 та R15
- Шістнадцять 32-розрядних регістрів EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP, R8D, R9D, R10D, R11D, R12D, R13D, R14D та R15D
- Шістнадцять 16-розрядних регістрів AX, BX, CX, DX, SI, DI, BP, SP, R8W, R9W, R10W, R11W, R12W, R13W, R14W та R15W
- Шістнадцять 8-розрядних регістрів AL, AH, BL, BH, CL, CH, DL, DH, DIL, SIL, BPL, SPL, R8B, R9B, R10B, R11B, R12B, R13B, R14B та R15B
Наприклад, запис у частину 64-бітного регістра, наприклад регістр AL, впливає тільки на біти цієї частини. У разі AL завантаження 8-бітного значення змінює молодші 8 бітів RAX, залишаючи решту 56 бітів без змін.
Хоча ці регістри і називаються загального призначення, але це не означає, що їх можна використовувати для будь-яких цілей. Усі регістри x86-64 мають своє особливе призначення, яке обмежує їх використання у певних контекстах.
Регістр прапорів RFLAGS містить біти стану процесора:
Прапор перенесення (Carry flag): показує, чи був при складанні перенесення чи запозичення при відніманні. Використовується як вхідні дані для інструкцій додавання та віднімання.
Прапор парності: встановлюється, якщо молодші 8 біт результату містять парне число одиниць.
Прапорець налаштування: вказує, чи було при складанні перенесення або запозичення при відніманні молодших 4 бітів.
Прапор нуля (Zero flag): встановлюється, якщо результат операції дорівнює нулю
Прапор знака (Sign flag): встановлюється, якщо результат операції є негативним.
Прапор переривання виконання (Trap flag): використовується при однокроковому налагодженні.
Прапор роздільної здатності переривання: встановлення цього біта дозволяє апаратні переривання.
Прапор напряму: контролює напрямок обробки. Якщо не встановлено, то порядок від наймолодшої до найстаршої адреси. Якщо встановлено, то порядок зворотний - від найстаршої до наймолодшої адреси.
Прапор переповнення (Overflow flag): якщо встановлено, то операція призвела до переповнення зі знаком.
Рівень привілеїв вводу-виводу (I/O privilege level): рівень привілеїв поточного потоку. IOPL 0 — це режим ядра, а 3 — режим користувача.
Прапор вкладеного завдання (Nested task flag): керує ланцюжком переривань.
Прапор відновлення (Resume flag): використовується для обробки винятків під час налагодження.
Прапор віртуальної машини 8086: якщо встановлено, режим сумісності з 8086 активний. Цей режим дозволяє запускати деякі програми MS-DOS у контексті операційної системи у захищеному режимі.
Прапор перевірки вирівнювання (Alignment check flag): якщо встановлено, перевірка вирівнювання пам'яті активна. Наприклад, якщо встановлено прапор AC, збереження 16-бітного значення за непарною адресою викликає виключення перевірки вирівнювання. Процесори x86 можуть виконувати невирівняний доступ до пам'яті, коли цей прапор не встановлений, але кількість командних циклів, що потрібні, може збільшитися.
Прапор віртуального переривання (Virtual interrupt flag): віртуальна версія прапора IF у віртуальному режимі 8086.
Прапор очікування віртуального переривання: Встановлюється, коли переривання перебуває у стані очікування у віртуальному режимі 8086.
Прапор ID: якщо цей біт встановлено, підтримується інструкція cpuid. Ця інструкція повертає ідентифікатор процесора та інформацію про його функції.
Основними є прапори перенесення, нуля, знака та переповнення, які називають прапорами стану. Як видно, не всі біти з 64-розрядного регістру прапорів мають призначення. Незазначені біти не використовуються.
На додаток до регістрів загального призначення x86-64 надає регістри спеціального призначення, у тому числі вісім регістрів для роботи з числами з плаваючою точкою, реалізованих у модулі x87 з плаваючою точкою (floating-point unit або FPU). Intel назвала ці регістри ST0 – ST7. Кожен регістр із плаваючою точкою має ширину 80 біт. На відміну від регістрів загального призначення звичайна програма користувача не може отримати до них прямий доступ.
Також є шістнадцять 128-бітових регістрів XMM (XMM0 - XMM15) та набір інструкцій SSE/SSE2. Кожен регістр можна налаштувати як чотири 32-бітові регістри з плаваючою точкою; два 64-бітні регістри подвійної точності з плаваючою точкою; або шістнадцять 8-бітних, вісім 16-бітних, чотири 32-бітові, два 64-бітові або один 128-бітовий цілочисловий регістр. У пізніших варіантах сімейства процесорів x86-64 AMD/Intel подвоїли розмір регістрів до 256 біт кожен (перейменувавши їх у YMM0-YMM15), додавши підтримки восьми 32-бітних значень з плаваючою точкою або чотирьох 64-бітових значень з плаваючою точкою подвійною. (цілочисленні операції, як і раніше, обмежувалися 128 бітами).
Подібні статті
- Які функції виконують залози шкіри
- Які функції виконують ляльки
- Які функції виконують плавці у риб
- Які функції в листках виконують жилки
- Які основні функції рівня 3 моделі OSI
- Які функції варто додати до вашого інтернет еквайринг
- Які функції виконує дитяча література
- Які функції виконує панцир раку