Оператор присваивания
Оператор присваивания позволяет определять внешние имена и связывать их с определенными адресами. Оператор присваивания может записываться одним из следующих двух способов:
имя = выражение;
имя операция= выражение;
Здесь операция - это один из знаков +, -, * или /. Оператор присваивания должен оканчиваться точкой с запятой.
Все операторы присваивания (за исключением одного случая, который описывается в следующем абзаце), выполняются после того, как произведено размещение всех объектов, определенных во входных файлах, но перед перед настройкой ссылок из команд и данных. Поэтому, при вычислении выражения в правой части оператора присваивания, значениями встречающихся там имен будут их адреса в выходном объектном файле. Ссылки же из команд или данных на имя, которое посредством оператора присваивания связывается с новым адресом, будут настроены на этот новый адрес. Операторы присваивания обрабатываются в том порядке, в котором они поступают на вход ld(1).
Операторы присваивания обычно помещаются вне сферы действия предложений, определяющих секции (см. раздел Предложения определения секций). Однако, существует специальное имя, точка, ., которое может появляться только в пределах определения секций. Значением этого имени является текущее значение счетчика размещения ld(1), поэтому ld(1) вычисляет значения выражений, содер- жащих ., в процессе размещения. Присваиванием значения имени .
в предложении определения секции можно увеличить (но не уменьшить) счетчик размещения и в результате создавать пустоты внутри секции, как это описывается в разделе Предложения определения секций. Присваивание значения . некоторой переменной позволяет в любой момент работы редактора связей сохранить текущее значение счетчика размещения.
Функция align используется для выравнивания по границе n байт, где n есть степень двойки. Следующие два выражения равносильны:
ALIGN (n)
(. + n - 1) & ~(n - 1)
Псевдофункции SIZEOF и ADDR в качестве аргумента получают имя некоторой секции, а возвращают, соответственно, ее длину и адрес. Они могут использоваться в определениях имен вне пределов определения секций.
Выражения редактора связей могут иметь либо абсолютные, либо перемещаемые (настраиваемые) значения. Если ld(1) создает новое имя в результате обработки оператора присваивания, то тип имени будет совпадать с типом значения выражения из правой части. Этот тип может быть определен при помощи следующих правил:
- Выражения с единственным вхождением перемещаемого имени имеют перемещаемые значения, независимо от наличия и количества в этом выражении констант или абсолютных имен.
- Разность значений двух перемещаемых имен из одной и той же секции будет абсолютной.
- Другие выражения являются комбинациями вышеупомянутых.
Примечание
Сформулированные правила не только описывают тип значения выражений, но и накладывают ограничения на способы их конструирования.