
 
 
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, выполните ее ассемблирование и компоновку. Затем