Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Опорний конспект лекцій_ Асемблер.Docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
506.89 Кб
Скачать
    1. Способи задання операндів

Операнд задається неявно (на мікропрограмному рівні). В таких командах використовуються об’єкти по замовчуванню (регістри, прапори).

Операнд задається в команді (безпосередній операнд). Безпосередній операнд може бути тільки другим операндом (джерелом).

Операнд знаходиться в одному із регістрів. В якості регістрів можуть використовуватися:

  • 32-розрядні EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP;

  • 16-розрядні AX, BX, CX, DX, SI, DI, SP, BP;

  • 8-розрядні AH, AL, BH, BL, CH, CL, DH, DL;

  • сегментні CS, DS, SS, ES, FS, GS.

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

  • непряма базова;

  • непряма базова із зміщенням;

  • непряма індексна із зміщенням;

  • непряма базова індексна;

  • непряма базова індексна із зміщенням.

Операндом є порт вводу-виводу. Крім адресного простору оперативної пам’яті, МП підтримує адресний простір вводу-виводу, який використовується для доступу до пристроїв вводу-виводу. Об’єм його складає 64 Кбайт. Конкретне значення адресу в межах цього простору називається портом. Фізично порту відповідає апаратний регістр, доступ до якого здійснюється командами in і out. Регістри, що адресуються з допомогою порта вводу-виводу можуть мати розрядність 8, 16 і 32 біти, але для конкретного порта розрядність фіксована.

Операнд знаходиться у стеку.

Більшість команд має два операнди. Перший із них приймач, другий – джерело. Один операнд може знаходитися в регістрі або пам’яті, а другий обов’язково у регістрі або безпосередньо у команді. Тому у двооперандній команді можливі наступні об’єднання операндів:

  • регістр – регістр;

  • регістр – пам’ять;

  • безпосередній операнд – регістр;

  • безпосередній операнд – пам’ять.

Є виняток для команд:

  • робота із ланцюжками (дані переміщаються із пам’яті в стекову пам’ять);

  • робота із стеком (дані переміщаються із пам’яті в стек);

  • команда множення (використовується неявний операнд).

    1. Адресація пам’яті

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

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

mov ax, dword ptr [0000];записати слово з адресу ds:[0000] в регістр

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

data segment

name dw 5 ;записати слово по адресу ds:0000 в пам’ять

data ends code segment

mov ax, name ; записати слово name по фізичному адресу ds:0000

o відносна пряма адресація. Використовується в командах умовних переходів для вказання відносного адреса переходу. Обчислюється зміщення мітки відносно наступної команди після переходу і додається до вмісту регістра ip (вказівник команд). Наприклад:

jc m1 mov al, 2

m1: ; зміщення мітки обчислюється відносно команди mov

Непряма базова адресація – ефективний адрес може знаходитися в любому із регістрів загального призначення (крім esp/sp, ebp/bp). Синтаксично це виражається у включенні імені регістра у дужки. Наприклад mov ax, [ecx] пересилає в регістр ax вміст слова по адресу із сегмента даних із зміщенням із регістра ecx.

Непряма базова (регістрова) із зміщенням – забезпечує доступ до даних з відомим зміщенням відносно базового адресу. Наприклад: mov ax, [ecx+3h] пересилає в регістр ах слово по адресу ecx+3h. Команда mov ax, mas[dx] пересилає в регістр слово по адресу dx плюс mas (ідентифікатору mas присвоюється значення зміщення відносно початку сегмента даних).

Непряма індексна із зміщенням – подібна до непрямої базової із зміщенням і добавлена можливість масштабування індексного регістра. Наприклад, в команді mov ax, [esi*2] значення ефективного адреса обчислюється виразом mas+(esi)*2. Використовується для організації масивів з розмірами елементів 1, 2, 4, 8 байт.

Непряма базова індексна – ефективний адрес формується як сума вмісту двох регістрів загального призначення: базового і індексного. Наприклад: mov eax, [esi][edx] формує адрес із двох компонентів (esi)+(edx).

Непряма базова індексна із зміщенням – ефективний адрес формується як сума трьох складових: вміст базового регістру, індексного регістру і поле зміщення в команді. Наприклад команда mov eax, [esi+5][edx] пересилає у регістр eax подвійне слово по адресу (esi) + 5 + (edx). Команда add ax, mas[esi][ebx] додає до регістру ax вміст слова по адресу mas + (esi) + (ebx).