Доповідь - Мікропроцесори 80186 та 80188 серії iX86 фірми Intel
Химия

Доповідь — Мікропроцесори 80186 та 80188 серії iX86 фірми Intel


Завантажити доповідь: Мікропроцесори 80186 та 80188 серії iX86 фірми Intel

Вибір у програмі на асемблері типу процесора

За замовчуванням Турбо Асемблер асемблює код тільки для процесора 8086. Щоб Турбо Асемблер міг підтримувати інші процесори серії iAPx86, або співпроцесори, ви повинні вказувати відповідні директиви. Наступні директиви повідомляють Турбо Асемблеру, який тип процесора потрібно підтримувати під час асемблювання коду:

  .186       .286C       .287      .386C       .387       .8087
.286 .286P .386 .386P .8086

Ці директиви можна вказувати в будь-якому місці вихідного файлу, після чого вони одразу набувають чинності. В одному вихідному файлі можна розмістити кілька директив вибору типу процесора, при цьому поточним процесором вважається процесор, вибраний за останньою вказаною директивою.

У будь-який момент можна вказати директиву .8086, за якою Турбо Асемблер знову підтримуватиме лише процесор 8086.

(В решті даного розділу всі посилання на процесор 8086 ставляться однаково і до процесора 8088.)

ПРОЦЕСОРИ 80186 І 80188

Процесор 80186 (який є процесором серії iAPx86) в основному аналогічний процесору 8086. Процесор 80186 підтримує всі інструкції процесора 8086, а також кілька нових інструкцій та розширені форми деяких інструкцій процесора 8086.

Процесор 80188 має програмну сумісність з процесором 80186. Єдина відмінність між ними полягає в тому, що процесор 80186 має 16-розрядну шину даних, а процесор 80188 — 8-розрядну.

Підтримка Ассемблера Турбо для асемблювання коду процесора 80186 дозволяється за директивою .186.

Далі ми розглянемо нові та розширені інструкції процесора 80186. Перед початком розгляду зазначимо, що процесор 8086 не розпізнає жодну з тих інструкцій, які ми обговорюватимемо. У результаті всі програми, які містять хоча б одну інструкцію (нову або розширену) процесора 80186, на процесорі 8086 не працюватимуть.

Нові інструкції

Набір інструкцій процесора 80186 містить нові інструкції:

   BOUND      INS       OUTS      PUSHA
ENTER LEAVE POPA

Інструкції PUSHA та POPA

Інструкції PUSHA та POPA надають ефективний засіб, за допомогою якого можна заносити та витягувати зі стека всі вісім загальних регістрів. Інструкцій PUSHA заносить у стек вісім загальних регістрів у такому порядку: AX, CX, DX, BX, SP, BP, SI, DI. POPA витягує регістри DI, SI, BP, BS, DX, CX та AX (тобто виконує дію, протилежну дії інструкції PUSHA). Регістр SP інструкцією POPA не виймається, натомість SP збільшується на 16 — довжину блоку регістрів, занесених у стек за інструкцією PUSHA, а значення SP, занесене в стек за інструкцією PUSHA, очищується інструкцією POPA і відкидається. На сегментні регістри, прапори та покажчик інструкцій PUSHA та POPA не впливають.

Зверніть увагу, що інструкція PUSHA виконується швидше, ніж вісім окремих інструкцій PUSH, але повільніше, ніж три або чотири інструкції PUSH. Якщо ви хочете зберегти лише кілька регістрів, краще зробити це за допомогою інструкції PUSH. Таке ж зауваження можна зробити щодо інструкцій POPA та POP.

Інструкції ENTER та LEAVE

Інструкції ENTER і LEAVE використовуються для того, щоб встановити і скасувати межі стека, в яких параметри, що передаються, і локальні динамічні змінні доступні щодо BP. Ці інструкції особливо корисні для організації інтерфейсу Ассемблера з мовами, орієнтованими працювати зі стеком (наприклад, Сі).

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

Інструкція LEAVE має дію, зворотну інструкції ENTER, та відновлює BP та SP у той стан, який вони мали перед виконанням відповідної інструкції ENTER.

SampleFunction  PROC
enter 10,1
.et
SampleFunction ENDP

Перший операнд інструкції ENTER є 16-бітовим проміжним значенням, що задає число байтів, зарезервованих для локальних змінних в новій межі стека. Другий операнд інструкції ENTER — це 8-бітове проміжне значення, що задає рівень вкладеності функції, для якої має створюватися нова межа стека. Цей операнд задає, скільки разів потрібно скопіювати вказівники межі стека з меж стека коду, що викликає, в нові межі стека.

Інструкція BOUND

Директива BOUND перевіряє, що 16-бітове значення знаходиться в діапазоні зі знаком, заданим двома суміжними словами пам’яті, при цьому верхня межа записана за адресою, розташованою безпосередньо над нижньою межею. Обидві межі інтерпретуються як значення зі знаком, тому можна задати максимальний діапазон від -32768 до +32767 включно. Значення, що збігаються з нижньою або верхньою межею, розглядаються як такі, що належать заданому діапазону.

Інструкція BOUND використовується зазвичай для того, щоб запобігти виходу за межі масиву. Якщо BX не в заданому діапазоні, то генерується переривання INT 5.

Перший операнд інструкції BOUND є 16-розрядним регістром загального призначення, що містить перевірене значення. Другий операнд інструкції BOUND – це подвійне слово, що містить діапазон. Це подвійне слово містить 16-бітовий нижній кордон у молодшому слові та 16-бітовий верхній кордон зі знаком як старше слово.

Інструкції INS та OUTS

Інструкції INS та OUTS забезпечують ефективну передачу даних між портами введення-виведення та пам’яттю.

Інструкція INS переміщає один або більше байтів (або слів) з порту введення-виводу, на який вказує регістр DX, масив у пам’яті, на який вказують ES:DI, збільшуючи DI на 1 (або на 2) після того, як кожен байт (або слово) буде переданий (або зменшуючи SI, якщо встановлено прапор направлення).

Інструкція OUTS переміщає один або більше байтів (або слів) з масиву в пам’яті, на який вказують DS:SI, порт вводу-виводу, на який вказує регістр DX, збільшуючи SI на 1 (або 2) після пересилання кожного байта (або слова ) або зменшуючи регістр SI, якщо встановлено прапор напряму.

Розширені версії інструкцій процесора 8086

У наборі інструкцій процесора 80186 є такі розширені версії інструкцій процесора 8086:

        IMUL            ROL             SAR
PUSH ROR SHL
RCL SAL SHR
RCR

Занесення в стек проміжних значень

У той час як процесор 8086 може заносити в стек тільки регістрові операнди або операнди в пам’яті, процесор 80186 може заносити в нього також проміжні значення:

push 19

Зсуви та циклічні зрушення з безпосередніми значеннями

У той час як процесор 8086 може тільки виконувати зсув або циклічний зсув на 1 біт або на число бітів, задане в CL, процесор 80186 може виконувати зсув або циклічний зсув на значення-константу:

        ror     ax,3
shl dl,7

Розмноження на безпосереднє значення

Процесор 8086 може множити тільки 8 або 16-розрядний регістр або операнд в пам’яті на AL або AX, розміщуючи результат в AX або DX:AX. У процесорі 80186 передбачені дві нові форми множення, які використовуються, коли 16-розрядне множення розміщуватиметься у 16 ​​бітах.

Одна з нових форм множення перемножує 16-розрядний регістр та 16-розрядне безпосереднє значення, а результат зберігає назад у 16-розрядному регістрі. Наприклад, наступна інструкція множить DX на 4, а твір записує DX:

        imul    dx,4

Перший операнд, який може бути будь-яким 16-розрядним регістром загального призначення, є одночасно джерелом для одного з співмножників і приймачем для твору. Другий операнд, який має являти собою безпосереднє 16-бітове значення, — це інший співмножник.

Ще одна нова форма множення перемножує 16-розрядний регістр або операнд у пам’яті на 16-бітове безпосереднє значення і зберігає результат у заданому 16-бітовому регістрі. Наприклад, наступна інструкція множить DX на 600h і поміщає твір CX:

        imul    cx,dx,600h

Аналогічно, наступна інструкція помножує 16-розрядне значення [BX+SI+1] на 3 і поміщає твір AX.

        imul    ax,[bx+si+1],3

У цій формі інструкції IMUL перший операнд є приймачем. Цей операнд може бути будь-яким 16-розрядним загальним регістром. Другий операнд, який може задаватися будь-яким 16-розрядним загальним регістром або осередком пам’яті, є джерелом одного з співмножників. Третій операнд, який має задаватися 16-бітовим безпосереднім значенням, – це інший співмножник.

Перша з нових форм множення — це насправді підмножина другої нової форми. Наприклад, наступна інструкція:

        imul    si,10

це просто скорочена форма інструкції:

        imul    si,si,10

Для обох нових форм інструкції IMUL відповідний шістнадцятковий код буде однаковим. Тим не менш, зручно мати можливість використовувати простішу форму інструкції IMUL з двома операндами, коли один і той же регістр використовується як джерело, і як приймач.

За будь-якої з нових форм множення будь-яка частина результату, яка не міститься в 16 бітів, втрачається. Якщо губляться значні біти (припускаючи, що результат повинен бути значенням зі знаком), то встановлюються прапори перенесення і переповнення. У нових формах операції множення множення значень зі знаком та беззнакових значень не різняться, оскільки результат має довжину лише 16 бітів, і молодші 16 бітів твору (отриманого в результаті перемноження значень зі знаком, так і беззнакових значень) завжди збігаються. Отже, для позначення нових форм множення можна використовувати лише інструкцію IMUL.

© Реферат плюс



Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *