116
116
программе не требуется регистр ES, но некоторые программисты описывают
его для стандартизации.
Во-вторых, после команд PUSH, SUB и PUSH, которые инициализиру-
ют стек, следуют две команды, обеспечивающие адресацию сегмента дан-
ных:
0004 В8 ---- R MOV AX, DATASG
0007 8Е D8 MOV DS, AX
Первая команда MOV загружает DATASG в регистр AX. Конечно, на
самом деле команда не может загрузить сегмент в регистр, она загружает
лишь адрес сегмента DATASG. Обратите внимание на машинный код слева:
В8 ---- R
Четыре дефиса говорят о том, что ассемблер не может определить адрес
DATASG; он определяется, если объектная программа будет скомпонована и
загружена для выполнения. Поскольку загрузчик может расположить про-
грамму в любом месте памяти, ассемблер оставляет данный адрес открытым
и показывает это символом R. Компоновщик должен будет подставить в это
место действительный адрес.
Вторая команда MOV пересылает содержимое регистра АХ в регистр
DS. Таким образом, данная программа имеет директиву ASSUME, которая
соотносит регистр DS с сегментом данных, и команды, инициализирующие
регистр DS относительным адресом DATASG.
Могут возникнуть два вопроса по поводу этой программы. Во-первых,
почему не использовать одну команду для инициализации регистра DS, на-
пример:
MOV DS, DATASG ?
Дело в том, что не существует команд для непосредственной пересылки дан-
ных из памяти в регистр DS. Следовательно, для инициализации DS необхо-
димо кодировать две команды.
Во-вторых, почему программа инициализирует регистр DS, а регистры
SS и CS нет? Оказывается, регистры SS и CS инициализируются автоматиче-
ски при загрузке программы для выполнения, а ответственность за инициа-
лизацию регистра DS и, если требуется, ES лежит полностью на самой про-
грамме.
Пока все эти требования могут показаться весьма туманными, но сей-
час не нужно понимать их. Все последующие программы используют анало-
гичную стандартную инициализацию стека и сегмента данных. Поэтому
можно просто копировать данные коды для каждой новой программы. Дей-
ствительно, вы можете сохранить на диске стандартную часть программы, а
для каждой новой программы копировать эту часть с новым именем и, ис-
пользуя затем редактор, записать дополнительные команды.
В качестве упражнения создайте с помощью вашего редактора программу,
приведенную на рис. 16, выполните ее ассемблирование и компоновку. Затем