Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ср2.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
71.17 Кб
Скачать

Тема: Стек та регістр прапорів. Способи адресації

План:

1. Стек

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

3 Способи адресації

3.1. Реєстрова адресація

3.2. Безпосередня адресація

3.3. Пряма адресація

3.4. Непряма адресація

3.5. Адресація по базі зі зрушенням

3.6. Непряма адресація з масштабуванням

3.7. Адресація по базі з індексуванням

1. Стек

Стек — це спеціальним образом організована ділянка пам'яті, використовуваний для тимчасового зберігання змінних, для передачі параметрів викликуваним підпрограмам і для збереження адреси повернення при виклику процедур і переривань. Легше всього представити стек у вигляді стопки аркушів паперу (це одне зі значень слова «stack» в англійській мові) — ви можете класти й забирати аркуші паперу тільки з вершини стопки. Таким чином, якщо записати в стек числа 1, 2, 3, то при читанні вони будуть виходити у зворотному порядку — 3, 2, 1. Стек розташовується в сегменті пам'яті, описуваному регістром SS, а поточний зсув вершини стека записане в регістрі ESP, причому при записі в стек значення цього зсуву зменшується, тобто стек росте вниз від максимально можливої адреси (мал. 4). Таке розташування стека «нагору ногами» може бути необхідно, наприклад у бессегментной моделі пам'яті, коли всі сегменти, включаючи сегмент стека й сегмент коду, займають ту саму область — усю пам'ять. Тоді програма виконується в нижній області пам'яті, в області малих адрес, і EIP росте, а стік розташовується у верхній області пам'яті, і ESP зменшується.

0FFFFFFFCh

Дно стеку

0FFFFFFF8h

0FFFFFFF4h

параметри

0FFFFFFF0h

EBP=0FFFFFFF0h

0FFFFFFECh

0FFFFFFE8h

Локальні змінні

0FFFFFFE4h

0FFFFFFE0h

ESP=0FFFFFFE0h

Рисунок 1. Стек

При виклику підпрограми параметри в більшості випадків поміщають у стек, а в EBP записують поточне значення ESP. Тоді, якщо підпрограма використовує стек для зберігання локальних змінних, ESP зміниться, але EBP можна буде використовувати для того, щоб зчитувати значення параметрів прямо зі стека (їх зсуви будуть записуватися як EBP + номер параметра).

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

Ще один важливий регістр, що використовується при виконанні більшості команд, — регістр прапорів EFLAGS. Як і раніше, його молодші 16 біт, що представляли із себе весь цей регістр до 80386, називаються FLAGS. У цьому регістрі кожний біт є прапором, тобто встановлюється в 1 за певних умов або установка його в 1 змінює поведінку процесора. Усі прапори, розташовані в старшім слові регістру EFLAGS, мають відношення до керування захищеним режимом, тому тут розглянутий тільки регістр FLAGS (рис.. 2).

0

NT

IOPL

OF

DF

IF

TF

SF

ZF

0

AF

0

FF

1

CF

15

0

Рисунок 2. Регістр прапорів FLAGS

  • CF — прапор переносу. Установлюється в 1, якщо результат попередньої операції не вмістився в приймачі й відбувся перенос зі старшого біта або якщо потрібен позика ( при вирахуванні), інакше встановлюється в 0. Наприклад, після додавання слова 0Ffffh і 1, якщо регістр, у який треба помістити результат, — слово, у нього буде записано 0000h і прапор CF = 1.

  • PF — прапор парності. Установлюється в 1, якщо молодший байт результату попередньої команди містить парне число біт, рівних 1; установлюється в 0, якщо число одиничних біт непарне. (Це не те ж саме, що подільність на два. Число ділиться на два без остачі, якщо його самий молодший біт дорівнює нулю, і не ділиться, якщо він рівний 1.)

  • AF — прапор напівпереносу або допоміжного переносу. Установлюється в 1, якщо в результаті попередньої операції відбувся перенос (або позика) із третього біта в четвертий. Цей прапор використовується автоматично командами двоїчно-десяткової корекції.

  • ZF — прапор нуля. Установлюється в 1, якщо результат попередньої команди — нуль.

  • SF — прапор знака. Цей прапор завжди дорівнює старшому біту результату.

  • TF — прапор пастки. Цей прапор був передбачений для роботи отладчиков, що не використовують захищений режим. Установка його в 1 приводить до того, що після виконання кожної команди програми керування тимчасово передається отладчику (викликається переривання 1 — див. опис команди INT).

  • IF — прапор переривань. Установка цього прапора в 1 приводить до того, що процесор перестає обробляти переривання від зовнішніх обладнань (див. опис команди INT). Звичайно його встановлюють на короткий час для виконання критичних ділянок коду.

  • DF — прапор напрямку. Цей прапор контроллирует поведінка команд обробки рядків — коли він установлений в 1, рядки обробляються убік зменшення адрес, а коли DF = 0 — навпаки.

  • OF — прапор переповнення. Цей прапор установлюється в 1, якщо результат попередньої арифметичної операції над числами зі знаком виходить за припустимі для них межі. Наприклад, якщо при додаванні двох позитивних чисел виходить число зі старшим бітом, рівним одиниці ( тобто негативне) і навпаки.

Прапори IOPL (рівень привелегий уведення-висновку) і NT (вкладена задача) застосовуються в захищеному режимі.

3 Способи адресації

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

3.1. Реєстрова адресація

Операнды можуть розташовуватися в будь-яких регістрах загального призначення й сегментних регістрах. У цьому випадку в тексті програми вказується назва відповідного регістру, наприклад команда, копирующуя в регістр AX уміст регістру BX, записується як

mov ax,bx

3.2. Безпосередня адресація

Деякі команди (усі арифметичні команди, крім ділення) дозволяють указувати один з операндов безпосередньо в тексті програми, наприклад команда

mov ax,2

поміщає в регістр AX число 2.

3.3. Пряма адресація

Якщо відома адреса операнда, що розташовується в пам'яті, можна використовувати цю адресу. Якщо операнд — слово, що перебуває в сегменті, на який указує ES, зі зсувом від початку сегмента 0001, то команда

mov ax,es:0001

помістить це слово в регістр AX. У реальних програмах звичайно для завдання статичних змінних використовують директиви визначення даних (глава 3.3), які дозволяють посилатися на статичні змінні не за адресою, а по імені. Тоді, якщо в сегменті, зазначеному в ES, була описана змінна word_var розміром у слово, можна записати ту ж команду як

mov ax,es:word_var

У такому випадку асемблер сам замінить слово «word_var» на відповідну адресу. Якщо селектор сегмента даних перебуває в DS, ім'я сегментного регістру при прямої адресації можна не вказувати, DS використовується за замовчуванням. Пряма адресація іноді називається адресацією по зсуву.

Адресація відрізняється для реального й захищеного режимів. У реальному режимі ( так само як і в режимі V86) зсув завжди 16-бітне, це значить, що ні безпосередньо зазначений зсув, ні результат додавання вмісту різних регістрів у більш складних методах адресації не можуть перевищувати границь слова. При програмуванні для Windows, для DOS4G, PMODE і в інших ситуаціях, коли програма буде запускатися в захищеному режимі, зсув не може перевищувати границь подвійного слова.