Розмова про регістрах

вступ

Регістри є складовою частиною процесора. Вони використовуються для тимчасового зберігання інформації. Інтенсивне використання регістрів в програмі визначається тим, що швидкість доступу до них набагато більше, ніж до комірок пам'яті. 32-х бітні процесори мають 16 регістрів. Ми розглянемо лише основні і найбільш часто використовувані з них: регістри загального призначення, покажчик інструкцій, регістри сегментів і регістр прапорів.

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

Хоча для зберігання операндів, результатів операцій і покажчиків Ви можете використовувати будь-який з перерахованих вище регістрів, будьте обережні з регістром esp. У ньому зберігається покажчик вершини стека і некоректна зміна цього значення призведе до неправильної роботи програми і її аварійного завершення.

Багато команд використовують конкретні регістри для зберігання своїх операндів. Наприклад, команди обробки текстових рядків використовують вміст регістрів ecx, esi і edi в якості операндів.

Основні випадки використання регістрів загального призначення:
  • eax - використовується для зберігання операндів і результатів операцій
  • ebx - як покажчик на дані в сегменті ds
  • ecx - як лічильник для строкових операцій і циклів
  • edx - покажчик для введення / виведення
  • esi - покажчик на дані в сегменті ds, а також як покажчик на джерело в командах роботи з рядками
  • edi - покажчик на дані в сегменті es, а також як покажчик на приймач в командах роботи з рядками
  • esp - покажчик вершини стека в сегменті ss
  • ebp - покажчик на деякі дані в стек

У регістрах, що закінчуються на x, можна звертатися до младщім 16-і бітам (ax, bx, cx і dx відповідно), які в свою чергу можна розділити на старший байт (ah, bh, ch і dh) і молодший (al, bl , cl і dl) і працювати з ними, як з регістрами довжиною 8 біт. Регістри-покажчики esp (покажчик вершини стека) і ebp (базовий регістр), а також індексні регістри esi (індекс джерела) і edi (індекс приймача) допускають тільки 32-бітове звернення.

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

Регістри сегментів (cs, ds, ss, es, fs і gs) зберігають 16-ти бітні дескриптори сегментів. Дескриптори сегментів - це спеціальні покажчики, що визначають розташування сегмента в пам'яті. У захищеному режимі роботи процесора (Windows 95/98) все сегментні регист вказують на один і той же сегмент, тому зазвичай в програмі вони не використовуються.

регістр прапорів

І, нарешті, регістр прапорів. Про нього ми поговоримо більш докладно. Цей регістр являє собою набір прапорів, що встановлюються або скидаються за результатами виконуваних команд.

Сподіваюся, дорогі друзі, ви знаєте, що прапор - це змінна довжиною 1 біт, що використовується в командах умовного переходу. Якщо значення цієї змінної дорівнює 1, то вважається, що прапор встановлений, якщо 0 - скинутий. В першу чергу нас цікавлять: прапор нуля, прапор переносу і прапор знака.
  • Прапор нуля (zf) встановлюється в разі отримання нульового результату при виконанні чергової команди і скидається при інших ненульових значеннях.
  • Прапор переносу (сf) встановлюється при перенесенні або позику старшого біта в арифметичних операціях, в інших випадках скидається.
  • Прапор переповнення (оf) встановлюється, якщо результат арифметичної операції не вміщується в операнде-приймачі.
  • Прапор знака (sf) встановлюється при одиничному значенні старщего біта результату - ознаці негативного числа.

Схожі статті