Читать «Assembler. Программирование на языке ассемблера IBM PC» онлайн - страница 162
Unknown Author
MOV BX,ES:Z ==> MOV BX,ES:10h
Эта команда уже проработает правильно, менять перед ней значение регистра ES не надо.
Таким образом, объединение (слйяние) нескольких сегментов означает, что эти сегменты будут расположены в памяти рядом и, главное, смещения всех имен из этих сегментов будут отсчитываться от начала объединенного сегмента. Это и позволяет один раз установить какой-то сегментный регистр на начало общего сегмента и далее, не меняя значение регистра, использовать его для доступа ко всем именам общего сегмента.
Если какие-то сегменты (из любых модулей) имеют одно и то же имя, относятся к одному и тому же классу и для каждого из них указан тип объединения 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 с операндами, отличными от ?, и т. п. Если подобные предложения все-таки имеются, тогда компоновщик блокирует запись в память их машинного кода.
Все сегменты, которые имеют одно и то же имя, относятся к одному и тому же классу и в директиве SEGMENT которых указан параметр COMMON, компоновщик размещает в памяти с одного и того же адреса (с адреса, по которому был размещен первый из этих сегментов), накладывая их содержимое друг на друга. Результирующий сегмент имеет длину наибольшего из этих сегментов.