Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
асм.docx
Скачиваний:
16
Добавлен:
27.10.2018
Размер:
644.06 Кб
Скачать

2. Структура регістра eflags 6

3. Організація оперативної пам’яті. Сегментована модель оперативної пам’яті. Формування адреси в реальному режимі 9

4. Формати і типи даних. Формат машинних команд. Система переривань 12

5. Десяткова арифметика. Форми зображення десяткових чисел 16

6. Директиви сегментації. Директиви proc і endp 21

7. Опис простих типів мовою асемблера 24

10. Синтаксис команд мовою асемблера 25

11. Команди передач даних 28

12. Стекові передачі даних 30

13. Передачі адресних об’єктів, команди введення-виведення і передачі прапорців 32

14. Команди передачі даних movXx. Команда setCC. Команда xlat 35

15. Команди додавання, віднімання і порівняння 37

16. Команди множення і ділення 39

20. Команди логічних операцій. Команди зсувів 41

22. Команди операцій з двійковими ланцюжками 46

23. Команди передачі керування (безумовні переходи) 49

24. Команди умовних переходів і команди керування циклами 51

26. Команди переривань і повернення з переривань 55

27-29. Ланцюжкові команди 56

29. Команди керування процесором 60

31. Формати даних, які підтримуються FPU 63

32. Програмна модель FPU 68

33. Слово стану SW і слово керування CW пристрою FPU. 71

34. Команди передач даних FPU: завантаження, збереження, збереження з вибором зі стека, обміну, завантаження сталих. 77

35. Арифметичні команди FPU: додавання, віднімання, множення, ділення. 80

36. Додаткові арифметичні команди FPU. 82

37. Команди порівняння FPU 85

38. Команди трансцендентних функцій. Алгоритми обчислення значень функцій і та логарифмів за будь-якою основою. 87

39. Команди керування пристроєм FPU 93

40. Спеціальні числові значення та особливі обчислювальні ситуації 97

Програмна або регістрова модель – це набір доступних для користувача внутрішніх регістрів процесора. Регістрами називаються області високошвидкісної пам’яті, розміщені всередині процесора в безпосередній близькості до його ядра. Використання регістрів уточнюватиметься в процесі вивчення архітектури процесора і його програмування. В розпорядження програміста надається не дуже багато регістрів, тому вони є критично важливим ресурсом і за їх вмістом потрібно досить уважно слідкувати. Відзначимо, що програмна модель i486 (i486+ – так ми позначатимемо в подальшому всі наступні моделі (архітектури) процесорів типу Intel, вважаючи модель i486 як базову) має 31 регістр: 16 регістрів прикладного програміста і 15 регістрів системного програміста (системні регістри).

Регістри користувача. Ці регістри наведені на рис. 1.1 і функціонально поділяються на декілька груп

31 15 7 0 15 7 0

eax ah ax al

ebx bh bx bl

ecx ch cx cl

edx dh dx dl

esp sp

ebp bp

esi si

edi di

Загальні регістри

15 0 31 15 0

сs

ss

ds

es

fs

gs

eip ip

Cегментні регістри Вказівник команди

31 15 0

eflags flags

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

Рис. 1.1 Регістри користувача процесора i486

Загальні регістри. Вісім 32-бітових регістрів використовуються для зберігання даних і/або адрес. Буква е в назві означає “розширений” (extended). В командах допускається вказувати їх молодші 16-бітові половини – регістри ax, bx, cx, dx, sp, bp, si, di. Крім того, в перших чотирьох регістрах окремо можна адресувати старші (high) і молодші (low) 8-бітові половини – регістри ah, bh, ch, dh, al, bl, cl, dl. Старші половини 32-бітових регістрів, тобто біти від 16 до 31, регістрів загального призначення не мають визначених назв і тому їх адресувати неможливо (для використання цих частин можна розробити певні програмні засоби). Загальні регістри беруть однаково участь у командах оперування даними і можуть застосовуватися рівноправно в будь-яких режимах адресації. Ці регістри в i486 стали більш універсальними, ніж в процесорах 8086/80286, оскільки перші чотири регістри можна використовувати для адресації операндів. У певних командах ці регістри виконують спеціальні функції, що відображено в їхніх назвах:

eax/ax/al – акумулятор (accumulator) – найчастіше використовується для зберігання проміжних даних. Як правило, команди з використанням цього регістра виконуються дещо швидше і мають меншу довжину. В операціях множення/ділення акумулятор містить множене/ділене до початку виконання операції і добуток/частку після операції. В командах введення-виведення через порти в акумуляторі знаходяться дані, які вводяться-виводяться. Операції з десятковими числами реалізовуються тільки з використанням регістра al.

ebx/bx – (base register) базовий регістр. Містить базову (початкову) адресу об’єкта даних в пам’яті, а також визначає базову адресу таблиці для команди перетворення xlat.

ecx/cx/cl – (counter register) регістр-лічильник у командах повторення (цикли, зсуви, маніпуляції з ланцюжками).

edx/dx – (data segment register) регістр даних. Використовується для зберігання проміжних даних найчастіше, а також в командах множення і ділення (разом з акумулятором). У командах введення-виведення dx містить адресу порта.

esp/sp – (stack pointer register) вказівник стека. Використовується в командах push, pop, а також інших стекових операціях, командах call, ret і iret. Регістр esp/sp адресує вершину стека в поточному сегменті стека.

ebp/bp – (base pointer register) вказівник бази. Використовується для зручності доступу до об’єкта даних у стекові (найчастіше фактичних параметрів підпрограм).

esi/si – (sourse index register) індекс джерела.

edi/di – (destination index register) індекс приймача.

Сегментні регістри. Їх шість 16-бітових регістрів. Вони містять селектори сегментів (segment selector), які асоціюються з різними формами звернення до оперативної пам’яті. Регістри cs, ss, ds, es збереглися незмінними від процесора 8086, а два регістри fs і gs вперше з’явилися в процесорі 80386. Наявність сегментних регістрів пояснюється сегментною організацією пам’яті. В процесорі 8086 максимальний розмір сегмента 64К, в процесорах 80286/80386 та i486+ вміст сегментного регістра визначає сегмент не прямо, а через дескрипторну таблицю (розмір сегмента до 4Г).

cs – (code segment register) сегментний регістр коду. Визначає поточний сегмент, який містить машинні команди (власне програму) і називається кодом.

ss – (stack segment register) сегментний регістр стека. Задає поточний сегмент стека. Вершину стека адресує регістр esp/sp.

ds – (data segment register) сегментний регістр даних. Ідентифікує головний сегмент, який містить дані поточної програми.

es, fs, gs – додаткові сегментні регістри, призначені для задання ще трьох сегментів даних, доступних поточній програмі.

Явна специфікація сегмента в програмі, як правило, не потрібна. Якщо сегмент не вказано за допомогою префікса заміни, то застосовується правила вибору сегмента процесором. Подамо ці правила в наступній таблиці:

Тип звернення

Використовуваний сегмент

Використовуваний регістр

Правило вибору

сегмента за домовленістю

Команда

Стек

Локальні дані

Ланцюжок –

приймач

Сегмент коду

Регістр cs

Сегмент стека

Регістр ss

Сегмент даних

Регістр ds

Додатковий сегмент даних

Регістр es

Автоматично при вибірці команди

Всі стекові операції. Всі звернення через esp ebp

Усі звернення до даних, крім стекових і ланцюжкових.

Приймач в ланцюжкових

командах

Відзначимо, що префікс заміни сегмента не діє на вибір сегмента за замовчуванням (домовленістю, тобто правилами, вказаними в цій таблиці) в таких випадках:

  • для адресації ланцюжків-приймачів використовується тільки регістр es;

  • приймач записування в стек або джерело вибору зі стека знаходиться в сегменті, адресованому регістром ss;

  • вибір команди здійснюється тільки із сегмента, який адресується регістром cs.

В архітектурі процесора два регістри постійно містять інформацію, яка характеризує стан як процесора, так і програми, команди якої він виконує в даний момент: регістр-вказівник команд eip/ip і регістр прапорців eflags/flags. За допомогою цих регістрів можна обмежено керувати станом процесора.

Вказівник команд. Регістр вказівник команд (instruction pointer register) eip/ip має розрядність 32/16 бітів, містить зміщення наступної команди відносно вмісту регістра сегмента коду cs, тобто використовується для адресації команд в поточному сегменті коду. Цей регістр безпосередньо не доступний програмістові, завантаження і зміна його значення виконуються за допомогою різних команд передачі керування: команд умовного і без умовного переходу, виклику і повернення з процедур, переривань і повернення з переривань. Ми вважатимемо, що після закінчення вибірки з пам’яті поточної команди в регістрі eip/ip формується адреса наступної команди. Хоча це й не так. Процесор i486 не вибирає по одній команді. Він здійснює випереджаючу вибірку вирівняних на межу параграфа 16-байтових блоків коду під час виконання команд. Такі блоки вибираються незалежно від меж між командами (довжини команд різні). До початку виконання команда вже завантажена в процесор і декодована. Це значно підвищує продуктивність процесора. Якщо виконується команда переходу або виклику підпрограми, черга передвибірки команд очищується, процесор вибирає цілий вирівняний блок, який містить адресу призначення (target). Вибрані раніше і декодовані команди втрачаються. Якщо в результаті випереджуючої вибірки виникає особливий випадок (exeption), наприклад. спроба вибірки поза сегментом коду, про це повідомляється до виконання команди, яка зумовила цей особливий випадок. Якщо команда вилучається з черги передвибірки (наприклад, в результаті команди переходу), то про особливий випадок не повідомляється (особливий випадок ігнорується).

Розрядність регістра прапорців (flag register) eflags/flags дорівнює 32/16 бітів. Окремі біти даного регістра мають певне функціональне призначення і називаються прапорцями. Молодша частина eflags/flags повністю еквівалентна регістрові flags процесора 8086.

2. Структура регістра eflags

Як ми вже відзначали, регістр прапорців eflags має розрядність 32 і його молодші 16 бітів еквівалентні регістрові flags процесора 8086. Наведемо вміст регістра прапорців і охарактеризуємо прапорці.

11

10

09

08

07

06

05

04

03

02

01

00

of

df

if

tf

sf

zf

0

af

0

pf

1

cf

31

21

20

19

18

17

16

15

14

13 12

0

id

vid

vif

ac

vm

rf

0

nt

iopl

Рис. 2.1 Регістр прапорців eflags/flags

Прапорці регістра eflags можна розподілити на три групи.

В першу групу входять вісім прапорців стану: cf, pf, af, zf, sf, of, iopl, nt. Ці прапорці можуть змінити своє значення після виконання машинних команд. Вони відображують особливості виконання арифметичних або логічних операцій, тобто стан обчислювального процесу, і можуть бути проаналізовані за допомогою команд умовних переходів і викликів підпрограм. Це наступні прапорці:

  • прапорець перенесення (carry flag) cf:

1 – арифметична операція здійснила перенесення зі старшого біта результату, старшим є 7-й, 15-й або 31-й біт у залежності від розмірності операнда;

0 – перенесення не було;

  • прапорець парності (parity flag) pf:

1 – вісім молодших розрядів (цей прапорець тільки для восьми молодших розрядів операції операнда будь-якого розміру) результату містять парну кількість розрядів зі значенням 1;

0 – вісім молодших розрядів містять непарну кількість розрядів зі значенням 1;

  • допоміжний прапорець перенесення (auxiliary carry flag) af застосовується тільки в командах, операндами яких є BCD-числа. Фіксує факт позичання/перенесення з молодшої тетради результату:

1 – в результаті виконання арифметичної операції додавання відбулося перенесення з розряду 3 в старший розряд або при відніманні було позичання в розряд 3 молодшої тетради зі значення в старшій тетраді;

0 – перенесення в четвертий і позичання в третій розряд молодшої тетради не було;

  • прапорець нуля (zero flag) zf:

1 – результат нульовий4

0 – результат не нульовий;

  • прапорець знаку (sign flag) sf відображує стан старшого біта операції (відповідно 7-й, 15-й або 31-й біти для 8-, 16- або 32-бітових операндів):

1 – старший біт результату дорівнює 1;

0 – старший біт результату дорівнює 0;

  • прапорець переповнення (overflow flag) of використовується для фіксування значущого біта в арифметичних операціях:

1 – за результатом арифметичної операції відбувається перенесення в старший знаковий біт результату або позичання зі старшого знакового біта результату (7, 15 або 31 для 8-, 16- або 32-бітових операндів відповідно);

  • рівень привілейованості введення-виведення (input/output privilege level) iopl використовується в захищеному режимі роботи процесора для контролю доступу до команд введення-виведення в залежності від привілейованості задачі;

  • прапорець вкладеності задачі (nested task) nt використовується в захищеному режимі роботи процесора для фіксування того факту, що одна задача вкладена в іншу.

Друга група – група прапорців керування має тільки один прапорець df (directory flag) – прапорець напрямку. Він використовується ланцюжковими командами для визначення напрямку опрацювання елементів ланцюжка: від початку ланцюжка (df=0) або від кінця ланцюжка до його початку (df=1). Є команди для роботи з цим прапорцем.

У третю групу регістра eflags входить вісім системних прапорців, які керують введенням-виведенням, маскованими перериваннями, налагодженням, перемиканнями між задачами і режимом віртуального процесора 8086. Наведемо опис цих прапорців:

  • прапорець трасування (trace flag) tf використовується для організації покрокової роботи процесора:

1 – процесор генерує переривання з кодом 1 після виконання кожної машинної команди (можна використовувати для налагодження програм, зокрема програмами налагодження;

0 – звичайна робота;

  • прапорець переривання (interrupt enable flag) if дозволяє або ні (маскує) апаратні переривання (переривання по входу intr):

1 – апаратні переривання дозволені;

0 – апаратні переривання заборонені;

  • прапорець поновлення (resume flag) rf використовується при обробці переривань від регістрів налагодження. Якщо цей прапорець дорівнює 1, то особливі ситуації, які виникли під час налагодження, тимчасово забороняються, щоб призупинити генерацію ще таких же особливих ситуацій. Установлюється в 1 командою iretd з обробника переривання. На прапорець не впливають команди popf, pushf, iret, тобто прапорець привілейований;

  • прапорець режиму віртуального процесора 8086 (virtual 8086 mode) vm прапорець віртуального режиму або V-режиму. Найбільш сильно впливає на роботу процесора. Коли vm=0, то процесор може працювати в R-режимі або P-режимі. Якщо vm=1, то процесор переводиться в V-режим, в якому емалюється програмне середовище процесора 8086, тобто i486 перетворюється у високопродуктивний процесор 8086 і можна виконувати декілька програм, розроблених для цього процесора;

  • прапорець контролю вирівнювання (alignment check) ac призначений для того, щоб дозволити контроль за вирівнюванням на відповідну межу при зверненні до оперативної пам’яті. Використовується сумісно з бітом am в системному регістрі cr0. Наприклад, Pentium дозволяє вирівнювання даних і команд, починаючи з будь-якої адреси. Якщо потрібно контролювати вирівнювання даних і команд за адресами, які кратні 2 або 4, то установка даних бітів зумовлюватиме те, що при кожному зверненні до оперативної пам’яті за некратними адресами, виникатиме особлива ситуація;

  • прапорець віртуального переривання (virtual interrupt flag) vif появився в процесорі Pentium. Якщо процесор працює у V-режимі, то цей прапорець є аналогом прапорця if. Прапорець vif використовується сумісно з прапорцем vip;

  • прапорець відкладеного віртуального переривання (virtual interrupt pending flag) vip – появився в процесорі Pentium, установлюється в 1 для індикації відкладеного переривання. Використовується при роботі у V-режимі сумісно з прапорцем vif;

  • прапорець ідентифікації (identification flag) id використовується для того, що показати факт підтримки процесором команди cpuid. Якщо програма може встановити цей прапорець 1 або 0, то дана модель процесора підтримує команду cpuid.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]