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

Карта зв` язків

Для програми A04ASM1 компонувальник видасть таку карту:

START STOP LENGTH NAME CLASS

00000Н 0003FH 0040H STACK STACK

00040Н 00045Н 0006H DATASEG DATA

00050Н 00063Н 0014H CODESEG CODE

Program entry point at 0005:0000

Рис. 4.4 – Карта звязків, утворювана компонувальником

• Першим сегментом є стек, що починається зі зміщення 0 байт від початку програми. Оскільки він визначений як 32 слова, його довжина дорівнює 64 байтам, як показано в рядку параметрів (0040Н).

• Сегмент даних починається з наступній доступній межі параграфа, зміщення - 40Н.

• Сегмент коду починається з наступній межі параграфу, зміщення - 50Н (деякі асемблери переставляють сегменти в алфавітному порядку).

• Точка входу програми, 0005:0000, представлена у формі сегмент:зміщення, посилається на відносну адресу першої виконуваної інструкції. В результаті відносна стартова адреса - байт в сегменті 5[0], зміщення 0 байт, що відповідає межі сегменту коду із зміщенням 50Н. Завантажувач програми використовує це значення при завантаженні програми на виконання.

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

4. Виконання програми

Відтранслювавши і скомпонувавши програму, ви можете виконати її. Якщо виконуваний файл розташований у поточній папці, ви можете наказати завантажувачу злічити його в пам'ять для виконання, ввівши в командному рядку

A04ASM1.ЕХЕ або

A04ASM1 (без розширення .ЕХЕ).

Якщо ви пропустите розширення імені файлу, завантажувач припустить, що запитаний файл є виконуваним (типу .ЕХЕ або .СОМ). Однак оскільки створена програма не відображає будь-яких результатів роботи на екрані, краще запустити її в програмі DEBUG і використовувати команди Т для спостереження за її виконанням. Введіть наступний рядок, включаючи розширення .ЕХЕ:

DEBUG n:А04ASM1.EXE

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

Для перегляду сегмента стеку введіть D SS:0. Стек, відповідно до результату ініціалізації, містить суцільні нулі.

Для перегляду сегменту коду введіть D CS:0. Порівняйте виведений на екран машинний код з кодом, наведеним у асемблерному лістингу:

В8----8ED8A10000 ...

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

Для перегляду вмісту peгістрів введіть R і натисніть <Enter>. SP (покажчик стека) повинен містити 0040Н, що відповідає розміру стека (32 слова по 2 байти або 64 (40Н) байтів). IP (покажчик інструкцій) повинен містити 0000Н. SS і CS правильно проініціалізовані для виконання, їх значення залежать від адреси в пам'яті, за яким завантажена ваша програма.

Перша інструкція MOV АХ,хххх готова до виконання - вона і наступна інструкція MOV ініціалізують регістр DS. Для виконання першої інструкції MOV введіть Т (відстеження) і натисніть <Enter>. Зверніть увагу на зміну вмісту IP. Для виконання другої інструкції MOV знову введіть Т і натисніть <Enter>. Перегляньте вміст DS - тепер він повинен бути ініціалізованим початковою адресою сегменту даних.

Третя інструкція MOV завантажує вміст FLDD в АХ. Виконайте Т знову і відмітьте, що АХ тепер містить 00D7. Тепер введіть Т для виконання інструкції ADD і відзначте, що АХ містить 0154Н. Введіть Т ще раз, і наступна інструкція MOV запише вміст АХ в слово зі зміщенням 0004 в сегменті даних.

Для того щоб переглянути вміст сегменту даних, введіть D DS:0. Операція показує три елементи даних (слова) у вигляді D7 00 7D 00 54 01 з байтами кожного слова, записаними в зворотній послідовності.

Зараз ви можете скористатися командою L для перезавантаження програми на виконання або командою Q для завершення роботи з DEBUG.

5. Лістинг з перехресними посиланнями і лічильник положення в асемблері

При запиті асемблер генерує файл, який ви можете використовувати для створення таблиці перехресних посилань ідентифікаторів або символів програми. Розширення цього файлу - .SBR в MASM 6.1, .CRF для MASM 5.1 і .XRF для TASM. Однак вам все одно доведеться перетворити цей файл у відсортований належним чином файл перехресних посилань.

На рис. 4.5 показаний лістинг перехресних посилань, створений для програми з рис. 4.3. Символи в першому стовпці розташовані в алфавітному порядку. Числа в наступному стовпці, представлені у вигляді n #, вказують рядок у файлі .LST, в якому визначено кожен символ. Числа праворуч від цього стовпця - це номери рядків, що показують, які інші речення посилаються на цей символ. Наприклад, CODESEG визначений у рядку 17, а до нього звертаються в рядках 19 та 29. FLDF визначений у рядку 14, а на нього посилаються в рядку 25 +, де " '+" означає, що його значення змінюється в ході виконання програми (інструкцією MOV FLDF,AX).

Symbol Cross-Reference (# definition, + modification)

MAIN . . . . . . . . . . . . . 18# 28 30

CODE . . . . . . . . . . . . . 17

CODESEG. . . . . . . . . . . . 17# 19 29

DATA . . . . . . . . . . . . . 11

DATASEG. . . . . . . . . . . . 11# 15 19 20

FLDD . . . . . . . . . . . . . 12# 23

FLDE . . . . . . . . . . . . . 13# 24

FLDF . . . . . . . . . . . . . 14# 25+

STACK. . . . . . . . . . . . . 4

STACK. . . . . . . . . . . . . 4# 9 19

Рис. 4.5 – Таблиця перехресних посилань

Асемблювання програми створює множину проміжних файлів. Ви можете вільно видаляти файли. .OBJ, .CRF і .LST. Зберігайте файли .ASM на випадок, якщо вам знадобиться внести зміни в програму, і .ЕХЕ для виконання програми.

Асемблер використовує лічильник положення (location counter), який призначений для обліку кожного визначеного в сегменті даних елемента даних. На рис. 4.3 показана робота цього лічильника на прикладі трьох визначених елементів даних:

0000 … FLDD DW …

0002 … FLDE DW …

0004 … FLDF DW …

Спочатку лічильник положення встановлено в 0, і в комірці з цим зміщенням в сегменті даних асемблер розміщує перший елемент даних, FLDD. Оскільки FLDD визначено як слово, асемблер збільшує значення лічильника положення на 2, до 0002, і в комірці з цим зміщенням розміщує слово FLDE. Потім асемблер ще раз збільшує значення лічильника положення на 2, до 0004, для розміщення наступного елемента даних, FLDF, також визначеного як слово. Далі асемблер знову збільшує значення лічильника положення на 2, до 0006, але елементів даних, які потрібно визначити і розмістити в пам'яті, більше немає.

Асемблер пропонує кілька способів зміни поточного значення лічильника положення. Наприклад, можна використовувати директиву EQU для перевизначення елементів даних з різними іменами, використовувати директиву ORG, щоб починати програму з певного зміщення, і директиви EVEN і ALIGN - для вирівнювання адрес по межах з парними номерами.

Примітка.

Директива EVEN змушує транслятор при необхідності збільшувати значення лічильника адреси, щоб розміщувати наступну інструкцію або елемент даних за парною адресою. Це дозволяє коду працювати швидше на процесорах, що обробляють одночасно 16 або 32 біта. Директива ALIGN 2 дає той же ефект, що і EVEN. У наступному прикладі BYTE_LOCN - однобайтовий елемент даних, вирівняний по парній межі - 0016. Поточне значення лічильника адреси 0017. EVEN змушує асемблер збільшити значення лічильника до 0018 - наступного парного значення. За цією адресою буде розміщуватися наступний елемент даних - слово WORD_LOCN:

0016 BYTE_LOCN DB ?

0017 EVEN ;Збільшуємо значення лічильника адреси

0018 WORD_LOCN DW ?

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