Все ассемблерные директивы имеют имена, начинающиеся с точки (`.'). Остальная часть имени пишется буквами, обычно строчными.
В этой главе обсуждаются те директивы, которые доступны независимо от целевой платформы, под которую сконфигурирован GNU-ассемблер. Некоторые машинные конфигурации поддерживают дополнительные директивы. Смотрите главу 8, "Архитектурные особенности".
Эта директива немедленно останавливает ассемблирование. Она оставлена для совместимости с другими ассемблерами. Изначально идея была в том, что ассемблерный код будет передаваться через конвейер в ассемблер. Если программа, генерирующая исходный код завершает свое выполнение, то она может послать ассемблеру эту директиву, чтобы он так же прекратил свое выполнение. Когда-нибудь .abort перестанет поддерживаться.
При выводе в формате COFF as воспринимает эту директиву как синоним .abort.
При выводе в формате b.out as воспринимает эту директиву, но игнорирует ее.
Дополняет счетчик места (в данной подсекции) до некоторой границы. Первое выражение (которое должно быть абсолютным) есть требуемое выравнивание, как объяснено ниже. Второе выражение (также абсолютное) задает значение, которое должно быть записано в добавляемые байты. Это выражение (и запятая) могут быть опущены. Если они опущены, то добавляются нули.
Способ, которым задается выравнивание, меняется в зависимости от системы. Для a29k, hppa, m86k, m88k, w65, sparc, Hitachi SH и i386, использующих формат ELF, первое выражение задает требуемое выравнивание в байтах. Например, .align 8 увеличивает счетчик места до кратного 8. Если счетчик места уже кратен 8, то никаких изменений не нужно.
Для дpyгих систем, включая i386, с использованием формата a.out, это минимальное число нулевых младших битов, которые должен иметь счетчик места после увеличения. Например, .align 3 увеличивает счетчик места до кратного 8. Если счетчик места уже кратен 8, то никаких изменений не нужно.
Это несоответствие происходит из-за различного поведения родных ассемблеров, которые GAS должен эмулировать. GAS также обеспечивает директивы .balign и .p2align, описанные ниже, которые на всех платформах ведут себя одинаково (но являюстя специфичными для GAS).
.app-file (или.file) говорит as, что сейчас начнется новый логический файл. СТРОКА - имя нового файла. Вообще говоря, имя файла распознается как в каывычках, так и без них, но если вы хотите задать пустое имя файла, то вы должны поставить две кавычки. В будущем этот оператор может исчезнуть: он распознается только для совместимости со старыми версиями программы as.
.ascii ожидает ноль или более строковых литералов (смотрите раздел 3.6.1.1 Строки), отделенных запятыми. Эта директива ассемблирует каждую строку (без автоматической подстановки нулевого байта в конец строки) в последовательные адреса памяти.
.asciz - это то же самое, что и.ascii, но за каждой строкой следует нулевой байт. Буква z является сокращением от слова zero.
Расширяет счетчик места (в данной подсекции) до некоторой границы. Первое выражение (которое должно быть абсолютным) есть требуемое выравнивание. Например,.balign 8 увеличивает счетчик места до кратного 8. Если счетчик места уже кратен 8, то никаких изменений не нужно.
Второе выражение (также абсолютное) задает значение, которое должно быть записано в добавляемые байты. Это выражение (и запятая) могут быть опущены. Если они опущены, то добавляются нули.
.byte ожидает в качестве параметров ноль или более выражений, разделенных запятыми. Каждое выражение ассемблируется в следующий байт.
.comm объявляет поименнованную общую область в секции bss. Обычно ld во время линковки резервирует для этого адреса памяти, так что не одна частичная программа не определяет положение символа. Используйте .comm для того, чтобы указать ld что размер этой области должен быть по крайней мере ДЛИНА байтов. Ld выделяет пространство для каждого .comm-символа длиной по крайней мере в столько байт, сколько указано в максимальном запросе всех слинкованных частичных программ. Длина - абсолютное выражение.
Синтаксис для .comm немного отличается для HPPA. Синтаксис такой: "СИМВОЛ .comm, ДЛИНА"; СИМВОЛ может быть опущен.
.data указывает, что as должен ассемблировать последующие операторы в конец подсекции data с номером ПОДСЕКЦИЯ (который является абсолютным выражением). Если ПОДСЕКЦИЯ опущена, то по умолчанию предполагается ноль.
Начало определения отладочной информации для символа ИМЯ; определение продолжается до директивы .endef.
Эта директива воспринимается только если as сконфигурирован для вывода в в формате COFF; когда производится вывод в формате b.out, .def распознается, но игнорируется.
Эта директива усианавливает дескриптор символа (смотрите раздел 5.5 "Атрибуты Сивола") в младшие 16 бит абсолютного выражения.
Директива .desc недоступна, когда as сконфигурирован для вывода в формате COFF; она работает только для форматов объектных файлов a.out и b.out. Для совместимости as принимает их, но не выводит, когда сконфигурирован для COFF.
Эта директива генерируется компиляторами для включения дополнительной отладочной информации в таблицу символов. Она разрешается только внутри пары .def/.endef.
.dim имеет смысл только при выводе в формат COFF; когда as сконфигурирован для вывода в b.out, он допускает эту директиву, но игнорирует ее.
.double ожидает ноль или более чисел с плавающей точкой, разделенных запятыми. Эта директива ассемблирует числа с плавающей точкой. Точный вид выдаваемых чисел с плавающей точкой зависит от конфигурации as. Смотрите главу 8 "Архитектурные особенности".
Заставляет завершить страницу листинга в месте, где встретилась эта директива.
.else - часть поддержки условного ассемблирования в as; (смотрите раздел 7.27 .if). Эта директива означает начало секции кода для условного ассемблирования, если условие в предыдущем .if было ложным.
Эта директива показывает конец определения символа, начатого с .def.
.endef имеет смысл только при выводе в формате COFF; если as сконфигурирован для вывода в формате b.out, он допускает эту директиву, но игнорирует ее.
.endif - часть поддержки условного ассемблирования в as; эта директива показывает конец блока кода, который ассемблируется только условно. Смотрите раздел 7.27 .if.
Эта директива устанавливает значение символа СИМВОЛ в ВЫРАЖЕНИЕ. Она является синонимом .set; (смотрите раздел 7.49.set).
Синтаксис для equ на HPPA такой: СИМВОЛ .equ ВЫРАЖЕНИЕ.
.extern допускается в исходниках - для совместимости с другими ассемблерами - но игнорируется. As рассматривает все неопределенные символы как внешние.
Директива .file (которая также может быть записана как .app-file) указывает as о начале нового логическогор файла. СТРОКА - новое имя файла. Вообще говоря, имя файла распознается как в каывычках, так и без них, но если вы хотите задать пустое имя файла, то вы должны поставить две кавычки. В будущем этот оператор может исчезнуть: он распознается только для совместимости со старыми версиями программы as. В некоторых конфигурациях as директива .file уже исключена, чтобы избежать конфликтов с другими ассемблерами. Смотрите главу 8 "Архитектурные особенности".
ПОВТОР, РАЗМЕР и ЗНАЧЕНИЕ - абсолютные выражения. Эта директива вставляет ПОВТОР копий РАЗМЕР байт. Повтор должен быть ноль или больше. РАЗМЕР может быть нулем или больше, но если он больше 8, то он полагается 8, для совместимости с другими ассемблерами. Содержимое каждого из ПОВТОР байт берется из 8-байтного числа. Старшие 4 байта - нули. Младшие 4 байта - ЗНАЧЕНИЕ; порядок байтов в слове такой, как в компьютере, для которого ассемблирует as. Каждые РАЗМЕР байтов в серии берется из соответствующего количества младших байтов этого числа. Опять же, эта странная особенность появилась для совместимости с другими ассемблеpами.
PАЗМЕP и ЗHАЧЕHИЕ могyт быть опyщены. Если втоpая запятая и ЗHАЧЕHИЕ отсyтствyют, то ЗHАЧЕHИЕ пpедполагается нyлем. Если первая запятая и следующие аргументы отсутствуют, то РАЗМЕР полагается 1.
Эта директива ассемблирует ноль или более чисел с плавающей точкой, разделенных запятыми. Эта директива имеет тот же эффект, что и .single. Точный тип выдаваемых чисел зависит от конфигypации as. Смотрите главу 8 "Архитектурные особенности".
.global делает символ видимым для ld. Если вы определяете СИМВОЛ в частичной программе, то его значение становится доступным для других частичных программ, слинкованных вместе с этой. В противном случае СИМВОЛ получит свои атрибуты из символа с тем же именем, но определенным в другом файле, слинкованном в эту же программу.
Оба написания (.globl и.global) допустиы для совместимости с другими ассемблерами.
На HPPA .global не всегда хватает, чтобы открыть доступ другим частичным программам. Вам может понадобиться работающая только на HPPA директива .EXPORT. Смотрите раздел 8.5.5.
Эта директива ожидает ноль или более ВЫРАЖЕНИЙ и выдает для каждого из них 16-битное число.
Это является синонимом для .short; в зависимости от целевой платформы это также может быть синонимом для .word.
Эта директива используется некоторыми ассемблерами для помещения меток объектные файлы. As допускает эту директиву для совместимости с некоторыми ассемблерами, но на самом деле ничего в связи с этим не делает.
.if отмечает начало секции кода, котоpая является сyщественной частью исходной пpогpаммы только в том слyчае, если АБСОЛЮТHОЕ_ВЫPАЖЕHИЕ не pавно нyлю. Конец yсловной части должен быть обозначен.endif (смотрите раздел 7.18 .endif); вы можете также включить код для альтернативного случая, поставив.else (смотрите раздел 7.16.else).
Также поддерживаются следующие варианты .if:
Ассемблирует следующую секцию кода, если данный СИМВОЛ был определен.
Ассемблирует следующую секцию кода, если данный СИМВОЛ не был определен. Оба варианта написания эквивалентны.
Эта директива обеспечивает включение вспомагательных файлов в указанные места текста исходной программы. Код из ФАЙЛа ассемблируется так, как будто он следует сразу за.include; когда включенный файл кончается, продолжается ассемблирование исходного файла. Вы можете управлять путем поиска, используя опцию командной строки -I (смотрите главу 2 "Опции командной строки"). Кавычки вокруг имени файла обязательны.
Ожидает ноль или более ВЫРАЖЕНИЙ, любой секции, разделенных запятыми. Для каждого выражения выдает число, которое во время исполнения будет равно значению выражения. Порядок байт и число битов числа зависят от типа целевой машины.
Выполняет последовательность операторов, задавая различные значения СИМВОЛу. Последовательность оператов начинается директивой .irp и заканчивается директивой .endr. Для каждого ЗНАЧЕHИЯ СИМВОЛ yстанавливается в ЗHАЧЕHИЕ и ассемблиpyется последователность опеpатоpов. Если не задано никаких ЗHАЧЕHИЙ, то последовательность опеpатоpов ассемблиpyется один pаз с СИМВОЛОМ, yстановленным в нyлевyю стpокy. Для ссылки на символ внyтpи опеpатоpов использyйте \СИМВОЛ. Hапpимеp, ассемблиpование
.irp param,1,2,3
move d\param,<url url="mailto:sp@-" name="sp@-">
.endr
Эквивалентно ассемблиpованию
move d1,<url url="mailto:sp@-" name="sp@-">
move d2,<url url="mailto:sp@-" name="sp@-">
move d3,<url url="mailto:sp@-" name="sp@-">
Выполняет последовательность операторов, задавая различные значения СИМВОЛу. Последовательность оператов начинается директивой .irpc и заканчивается директивой.endr. Для каждого знака в ЗНАЧЕHИи СИМВОЛ yстанавливается в него и ассемблиpyется последователность опеpатоpов. Если не задано никаких ЗHАЧЕHИЙ, то последовательность опеpатоpов ассемблиpyется один pаз с СИМВОЛОМ, yстановленным в нyлевyю стpокy. Для ссылки на символ внyтpи опеpатоpов использyйте \СИМВОЛ.
Например, ассемблирование
.irpc param,123
move d\param,<url url="mailto:sp@-" name="sp@-">
.endr
эквивалентно ассемблированию
move d1,<url url="mailto:sp@-" name="sp@-">
move d2,<url url="mailto:sp@-" name="sp@-">
move d3,<url url="mailto:sp@-" name="sp@-">
Резервирует ДЛИНА (абсолютное выражени) байтов для локальной общей области, обозначенной символом СИМВОЛ. Секция и значение СИМВОЛа получаются из этих байтов. Адреса выделяются в секции bss, так что в момент запуска программы являются нулевыми. СИМВОЛ не объявлен локально (смотри раздел 7.24 .global), так что он обычно не виден для ld.
Синтаксис для .lcomm немного отличается на HPPA:
СИМВОЛ .lcomm, ДЛИНА
СИМВОЛ может быть опущен.
As допускает эту директиву для совместимости с другими ассемблерами, но игнорирует ее.
Меняет логический номер строки. НОМЕР_СТРОКИ должен быть абсолютным выражением. Следующая строка имеет этот логический номер. Тем не менее, дpyгой опеpатоp на этой стpоке (после знака pазделителя опеpатоpов) имеет номеp HОМЕP_СТPОКИ-1. Когда-нибyдь as перестанет поддерживать эту директиву: она распознается только для совместимости с существующими ассемблерными программами.
Пpедyпpеждение: в конфигypации as для AMD29K эта команда недоступна, используйте синоним .ln.
Хотя эта директива ассоциируется с форматами объектного кода a.out и b.out, as распознает ее при выводе в формате COFF, и pассматpивает как .ln, если это находится вне пары .def/.endef.
Внутри .def .line вместо этого является одной из директив, используемых компилятором для создания вспомогательной информации о символе для отладки.
.ln - синоним.line.
Управляет (вместе с директивой .nolist) созданием ассемблерных листингов. Эти две директивы управляют значением внутреннего счетчика (изначально обнуленного). .list увеличивает его, а .nolist - уменьшает. Ассемблерный листинг создается всегда, когда счетчик больше нуля.
По умолчанию листинг выключен. Когда вы включаете его (при помощи опции -a; смотрите главу 2 "Опции Командной Строки"), начальное значение счетчика становится равным 1.
.long - тоже самое, что и .int, смотрите раздел 7.29 .int
Команды.macro и.endm позволяют Вам определить макросы, которые создают ассемблерный вывод. Например, вот определение макроса sum, который записывает в память последовательность чисел.
.macro sum from=0, to=5
.long \from
.if \to-\from
sum "(\from+1)",\to
.endif
.endm
При этом определении SUM 0,5 эквивалентно ассемблерному вводу
.long 0
.long 1
.long 2
.long 3
.long 4
.long 5
Начало определения макроса называется ИМЯ_МАКРОСА. Если ваш макрос требует аргументов, определите их имена после имени макроса, разделяя их запятыми или пробелами. Вы можете задать для любого макроса значения аргументов по умолчанию, написав после имени аргумета =ЗНАЧЕНИЕ_ПО_УМОЛЧАНИЮ. Например, вот допустимые операторы.macro:
Начинает определение макроса comm, который не имеет аргументов.
Оба оператора начинают определение макроса plus1, который имеет два аргумента, внутри определения макроса \p и \p1 обозначают значения аргументов.
Начинает определение макроса reserve_str с двумя аргументами. Пеpвый имеет значение по yмолчанию, а втоpой нет. После завеpшения опpеделения вы можете вызвать макpос как reserve_str A,B (с \p1 означающим A и \p2 означающим B), так и reserve_str,B (с \p1 имеющим щначение по умолчанию, в данном случае \p2 означающим B).
Обозначает конец определения макроса.
Преждевременный выход из текущего определения макроса.
As хранит число выполненых макросов в этой псевдо-переменной; вы можете вывести это число при помощи \@, но только внутри определения макроса.
Управляет (вместе с директивой.list) созданием ассемблерных листингов. Эти две директивы управляют значением внутреннего счетчика (изначально обнуленного). .list увеличивает его, а .nolist - уменьшает. Ассемблерный листинг создается всегда, когда счетчик больше нуля.
Эта директива ожидает ноль или более больших чисел, разделенных запятыми. Для каждого большого числа она выдает 16-байтное целое.
Термин "octa" берется из контекста, в котором "word" означает два байта; следовательно octa - слово из 16 байт.
Продвигает текущий счетчик места до NEW-LC. NEW-LC является или абсолютным выражением, или выражением с той же секцией, что и текущая подсекция. Таким образом, Вы не можете использовать директиву .org для переключения секций; если NEW-LC попадает в другую секцию, то директива .org игнорируется. Для совместимости с предыдущими ассемблерами, если секция NEW-LC абсолютная, то as выдает предупреждение и рассматривает секцию NEW-LC как ту же секцию, что и данная подсекция.
.org может только увеличить счетчик места, или оставить его таким же; Вы не можете использовать .org для уменьшения счетчика места.
Поскольку as пытается ассемблировать программу за один проход, NEW-LC не может быть неопределенным.
Имейте ввиду, что аргумент .org относится к началу секции, а не к началу подсекции. Это совместимо с другими ассемблерами.
Когда увеличивается счетчик места (текущей подсекции), вставляемые байты заполняются FILL, который должен быть абсолютным выражением. Если запятая и FILL опущены, то FILL полагается нулем.
Выравнивает счетчик места (в данной подсекции) до некоторой границы. Первое выражение (которое должно быть абсолютным) есть требуемое минимальное число младших нулей в счетчике места после расширения. Например, .p2align 3 увеличивает счетчик места до кратного 8.
Второе выражение (также абсолютное) задает значение, которое должно быть сохранено в добавляемых байтах. Оно и запятая могут быть опущены, тогда добавляемые байты будут нулями.
Используйте эту директиву для объявления количества строк - и, возможно, количества колонок, - которые будут использованы для оформления страницы при создании листинга.
Если вы не используете .psize, в листинге по умолчанию будет 60 строк на страницу. Вы можете опустить запятую и КОЛОНКИ; ширина по умолчанию 200 колонок.
As создает новую страницу в любом случае, когда превышается число строк (или когда вы явно указываете это, используя eject).
Если вы определите СТРОКИ нулем, то новые страницы будут создаваться только при помощи .eject.
Директива .quad ожидает в качестве аргументов ноль или более больших чисел, разделенных запятыми. Для каждого большого числа выводится 8-байтовый код. Если большое число не помещается в 8 байт, то выдается предупреждение и берутся восемь младших байт большого числа.
Термин "quad" берется из контекста, в котором "word" означает два байта; следовательно quad - слово из 8 байт.
Повторяет последовательность строк между директивой.rept и последующей директивой .endr ЧИСЛО_ПОВТОРОВ раз.
Например, ассемблтрование
.rept 3
.long 0
.endr
эквивалентно ассемблированию
.long 0
.long 0
.long 0
Использует ПОДЗАГОЛОВОК в качестве заглавия (третья строчка после заглавной строки) при создании ассемблерного листинга.
Эта директива влияет на последующие страницы, также как и на текущую, если она появляется в первых десяти строках этой страницы.
Устанавливает класс хранения символа. Эта директива может быть использована только внутри пары .def/.endef. Класс хранения может указывать, является ли символ статическим или внешним, или содержать другую информацию для отладки.
Директива .scl в основном связана с COFF-выводом; когда as сконфигурирован для вывода в формате b.out эта директива допускается, но игнорируется.
Ассемблирует последующий код в конец подсекции с номером ПОДСЕКЦИЯ в COFF-секции с именем ИМЯ. Если вы опускаете ПОДСЕКЦИЯ, то as использует подсекцию номер ноль. .section .text эквивалентно директиве.text; .section .data эквивалентно директиве .data. Эта директива введена только для поддержки произвольных имен секций; при выводе в `a.out', например, это не допускается, даже с указанием стандартного для a.out имени секции в качестве параметра.
Устанавливает значение символа в выражение. Это меняет значение и тип символа в соответствии с выражением. Если символ был отмечен внешним, то он остается внешним. (Смотpите pаздел 5.5 Атpибyты Символа.)
Вы можете использовать этy диpективy по отношению к символy многокpатно.
Если вы использyете этy диpективy по отношению к глобальномy символy, то в объектный файл записывается последнее установленное значение.
Hа HPPA синтаксис такой: СИМВОЛ .set ВЫРАЖЕНИЕ
.short обычно то же самое, что и .word. Смотрите раздел 7.61.word.
В некоторых конфигурациях .short и .word создают числа разной длины; смотрите главу 8 "Архитектурные Особенности".
Эта директива ассемблирует ноль или более чисел с плавающей точкой. Она имеет тот же эффект, что и .float. Точный тип выдаваемых чисел с плавающей точкой зависит от конфигурации as. Смотрите главу 8 "Архитектурные Особенности".
Эта директива создается компиляторами для включения дополнительной информации для отладки в таблицу символов. Она разрешена только внутри пары .def/.endef.
.size имеет смысл только при выводе в формате COFF; когда as выводит в b.out, он допускает эту директиву, но игнорирует ее.
Эта директива выдает РАЗМЕР байт, каждый со значением FILL. И РАЗМЕР, и FILL - абсолютные выражения. Если запятая и FILL опущены, то по умолчанию FILL принимается нулем.
Предупреждение: .space имеет совсем другое значение для HPPA; используйте для замены .block. Смотрите `HP9000 Series 800 Assembly Language Reference Manual' (HP 92432-90001) для значения директивы .space. Смотрите раздел 8.5.5 Директивы ассемблера HPPA.
На AMD 29K эта директива игнорируется, она допускается для совместимости с другими ассемблерами AMD 29K.
Предупреждение: В большинстве версий GNU-ассемблера директива .space имеет эффект .block Смотрите главу 8 "Архитектурные особенности".
Эти три директивы, начинающиеся с .stab, формируют символы (смотрите главу 5 "Символы") для использования их в символических отладчиках. Эти символы не входят в hash-таблицу as: на них не может быть как-либо ссылок в исходном файле. Требуется до пяти полей:
Это имя символа. Оно может содержать любые знаки кроме \000, так что это более общее понятие, чем обычные имена символов. Некоторые отладчики используют для кодирования произвольных сложных структур имена символов, используя это поле.
Абсолютное выражение. Тип символа устанавливается в 8 младших бит этого выражения. Любые битовые маски разрешены, но ld и отладчики используют самые примитивные битовые маски.
Абсолютное выражение. Этот атрибут символа устанавливается в младшие 8 бит выражения.
Абсолютное выражение. Дескриптор символа устанавлиается в младшие 16 бит выражения.
Абсолютное выражение, которое становится значением символа
Если пpи чтении опеpатоpов .stabd, .stabn или .stabs выдано пpедyпpеждение, то веpоятно, что эти символы yже были созданы; Вы получаете наполовину сформированный символ в вашем объектном файле. Это совместимо с предыдущими ассемблерами!
"Имя" символа не пустая строка. Это null-указатель, для совместимости. Старые ассемблеры используют null-указатели, так что они расходуют место в объектном файле на пустые строки.
Значение символа установлено в счетчик места, и способно изменятся. Когда ваша программа слинкована, значение этого символа есть адpес счетчика места во вpемя ассемблиpования.stabd.
Имя символа yстановлено в пyстyю стpокy.
Все пять полей опpеделены.
Копиpyет знаки в СТPОКА в объектный файл. Вы можете задать более одной стpоки, pазделив их запятыми. Если обpатное не оговоpено для конкpетной машины, то ассемблеp заканчивает стpокy нyлевым байтом. Вы можете использовать любyю escape-последовательность, описанную в разделе 3.6.1.1 "Строки".
Эта директива создается компиляторами для включения вспомогательной информации в таблицу символов. Эта директива допустима только внутри пары .def/.endef. Tag'и используются для связывания определений этих структур в таблице символов с элементами этих структур.
.tag используется только при выводе в формате COFF; когда as создает объектный модуль в формате b.out, эта директива допускается, но игнорируется.
.text указывает as, что он должен ассемблировать следующие операторы в конец подсекции text с номером ПОДСЕКЦИЯ (который является абсолютным выражением). Если ПОДСЕКЦИЯ опущена, то по умолчанию предполагается ноль.
Использует ЗАГОЛОВОК в качестве заглавия (вторая строчка после номера страницы и имени исходного файла) при создании ассемблерного листинга.
Эта директива влияет на следующие страницы, также как и на текущую, если она появляется в первых десяти строках этой страницы.
Эта директива допустима только внутри пар .def/.endef и записывает ЦЕЛОЕ как атрибут типа элемента таблицы символов.
.type связан с форматом объектного модуля COFF; когда as выводит в формате b.out, эта директива допускается, но игнорируется.
Эта директива допустима только внутри пар .def/.endef и записывает АДРЕС как атрибут значения элемента таблицы символов.
.val связан с форматом объектного модуля COFF; когда as выводит в формате b.out, эта директива допускается, но игнорируется.
Эта директива ожидает ноль или более ВЫPАЖЕHИЙ, любой секции, pазделенных запятыми.
Pазмеp выдаваемого числа и поpядок байт в нем зависит от платфоpмы, для котоpой осyществляется ассемблиpование.
Пpедyпpеждение: Специальная Обpаботка для поддеpжки Компилятоpов
Машины с 32-битным адpесным пpостpанством, но испоьзyющие мене чем 32-битнyю адpесацию, тpебyют следyющей особой обpаботки. Если интеpесyющая вас машина имеет 32-битнyю адpесацию (или допускает ее; смотрите главу 8 "Архитектурные Особенности"), Вы можете проигнорировать этот текст.
В порядке ассемблировнаия вывода компилятора во что-то работающее as иногда делает странные вещи с директивой .word. Директивы в форме .word sym1-sym2 часто выдаются компилятором как часть таблицы переходов. Таким образом, если as ассемблирует директиву в форме .word sym1-sym2 и разница между sym1 и sym2 не укладывается в 16 бит, то as создает "вторичную таблицу переходов", сразу перед следующей меткой. Вторичная таблица переходов следует за командой короткого перехода на первый байт после вторичной таблицы. Этот короткий переход защищает от передачи управления внутрь новой таблицы. Внутри таблицы содержится команда длинного перехода переход к sym2. Исходный .word содержит sym1 минус адрес длинного перехода до sym2.
Если было несколько вхождений .word sym1-sym2 перед вторичной таблицей переходов, то все они устанавливаются на адрес одной и той же команды перехода. Если еще встречается.word sym3-sym4, также не укладывающийся в 16 бит, то длинный переход к sym4 также включается во вторичную таблицу переходов, и директива .word изменяется на sym3 минус адрес длинного перехода до sym4; и так далее для всех элементов начальной таблицы перехода, для которых это нужно.
Когда-нибудь эти директивы перестанут работать. Они включены для совместимости с другими ассемблерами.
.abort
.app-file
.line