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

Регістри - це спеціальні осередки пам'яті, розташовані безпосередньо в процесорі. Робота з регістрами виконується набагато швидше, ніж з осередками оперативної пам'яті, тому регістри активно використовуються як в програмах на мові асемблера, так і компіляторами мов високого рівня.

Регістри можна розділити на регістри загального призначення. покажчик команд. регістр прапорів і сегментні регістри.

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

До регістрів загального призначення відноситься група з 8 регістрів, які можна використовувати в програмі на мові асемблера. Всі регістри мають розмір 32 біта і можуть бути розділені на 2 або більше частин.

Як видно з малюнка, регістри ESI, EDI, ESP і EBP дозволяють звертатися до молодших 16 бітам по іменах SI, DI, SP і BP відповідно, а регістри EAX, EBX, ECX і EDX дозволяють звертатися як до молодших 16 бітам (за іменами AX , BX, CX і DX), так і до двом молодшим байтам окремо (за іменами AH / AL, BH / BL, CH / CL і DH / DL).

Назви регістрів походять від їх призначення:

  • EAX / AX / AH / AL (accumulator register) - акумулятор;
  • EBX / BX / BH / BL (base register) -регістри бази;
  • ECX / CX / CH / CL (counter register) - лічильник;
  • EDX / DX / DH / DL (data register) - регістр даних;
  • ESI / SI (source index register) - індекс джерела;
  • EDI / DI (destination index register) - індекс приймача (одержувача);
  • ESP / SP (stack pointer register) - регістр покажчика стека;
  • EBP / BP (base pointer register) - регістр покажчика бази кадру стека.

Незважаючи на існуючу спеціалізацію, все регістри можна використовувати в будь-яких машинних операціях. Однак треба враховувати той факт, що деякі команди працюють тільки з певними регістрами. Наприклад, команди множення і ділення використовують регістри EAX і EDX для зберігання вихідних даних і результату операції. Команди управління циклом використовують регістр ECX як лічильника циклу.

На жаль, кількість регістрів катастрофічно мало, і часто буває важко підібрати спосіб їх оптимального використання.

Регістр EIP (покажчик команд) містить зміщення наступної підлягає виконанню команди. Цей регістр безпосередньо недоступний програмісту, але завантаження і зміна його значення виробляються різними командами управління, до яких відносяться команди умовних і безумовних переходів, виклику процедур і повернення з процедур.

Прапор - це біт, що приймає значення 1 ( «прапор встановлений»), якщо виконано деякий умова, і значення 0 ( «прапор скинутий») в іншому випадку. Процесор має регістр прапорів. що містить набір прапорів, що відображає поточний стан процесора.

Значення прапорів CF, DF і IF можна змінювати безпосередньо в регістрі прапорів за допомогою спеціальних інструкцій (наприклад, CLD для скидання прапора напрямки), але немає інструкцій, які дозволяють звернутися до регістру прапорів як до звичайного регістру. Однак можна зберігати регістр прапорів в стек або регістр AH і відновлювати регістр прапорів з них за допомогою інструкцій LAHF. SAHF. PUSHF. PUSHFD. POPF і POPFD.

Прапори стану (біти 0, 2, 4, 6, 7 і 11) відображають результат виконання арифметичних інструкцій, таких як ADD. SUB. MUL. DIV.

  • Прапор переносу CF встановлюється при перенесенні з старшого значущого біта / позику в старший значущий біт і показує наявність переповнення в беззнакову целочисленной арифметиці. Також використовується в довгій арифметиці.
  • Прапор парності PF встановлюється, якщо молодший значущий байт результату містить парне число одиничних бітів. Спочатку цей прапор був орієнтований на використання в комунікаційних програмах: при передачі даних по лініях зв'язку для контролю міг також передаватися біт парності і інструкції для перевірки прапора парності полегшували перевірку цілісності даних.
  • Допоміжний прапор переносу AF встановлюється при перенесенні з біта 3-го результату / позику в 3-ий біт результату. Цей прапор орієнтований на використання в двійковій-десяткового (binary coded decimal, BCD) арифметиці.
  • Прапор нуля ZF встановлюється, якщо результат дорівнює нулю.
  • Прапор знака SF дорівнює значенню старшого значущого біта результату, який є знаковим бітом в знаковій арифметиці.
  • Прапор переповнення OF встановлюється, якщо цілочисельний результат занадто довгий для розміщення в цільовому операнде (регістрі або комірці пам'яті). Цей прапор показує наявність переповнення в знаковій целочисленной арифметиці.

З перерахованих прапорів тільки прапор CF можна змінювати безпосередньо за допомогою інструкцій STC. CLC іCMC.

Прапори стану дозволяють одній і тій же арифметичної інструкції видавати результат трьох різних типів: беззнаковое, знакова і двійково-десяткове (BCD) ціле число. Якщо результат вважати беззнаковим числом, то прапор CF показує умова переповнення (перенесення або позику), для знакового результату перенесення або позику показує прапор OF, а для BCD-результату перенесення / позику показує прапор AF. Прапор SF відображає знак знакового результату, прапор ZF відображає і беззнаковий, і знаковий нульовий результат.

У довгій целочисленной арифметиці прапор CF використовується спільно з інструкціями складання з перенесенням (ADC) і віднімання з позику (SBB) для поширення перенесення або позику з одного обчислюваного розряду довгого числа в інший.

Прапор PF був введений для сумісності з іншими мікропроцесорними архітектурою і за прямим призначенням використовується рідко. Найбільш поширене його використання спільно з іншими прапорами стану в арифметиці з плаваючою комою: інструкції порівняння (FCOM. FCOMP і т. П.) В математичному співпроцесора встановлюють в ньому прапори-умови C0, C1, C2 і C3, і ці прапори можна скопіювати в регістр прапорів. Для цього рекомендується використовувати інструкцію FSTSW AX для збереження слова стану співпроцесора в регістрі AX та інструкцію SAHF для подальшого копіювання вмісту регістра AH в молодші 8 бітів регістра прапорів, при цьому C0 потрапляє під прапор CF, C2 - в PF, а C3 - в ZF. Прапор C2 встановлюється, наприклад, в разі непорівнянних аргументів (NaN або підтримуваний формат) в інструкції порівняння FUCOM.