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

Unknown Author

Имя группы должно быть уникальным в программе, а сегменты группы могут быть описаны в тексте программы как до, так и после директивы GROUP. Имя

группы относится к константным выражениям, его значение вычисляется аналогично значению имени сегмента.

Пример:

GR

GROUP SI,S2

S1

SEGMENT

;смещение Si относительно GR равно 0

А

DB 20h DUP(O)

;смещение А относительно Si равно 0

S1

ENDS

82

SEGMENT

;смещение 82 относительно GR равно 20h

В

DW 1

;смещение В относительно S2 равно 0

S2

ENDS

CODE

SEGMENT

ASSUME CS:CODE, MOV AX,GR

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 значение счетчика размещения уменьшается, тоща очередное предложение "накладывается" на прежнюю величину, помещенную ранее по этому адресу.