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



       

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


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

Поле FLDC определяет слово с неизвестным значением, обозначенным знаком вопроса (?). Сегмент кода в данном примере имеет имя CODESG и отли- чается новыми особенностями, связанными с сегментом данных. Во-первых, директива ASSUME указывает на определние DATASG через регистр DS. Данной программе не требуется регистр ES, но некоторые программисты описывают его для стандартизации. Во-вторых, после команд PUSH, SUB и PUSH, которые инициали- зируют стек, следуют две команды, обеспечивающие адресацию сегмента данных:

0004 B8 ---- R MOV AX,DATASG 0007 8E D8 MOV DS,AX

Первая команда MOV загружает DATASG в регистр AX. Конечно, на самом деле команда не может загрузить сегмент в регистр - она загружает лишь адрес сегмента DATASG. Обратите внимание на машинный код слева:

B8 ---- R

Четыре дефиса говорят о том, что ассемблер не может опреде лить aдрес DATASG; он определяется лишь когда объектная программа будет скомпанована и загружена для выполнения.

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

Поскольку загpузчик может расположить программу в любом месте памяти, асcемблер оставляет данный адрес открытым и показывает это символом R; компановщик должен будет подста вить в это место действительный адрес. Вторая команда MOV пересылает содержимое регистра AX в регистр DS. Таким образом, данная программа имеет директиву ASSUME, которая соотносит регистр DS с сегментом данных, и команды, инициализирующие регистр DS относительным адресом DATASG. Могут возникнуть два вопроса по поводу этой программы. Во-первых, почему не использовать одну команду для инициали зации регистра DS, например,

MOV DS,DATASG ?

Дело в том, что не существует команд для непосредственной переcылки данных из памяти в регистр DS. Следовательно, для инициализации DS необходимо кодировать две команды. Во-вторых, почему программа инициализирует регистр DS, а регистры SS и CS нет? Оказывается, регистры SS и CS инициализируются автоматически при загрузке программы для выполнения, а ответственность за инициализацию регистра DS и, если требуется ES, лежит полностью на самой программе. Пока все эти требования могут показаться весьма туман ными, но cейчас нет необходимости понимать их. Все последую щие программы используют аналогичную стандартную инициализа цию стека и сегмента данных. Поэтому можно просто копировать данные коды для каждой новой программы. Действительно, вы можете сохранить на диске стандартную часть программы и для каждой новой программы копировать эту часть с новым именем, и, используя затем редактор, записать дополнительные команды. В качестве упражнения, создайте с помощью вашего редактора программу, приведенную на рис. 4.3, выполните ее ассемблирование и компановку. Затем с помощью отладчика DEBUG просмотрите сегмент кодов, сегмент данных, регистры и проделайте пошаговое выполнение программы.




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