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



       

ГЛАВА 4. Ассемблирование и выполнение программ - часть 5


------------------------------------------------------------ ------------------------------------------------------------ Рис. 4.1. Листинг ассемблирования программы

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

Сегмент кода также начинается с относительного адреса 0000. Он загружается в память в соответствии с адресом в pегистре CS и нулевым смещением относительно этого адреса. Поскольку ASSUME является директивой ассемблеру, то первая команда, которая генерирует действительный машинный код есть PUSH DS - однобайтовая команда (1E), находящаяся на нулевом смещении. Следующая команда SUB AX,AX генерирует двухбайто вый машинный код (2B C0), начинающийся с относительного адреса 0001. Пробел между байтами только для удобочитаемос ти. В данном примере встречаются одно-, двух- и трехбайтовые команды. Последняя команда END содержит операнд BEGIN, который имеeт отношение к имени команды PROC по смещению 0000. Это есть адрес сегмента кодов, с которого начинается выполнение после загрузки программы. Листинг ассемблирования программы EXASM1.LST, имеет по директиве PAGE шиpину 132 символа и может быть распечатан. Многие принтеры могут печатать текст сжатым шрифтом. Включите ваш принтер и введите команду

MODE LPT1:132,6

Таблица идентификаторов

За листингом ассемблирования программы следует таблица идентификаторов. Первая часть таблицы содержит определенные в программе сегменты и группы вместе с их размером в байтах, выравниванием и классом. Вторая часть содержит идентификато ры - имена полей данных в сегменте данных (в нашем примере их нет) и метки, назначенные командам в сегменте кодов (одна в нашем примере). Для того, чтобы ассемблер не создавал эту таблицу, следует указать параметр /N вслед за командой MASM, т.е. MASM/N.

Двухпроходный ассемблер

В процессе трансляции исходной программы ассемблер делает два просмотра исходного текста, или два прохода. Одной из основных причин этого являются ссылки вперед, что происходит в том случае, когда в некоторой команде кодирует ся метка, значение которой еще не определено ассемблером. В первом проходе ассемблер просматривает всю исходную прогpамму и строит таблицу идентификаторов, используемых в программе, т.е. имен полей данных и меток программы и их относительных aдресов в программе. В первом проходе подчитывается объем объектного кода, но сам объектный код не генерируется. Во втором проходе ассемблер использует таблицу идентифи каторов, построенную в первом проходе. Так как теперь уже известны длины и относительные адреса всех полей данных и команд, то ассемблер может сгенерировать объектный код для каждой команды. Ассемблер создает, если требуется, файлы: OBJ, LST и CRF.




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