ВІКІСТОРІНКА
Навигация:
Інформатика
Історія
Автоматизація
Адміністрування
Антропологія
Архітектура
Біологія
Будівництво
Бухгалтерія
Військова наука
Виробництво
Географія
Геологія
Господарство
Демографія
Екологія
Економіка
Електроніка
Енергетика
Журналістика
Кінематографія
Комп'ютеризація
Креслення
Кулінарія
Культура
Культура
Лінгвістика
Література
Лексикологія
Логіка
Маркетинг
Математика
Медицина
Менеджмент
Металургія
Метрологія
Мистецтво
Музика
Наукознавство
Освіта
Охорона Праці
Підприємництво
Педагогіка
Поліграфія
Право
Приладобудування
Програмування
Психологія
Радіозв'язок
Релігія
Риторика
Соціологія
Спорт
Стандартизація
Статистика
Технології
Торгівля
Транспорт
Фізіологія
Фізика
Філософія
Фінанси
Фармакологія


Структура об’єктної програми

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

У крайній лівій колонці вказані номери рядків програми.

У наступній колонці міститься значення лічильника адреси в шістнадцятковому форматі для кожного рядка програми. Кожний сегмент програми (стека, даних, коду) починається з відносної адреси 0000. В сегменті даних значення лічильника команд збільшується на кількість числа байтів у відповідності з типом даних (DB – 1, DW – 2, DD – 4). В сегменті коду значення лічильника команд збільшується на число байтів у відповідності з форматом команди. Директиви у програмі не змінюють значення лічильника команд.

Розглянемо більш детально процес трансляції команд Асемблера в машинний код.

Мова Асемблер є по суті майже машинною мовою, оскільки кожна її команда відповідає одній машинній команді, але записаній у символічній формі (у мнемокоді). Тому процес трансляції зводиться до заміни мнемо­ко­ду, зручного для людини, на машинний код, зручний для апаратної реалізації.

Для отримання машинного коду будь-якої команди необхідно знати її формат та режим адресації мікропроцесора.

Наприклад, команда

MOV reg1, reg2

використовує регістрову адресацію для обох операндів, тому її формат такий, як показано на рис.1.

 

           
КОП d w   mod reg1 reg2  
  Рисунок 1 – Формат команди для режиму регістрової адресації
                                     

 

Перший байт команди містить код операції (КОП) і два однобітових поля – направлення передачі d (якщо d=1,то в напрямі мікропроцесора, а якщо d=0, то, навпаки, з мікропроцесора) та формат даних w (якщо w=1, то команда оперує словом, а якщо w=0, то байтом).

Другий байт команди (постбайт) вказує на режим адресації modі коди регістрів reg1 та reg2. Для регістрової адресації поле mod дорівнює 11. Спосіб кодування регістрів мікропроцесора наведений в табл.2.

Таблиця 2 – Адресація регістрів

Код (поле reg) 8-бітові регістри 16-бітові регістри 32-бітові регістри
AL AX EAX
CL CX ECX
DL DX EDX
BL BX EBX
AH SP ESP
CH BP EBP
DH SI ESI
BH DI EDI

Таким чином, команді Асемблера

MOV BX, SI

відповідає такий машинний код:

10001011 11011110

Розглянемо більш загальні випадки, коли один з операндів знаходиться у комірці пам’яті. Таким випадкам відповідають наступні режими адресації, тобто, методи визначення ефективної (виконавчої) адреси в команді: пряма, індексна, базово-індексна, опосередкована регістрова.

Найбільш загальний формат двооперандної команди для вказаних режимів адресації наведено на рис.2.

Другий байт команди складається з трьох полів:

mod – режим адресації;

reg – регістр;

r/m – регістр/пам’ять.

 

 

                   
КОП d w   mod reg r/m   disp L   disp Н  
Рисунок 2 – Загальний формат двооперандної команди
                                                     

 

Якщо mod = 11, це означає, що операнд знаходиться в регістрі, в решті випадків операнд знаходиться в пам’яті, і тоді поле mod визначає, як використовується (необов’язкове) зміщення disp, яке знаходиться в третьому та четвертому байтах команди, а саме:

mod=   00, disp=0 – зміщення відсутнє,
01, disp=disp L – команда містить 8-бітне зміщення, яке розширюється зі знаком до 16 бітів
10, disp=disp H, disp L – команді містить два байти зміщення

В тих самих випадках (коли mod ≠ 11) поле r/m визначає, яким чином формується ефективна адреса операнда. Кодування поля r/m наведено в таблиці 3.

Таблиця 3 – Формування ефективної адреси пам’яті

Поле r/m Ефективна адреса
EA = (BX) + (SI) + disp
EA = (BX) + (DI) + disp
EA = (BP) + (SI) + disp
EA = (BP) + (DI) + disp
EA = (SI) + disp
EA = (DI) + disp
EA = (BP) + disp
EA = (BX) + disp

 

Наведені правила формування ефективної адреси мають один виняток: якщо mod = 00 та r/m = 110, то EA = disp H, disp L. Тут в команді міститься абсолютна адреса пам’яті.

Як приклад розглянемо асемблювання команди додавання до регістру ВХ елемента масива MAS:

ADD BX, MAS[SI]

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

При асемблюванні величина зміщення disp визначається транслятором із сегменту даних, де описується масив MAS. Нехай, наприклад, елементи масива MAS задані у форматі слова і починаються з шостого байта від початку сегмента даних. Код операції даної команди додавання становить 000 000.

Таким чином, отримуємо такий машинний код команди, яку ми асемблюємо:

0000 0011 1001 1100 0000 0110 0000 0000

або в шістнадцятковому форматі:

03 9С 06 00.

Існує ряд особливостей асемблювання команд з безпосередньою адресацією. Формат двооперандної команди з безпосередньою адресацією наведено на рис.3.

 

                         
КОП s w   Mod КОП r/m   disp L   disp H   data L   data H  
Рисунок 3 – Формат двооперандної команди з безпосередньою адресацією
                                                                       

В таких командах другий операнд знаходиться в самій команді і його адресувати немає потреби, тому поле reg другого байта команди використовується як розширення коду операції. Крім того, тут не потрібний біт d, оскільки результат можна розмістити тільки на місце першого операнда. Але і в цьому форматі необхідно визначити розмір (тип) безпосереднього операнда. Для цієї мети призначені біти s та w.

 

sw=   x0, один байт даних data L;
01, два байти (слово) даних data H, data L;
10, один байт даних, який розширюється зі знаком до 16 бітів

 

Поля mod та r/m інтерпретуються так само, як і в попередньому форматі.

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

 

© 2013 wikipage.com.ua - Дякуємо за посилання на wikipage.com.ua | Контакти