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


          

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


Ассемблер для IBM PC. Глава 21 5
(для FAR) и Global (глобальный). Этот последний атрибут указывает, что данное имя доступно из вне подпрограммы, т.е. глобально. Карта компановки (в конце листинга) отражает организацию программы в памяти. Заметьте, что здесь имеются два кодовых сегмента (для каждого ассемблирования) с разными стартовыми адресами. Последовательность расположения кодовых сегментов соответствует последовательности указанных для компа новки объектных модулей (обычно основная программа указывается первой). Таким образом, относительный адрес начала основной программы - шест.00000, а подпрограммы - шест. 00020.
------------------------------------------------------------ ------------------------------------------------------------ Рис. 21.3. Использование директив EXTRN и PUBLIC.
При трассировке выполнения программы можно обнаружить, что команда CALL SUBMUL имеет объектный код
9A 0000 D413
Машинный код для межсегментного CALL - шест.9A. Эта команда сохраняет в стеке регистр IP и загружает в него значение 0000, сохраняет в стеке значение шест.13D2 из регистра CS и загружает в него шест.D413. Следующая выполняемая команда находится по адресу в регистровой паре CS:IP т.е. 13D40 плюс 0000. Обратите внимание, что основная программа начинается по адресу в регистре CS, содержащему шест.13D2, т.е. адрес 13D20. Из карты компановки видно, что подпрограмма начинает ся по относительному адресу шест.0020. Складывая эти два значения, получим действительный адрес кодового сегмента для подпрограммы:
Адрес в CS 13D20 Смещение в IP 0020 Действительный адрес 13D40
Компановщик определяет это значение точно таким же образом, и подставляет его в операнд команды CALL.
ПРОГРАММА: ИСПОЛЬЗОВАНИЕ ДИРЕКТИВЫ PUBLIC В КОДОВОМ СЕГМЕНТЕ ------------------------------------------------------------
Следующий пример на рис.21.4 представляет собой вариант программы на рис.21.3. Имеется одно изменение в основной программе и одно - в подпрограмме. В обоих случаях в директиве SEGMENT используется атрибут PUBLIC:

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