Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lekz._5.doc
Скачиваний:
1
Добавлен:
11.08.2019
Размер:
223.74 Кб
Скачать

Відмінності між .Ехе и .Сом

Істотні відмінності між програмами, які повинні виконуватися як .ЕХЕ і .СОМ, включають розмір програми, сегментування та ініціалізацію.

Розмір програми. Програма типу .СОМ використовує єдиний сегмент для інструкцій і даних, обмежений розміром 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СН завершує роботу.

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