Читать «Assembler. Программирование на языке ассемблера IBM PC» онлайн - страница 162

Unknown Author

MOV BX,ES:Z ==> MOV BX,ES:10h

Эта команда уже проработает правильно, менять перед ней значение регистра ES не надо.

Таким образом, объединение (слйяние) нескольких сегментов означает, что эти сегменты будут расположены в памяти рядом и, главное, смещения всех имен из этих сегментов будут отсчитываться от начала объединенного сегмента. Это и позволяет один раз установить какой-то сегментный регистр на начало общего сегмента и далее, не меняя значение регистра, использовать его для доступа ко всем именам общего сегмента.

Значение STACK

Если какие-то сегменты (из любых модулей) имеют одно и то же имя, относятся к одному и тому же классу и для каждого из них указан тип объединения STACK, то эти сегменты объединяются в один сегмент - так же, как и сегменты типа PUBLIC. (Отметим, что друг с другом сегменты типов PUBLIC и STACK не объединяются.) Разница между этими двумя типами проявляется в том,, что объединенный сегмент типа STACK рассматривается как сегмент стека, и именно на него перед выполнением программы будут установлены регистры SS и SP (на сегмент типа PUBLIC никакие регистры автоматически не устанавливаются).

Если в программе нет ни одного сегмента типа STACK, то компоновщик выдаст на экран ПК предупреждение об этом. Если же имеется несколько таких сегментов, то регистры SS и SP устанавливаются на тот из них, который (или часть которого, если он получен слиянием) последним "попался на глаза" компоновщику.

Значение АТ <константное выражение>

В выражении не должно быть ссылок вперед. Значение выражения трактуется как номер некоторого сегмента памяти, т. е. как абсолютный адрес сегмента без последних четырех битов. Программный сегмент с параметром АТ ни с кем не объединяется, а располагается в памяти по указанному адресу. Например, сегмент

VIDEO SEGMENT AT 0B800h DW 25*80 DUP(?)

VIDEO ENDS

будет расположен с абсолютного адреса 0B8000h и займет 2000 слов (здесь находится видеопамять, содержимое которой отображается на экран ПК).

С помощью АТ-сегментов обычно вводятся ассемблерные обозначения для фиксированных участков оперативной памяти (вектора прерываний, видеопамяти и т. п.). Чтобы не менять содержимое этих участков, в состав АТ-сешентов не должны входить предложения, порождающие машинный код, т. е. запрещены любые команды, директивы DB, DW и DD с операндами, отличными от ?, и т. п. Если подобные предложения все-таки имеются, тогда компоновщик блокирует запись в память их машинного кода.

Значение COMMON

Все сегменты, которые имеют одно и то же имя, относятся к одному и тому же классу и в директиве SEGMENT которых указан параметр COMMON, компоновщик размещает в памяти с одного и того же адреса (с адреса, по которому был размещен первый из этих сегментов), накладывая их содержимое друг на друга. Результирующий сегмент имеет длину наибольшего из этих сегментов.