Відмінності між .Ехе и .Сом
Істотні відмінності між програмами, які повинні виконуватися як .ЕХЕ і .СОМ, включають розмір програми, сегментування та ініціалізацію.
Розмір програми. Програма типу .СОМ використовує єдиний сегмент для інструкцій і даних, обмежений розміром 64 К, включаючи префікс сегмента програми (PSP). PSP - це 256-байтний (100Н) блок, який завантажувач програм вставляє безпосередньо перед програмами при завантаженні їх в пам'ять з диска.
Програма типу .СОМ завжди менше, ніж .ЕХЕ, що виконує аналогічні функції; одна з причин цього - наявність в програмі .ЕХЕ 512-байтного заголовка, відсутнього в програмах типу .СОМ (не плутайте блок заголовка з префіксом сегмента програми PSP). Програма .СОМ - точне відображення виконуваної програми без інформації про переміщувані адреси.
Сегменти. Використання сегментів в програмах .СОМ істотно відрізняється (в бік спрощення) у порівнянні з .ЕХЕ. Готова програма типу .СОМ поєднує PSP, стек, сегмент коду і сегмент даних в одному сегменті коду.
Для програми типу .ЕХЕ зазвичай ви самі визначаєте сегмент даних і ініціалізуєте DS адресою цього сегмента. Для програми .СОМ ви визначаєте дані в сегменті коду точно так само, як ви це робили з використанням DEBUG в лаб.роб. 1.
Ви повинні самі визначати сегмент стека для програми типу .ЕХЕ, але асемблер самостійно створить стек для програми типу .СОМ. Тому, якщо ви пишете програму, яка повинна буде виконуватися у вигляді .СОМ, пропустіть визначення стека.
Якщо сегмент розміром 64 Кбайт досить великий для програми, завантажувач розміщує стек в кінці сегмента і встановлює в SP значення, яке вказує на вершину стека. Якщо сегмента розміром 64 Кбайт не вистачає для розміщення програми, асемблер поміщає стек після програми, у верхній пам'яті (однак, імовірно, програма такого розміру буде написана у форматі .ЕХЕ).
Деякі невеликі програми ми будемо писати в форматі .СОМ, їх легко відрізнити від програм типу .ЕХЕ. На рис. 5.4 зображено розміщення в пам'яті сегментів програм типів .ЕХЕ і .СОМ.
Рис. 5.4 – Сегментна структура ЕХЕ та СОМ програм
Ініціалізація. Коли завантажувач програм завантажує для виконання програму .СОМ, він автоматично ініціалізує CS, DS, SS і ES адресою PSP. Тепер CS і DS містять правильні адреси початку сегменту в період виконання, і програма типу .СОМ не повинна їх ініціалізувати.
Оскільки PSP має розмір 100Н байтів, адресація починається зі зміщення 100Н байт. Ви повинні ввести в текст програми директиву ORG 100H відразу за реченням SEGMENT або .CODE в сегменті коду. Ця директива наказує асемблеру встановити лічильник положення в значення 100Н. Після цього асемблер почне генерувати об'єктний код, починаючи з комірки з адресою 100Н (відразу після PSP), маючи в своєму розпорядженні там код програми типу .СОМ.
Написання програми у форматі .Сом
Якщо ваша початкова програма вже написана у форматі .ЕХЕ, ви можете використовувати редактор для перетворення інструкцій у формат .СОМ.
Програма на рис. 5.5 аналогічна програмі, наведеній на рис. 4.1 (лекц. 4), але змінена і приведена у відповідність вимогам формату .СОМ.
TITLE A05COM1 COM-програма переміщення та додавання CODESEG SEGMENT PARA ASSUME CS:CODESEG, DS:CODESEG, SS:CODESEG , ES:CODESEG ORG 100H ;Починається в кінці PSP BEGIN: JMP MAIN ;Перехід через дані ; ------------------------------------------------------------------------------------------------------------------------------ FLDD DW 215 ;Визначення даних FLDE DW 125 FLDF DW ? ; ------------------------------------------------------------------------------------------------------------------------------ 1 MAIN PROC NEAR MOV AX,FLDD ;Помістити 0215 в АХ ADD AX,FLDE ;Додати 0125 в АХ 1 MOV FLDF,AX ;Зберегти суму в FLDF 1 MOV AX,4C00H ;Завершити роботу INT 21H MAIN ENDP ;Кінець процедури CODESEG ENDS ;Кінець сегменту END BEGIN ;Кінець програми Рис. 5.5 – Початкова програма типу .СОМ зі звичайними визначеннями сегментів |
Відзначимо тут таке.
Немає визначених сегментів стека і даних.
Речення ASSUME вказує асемблеру, що CS, SS, DS і ES повинні містити адресу початку сегменту коду (адреса, з якої починається PSP), коли програма завантажується для виконання.
Директива ORG 100H вказує асемблеру збільшити значення лічильника його положення на 100Н байт від початку PSP. Завантажувач програми помістить значення 100Н в регістрі ІР (покажчику інструкцій) при завантаженні програми .СОМ. Через це перше речення, наступне за ORG, повинне бути виконуваною інструкцією.
Інструкція JMP передає управління виконанням на початок програми, пропускаючи визначення даних. Деякі програмісти записують елементи даних за інструкціями, так що в початковій команді JMP немає необхідності. Запис елементів даних на початку може трохи прискорити процес трансляції, але не дає інших переваг. Ми визначаємо дані на початку програм просто з міркувань стандартизації.
Мітки BEGIN і MAIN мають лише описове значення і не мають значення для асемблера. Для цих міток можна використовувати будь-які коректні імена.
Стандартна функція INT 21Н 4СН завершує роботу.