Читать «Assembler. Программирование на языке ассемблера IBM PC» онлайн - страница 190
Unknown Author
Имя группы должно быть уникальным в программе, а сегменты группы могут быть описаны в тексте программы как до, так и после директивы GROUP. Имя
группы относится к константным выражениям, его значение вычисляется аналогично значению имени сегмента.
Пример:
GR
GROUP SI,S2
S1
SEGMENT
;смещение Si относительно GR равно 0
А
DB 20h DUP(O)
;смещение А относительно Si равно 0
S1
ENDS
SEGMENT
;смещение
В
DW 1
;смещение В относительно S2 равно 0
S2
ENDS
CODE
SEGMENT
ASSUME CS:CODE
ES:GR
MOV ES,AX
;ES=GR
MOV DH,A
;эквивалентно MOV DH,ES:0
MOV CX,B
;эквивалентно MOV CX,ES:20h
Отметим непоследовательность ЯА при работе с группами. Если во всех командах имена из сегментов группы заменяются на смещения имен, отсчитанные от начала группы, то значением оператора OFFSET N является смещение имени N относительно сегмента, в котором оно описано, даже если этот сегмент входит в группу (так, в приведенном примере значение OFFSET В будет равно 0). Чтобы смещение имени N в этом операторе отсчитывалось от начала группы, надо вместо N записать конструкцию <имя rpynnbi>:N (в нашем примере значение оператора OFFSET GR:B равно 20h). Аналогичная проблема возникает при описании адресных констант в директивах DW и DD: если в качестве их операнда указать просто имя, то оно будет заменено ассемблером на смещение имени, отсчитанное от начала того сегмента, где имя описано, а не от начала группы, в которую входит данный сегмент. Здесь также, если нужен отсчет смещения от начала группы, следует применить конструкцию вида <имя группы>:<имя>.
14.6J. Изменение счетчика размещения
Транслируя программу, ассемблер следит за адресом ее очередного предложения, который он хранит в счетчике размещения и значение которого можно узнать в программе с помощью символа $. Следующие две директивы позволяют менять значение этого счетчика.
EVEN
Эта директива выравнивает счетчик размещения на ближайший четный адрес: если текущее значение счетчика четно, то оно не меняется, а иначе в очередной байт памяти ассемблер записывает величину 90h (команда NOP) и увеличивает значение счетчика на 1.
ORG <выражение>
Выражение может быть константным или адресным, но все используемые в нем имена должны быть из текущего сегмента, причем они должны быть описаны до этой директивы. Кроме того, элементом выражения может быть обозначение счетчика размещения ($). Значение этого выражения становится новым значением счетчика размещения; это означает, чгго очередное предложение программы будет размещено в памяти уже с этого нового адреса (в пропускаемые байты ничего не записывается).
Примеры:
ORG 10Oh
MOV АХ,0 ;эта команда будет размещена с адреса 100h
;текущего сегмента
ORG $+20 пропустить 20 байтов
Если по директиве ORG значение счетчика размещения уменьшается, тоща очередное предложение "накладывается" на прежнюю величину, помещенную ранее по этому адресу.