Ассемблер и программирование для IBM PC



       

ГЛАВА 21. Компановка программ - часть 6


CODESG SEGMENT PARA PUBLIC 'CODE'

------------------------------------------------------------ ------------------------------------------------------------ Рис.21.4. Кодовый сегмент, определенный как PUBLIC.

Ассемблер для IBM PC. Глава 21 6

Рассмотрим результирующую карту компановки и ообъектный код команды CALL. Из таблицы идентификаторов (в конце каждого листинга ассемблирования) следует: обобщенный тип кодового сегмента CODESG - PUBLIC (на рис.21.3 было NONE). Но более интересным является то, что карта компановки в конце листинга показыва ет теперь только один кодовый сегмент! Тот факт, что оба сегмента имеют одни и те же имя (CODESG), класс ('CODE') и атрибут PUBLIC, заставил компановщика объединить два логичес ких кодовых сегмента в один физический кодовый сегмент. Кроме того, при трассировке выполнения программы можно обнаружить, что теперь команда вызова подпрограммы имеет следующий объектный код:

9A 2000 D213

Эта команда заносит шест.2000 в регистр IP и шест. D213 в регистр CS. Так как подпрограмма находится в общем с основной программой кодовом сегменте, то в регистре CS устанавливается тот же стартовый адрес - шест.D213. Но теперь смещение равно шест.0020:

Адрес в CS: 13D20 Смещение в IP: 0020 Действительный адрес: 13D40

Таким образом, кодовый сегмент подпрограммы начинается, очевидно, по адресу шест.13D40. Правильно ли это? Карта компановки не дает ответа на этот вопрос, но можно определить адрес по листингу основной программы, которая заканчивается на смещении шест.0016. Так как кодовый сегмент для подпрограммы определен как SEGMENT, то он должен начинаться на границе параграфа, т.е. его адрес должен нацело делиться на шест.10 или правая цифра адреса должна быть равна 0. Компановщик размещает подпрограмму на ближайшей границе параграфа непосредственно после основной программы - этот относительный адрес равен шест.00020. Поэтому кодовый сегмент подпрограммы начинается по адресу 13D20 плюс 0020 или 13D40.

+----------------------------------------+--------------+ | Основная программа... (не используемый | Подпрограмма | | участок) | | +----------------------------------------+--------------+ | | | 13D20 13D30 13D40




Содержание  Назад  Вперед