Ассемблерные директивы

В этой главе описываются ассемблерные директивы (также известный как псевдо операции или псевдооперация в секунду), которые позволяют управление действиями ассемблера.

Директивы для обозначения текущего раздела

Ассемблер поддерживает обозначение произвольных разделов с .section и .zerofill директивы (описания появляются ниже). Только те разделы, указанные директивой в сборочном файле, появляются в файле полученного объекта (включая неявный .text директивы — видят Встроенные Директивы. Разделы появляются в объектном файле в порядке, их директивы сначала появляются в сборочном файле. Когда объектные файлы соединяются редактором связей, выходные объекты имеют свои разделы в порядке, разделы сначала появляются в соединяющихся объектных файлах. Посмотрите ld(1) Страница справочника OS X для большего количества подробных данных.

Связанный с каждым разделом в каждом сегменте неявный счетчик адреса, начинающийся в нуле и постепенно увеличивающийся 1 для каждого байта, собранного в раздел. Нет никакого способа явно сослаться на определенный счетчик адреса, но директивы, описанные здесь, могут использоваться для «активирования» счетчика адреса для раздела, делая его текущим счетчиком адреса. В результате ассемблер начинает собираться в раздел, связанный с тем счетчиком адреса.

.section

РЕЗЮМЕ

.section  segname , sectname [[[ , type ] , attribute ] , sizeof_stub ]

.section директива заставляет ассемблер начинать собираться в раздел, данный segname и sectname. Раздел, создаваемый с этой директивой, содержит инициализируемые данные или инструкции и упоминается как довольное раздел. введите и атрибут может быть указан, как описано под Типами Раздела и Атрибутами. Если тип symbol_stubs, тогда sizeof_stub поле должно быть дано как размер в байтах тупиков символа, содержавшихся в разделе.

.zerofill

РЕЗЮМЕ

.zerofill  segname , sectname [ , symbolname , size [ , align_expression ]]

.zerofill директива заставляет symbolname создаваться как неинициализированные данные в разделе, данном segname и sectname с размером в байтах, данных размером. Питание 2 между 0 и 15 может быть дано для align_expression для указания, какое выравнивание должно быть вызвано на symbolname, помещающемся в следующую границу выражения, имеющую данное выравнивание. См. .align для подробных данных.

Типы раздела и атрибуты

Довольный раздел имеет тип, сообщающий редактору связей о специальной обработке, необходимой для элементов в том разделе. Наиболее распространенная форма специальной обработки для разделов, содержащих литералы (строки, константы, и т.д.), где только одна копия литерала необходима в выходном файле, и тот же литерал может использоваться всеми ссылками во входных файлах.

Атрибуты раздела записывают дополнительную информацию о разделе, который редактор связей может использовать в обработке того раздела. Например, pure_instructions атрибут указывает, что раздел содержит только допустимые машинные команды.

Тип и атрибут раздела зарегистрированы в Мужественном файле как flags поле в заголовке раздела, с помощью констант определяется в заголовочном файле mach-o/loader.h. Следующие разделы описывают различные типы, и атрибуты именами раньше идентифицировали их в a .section директива. Имя связанной константы также дано в круглых скобках после идентификатора.

Идентификаторы типов

Следующие разделы описывают идентификаторы типов раздела.

регулярный (S_REGULAR)

A regular раздел может содержать любой вид данных и не получает специальной обработки от редактора связей. Это - тип раздела по умолчанию. Примеры regular разделы включают инструкции программы или инициализируемые данные.

cstring_literals (S_CSTRING_LITERALS)

A cstring_literals раздел содержит завершенные нулем литеральные символьные строки языка C. Редактор связей помещает только одну копию каждого литерала в раздел выходного файла и перемещает ссылки на различные копии того же литерала к одной копии в выходном файле. Не может быть никаких записей перемещения для раздела этого типа, и все ссылки на литералы в этом разделе должны быть в диапазоне адресов для определенного ссылаемого литерала. Последний байт в разделе этого типа должен быть нулевым байтом, и строки не могут содержать нулевые байты в своих организациях. Пример a cstring_literals раздел один для литеральных строк, появляющихся в организации функции ANSI C, где компилятор принимает решение сделать такие строки только для чтения.

4byte_literals (S_4BYTE_LITERALS)

A 4byte_literals раздел содержит 4-байтовые литеральные константы. Редактор связей помещает только одну копию каждого литерала в раздел выходного файла и перемещает ссылки на различные копии того же литерала к одной копии в выходном файле. Не может быть никаких записей перемещения для раздела этого типа, и все ссылки на литералы в этом разделе должны быть в диапазоне адресов для определенного ссылаемого литерала. Пример a 4byte_literals раздел - тот, в которой одинарной точности константы с плавающей точкой сохранены для машины RISC (они обычно были бы сохранены как immediates в машинном коде CISC).

8byte_literals (S_8BYTE_LITERALS)

8byte_literals раздел содержит 8-байтовые литеральные константы. Редактор связей помещает только одну копию каждого литерала в раздел выходного файла и перемещает ссылки на различные копии того же литерала к одной копии в выходном файле. Не может быть никаких записей перемещения для раздела этого типа, и все ссылки на литералы в этом разделе должны быть в диапазоне адресов для определенного ссылаемого литерала. Пример a 8byte_literals раздел - тот, в которой двойной точности константы с плавающей точкой сохранены для машины RISC (они обычно были бы сохранены как immediates в машинном коде CISC).

literal_pointers (S_LITERAL_POINTERS)

A literal_pointers раздел содержит 4-байтовые указатели на литералы в литеральном разделе. Редактор связей помещает только одну копию указателя в раздел выходного файла для каждого указателя на литерал с тем же содержанием. Редактор связей также перемещает ссылки на каждый литеральный указатель на одну копию в выходном файле. Должна быть точно одна запись перемещения для каждого литерального указателя в этом разделе, и все ссылки на литералы в этом разделе должны быть в диапазоне адресов для определенного ссылаемого литерала. Если те символы идентифицируют литералы в другом объектном файле, записи перемещения могут быть внешними записями перемещения, относящимися к неопределенным символам. Пример a literal_pointers раздел - один содержащий селекторные ссылки, сгенерированные компилятором Objective C.

symbol_stubs (S_SYMBOL_STUBS)

A symbol_stubs раздел содержит тупики символа, которые являются последовательностями машинных команд (весь одинаковый размер) используемый для того, чтобы лениво связать неопределенные вызовы функции во время выполнения. Если вызов к неопределенной функции выполняется, выходы компилятора вызов к тупику символа вместо этого, и тегирует тупик с косвенным символом, указывающим, для какого символа тупик. На передаче в тупик символа программа выполняет инструкции, в конечном счете достигающие кода для косвенного символа, связанного с тем тупиком. Вот выборка ассемблерного кода на основе функции func() содержа только вызов к неопределенной функции foo():

    .text
    .align 2
    .globl _func
 _func:
    b L_foo$stub
    .symbol_stub
 L_foo$stub:                            ;
    .indirect_symbol _foo               ;
    lis r11,ha16(L_foo$lazy_ptr)        ;
    lwz r12,lo16(L_foo$lazy_ptr)(r11)   ; the symbol stub
    mtctr r12                           ;
    addi r11,r11,lo16(L_foo$lazy_ptr)   ;
    bctr                                ;
    .lazy_symbol_pointer
 L_foo$lazy_ptr:                        ;
    .indirect_symbol _foo               ; the symbol pointer
    .long dyld_stub_binding_helper      ; to be replaced by _foo's address

Тупиковые символом разделы в архитектуре IA-32 — вместо того, чтобы использовать тупик и ленивый указатель — используют одну команду перехода, указывающую цель. Это - соответствующий ассемблерный код IA-32:

    .text
    .align 2
    .globl _func
_func:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $8, %esp
    call    L_foo$stub
    leave
    ret
    .symbol_stub
L_foo$stub:
     .indirect_symbol _foo
     hlt ; hlt ; hlt ; hlt ; hlt

В ассемблерном коде, _func ответвления к L_foo$stub, который ответственен за нахождение определения функции foo(). На PPC (и PPC64), L_foo$stub переходы к содержанию L_foo$lazy_ptr. Это значение является первоначально адресом dyld_stub_binding_helper код, после выполнения заставляющий его перезаписывать содержание L_foo$lazy_ptr с адресом реальной функции, _foo, и переход к _foo.

На IA-32 команда перехода указывает динамическому компоновщику. В первый раз, когда тупик вызывают, динамический компоновщик изменяет инструкцию так, чтобы это перешло к реальной функции в последующих вызовах.

Косвенные записи символа для _foo предоставьте информацию статическим и динамическим компоновщикам для привязки тупика символа. Каждый символ тупиковая и ленивая запись указателя должен иметь точно один такой косвенный символ, связанный с первым адресом в записи указателя или тупике. См. .indirect_symbol для получения дополнительной информации.

Статический редактор связей помещает только одну копию каждого тупика в раздел выходного файла для определенного косвенного символа и перемещает все ссылки на тупики с тем же косвенным символом к тупику в выходном файле. Далее, статический редактор связей устраняет тупик, если он решает, что цель находится в том же модуле связи и не нуждается в перенаправлении во время выполнения. Никакие глобальные символы не могут быть определены в symbol_stubs разделы.

На PPC тупик может относиться только к себе, один ленивый указатель символа (именующий тот же косвенный символ как тупик), и dyld_stub_binding_helper() функция.

lazy_symbol_pointers (S_LAZY_SYMBOL_POINTERS)

A lazy_symbol_pointers раздел содержит 4-байтовые указатели символа, в конечном счете содержащие значение косвенного символа, связанного с указателем. Эти указатели используются тупиками символа для ленивой привязки неопределенных вызовов функции во время выполнения. Ленивый указатель символа первоначально содержит адрес в тупике символа инструкций, заставляющих указатель символа быть связанным с функциональным определением (в примере в symbol_stubs (S_SYMBOL_STUBS), ленивый указатель L_foo$lazy_ptr первоначально содержит адрес для dyld_stub_binding_helper но перезаписывается с адресом для _foo). Редактор динамического канала связывает косвенный символ, связанный с ленивым указателем символа путем перезаписи его со значением символа.

Статический редактор связей помещает копию ленивого указателя в выходном файле, только если соответствующий тупик символа находится в выходном файле. Только соответствующий тупик символа может сделать ссылку на ленивый указатель символа, и никакие глобальные символы не могут быть определены в этом типе раздела. Должен быть один косвенный символ, связанный с каждым ленивым указателем символа. Пример a lazy_symbol_pointers раздел - тот, в котором компилятор генерировал вызовы к неопределенным функциям, каждая из которых может быть связана лениво во время первого вызова к функции.

non_lazy_symbol_pointers (S_NON_LAZY_SYMBOL_POINTERS)

A non_lazy_symbol_pointers раздел содержит 4-байтовые указатели символа, содержащие значение косвенного символа, связанного с указателем, который может быть установлен в любое время, прежде чем любой код делает ссылку на него. Эти указатели используются кодом для ссылки на неопределенные символы. Первоначально эти указатели не имеют никакого интересного значения, но перезаписываются редактором динамического канала со значением символа для связанного косвенного символа, прежде чем любой код сможет сделать ссылку на него.

Статический редактор связей помещает только одну копию каждого неленивого указателя для его косвенного символа в выходной файл и перемещает все ссылки на указатель с тем же косвенным символом к указателю в выходном файле. Если определение косвенного символа для того указателя присутствует в выходном файле, статический редактор связей далее может заполнить указатель со значением символа. Никакие глобальные символы не могут быть определены в этом типе раздела. Должен быть один косвенный символ, связанный с каждым неленивым указателем символа. Пример a non_lazy_symbol_pointers раздел - тот, в котором компилятор генерировал код для косвенной ссылки на неопределенные символы, которые будут связаны во время выполнения — это сохраняет совместное использование машинных команд, позволяя редактору динамического канала обновить ссылки, не пишущий на инструкциях.

Вот пример ассемблерного кода, ссылающегося на элемент в неопределенной структуре. Соответствующий код C был бы:

struct s {
        int member1, member2;
    };
    extern struct s bar;
    int func()
    {
        return(bar.member2);
    }

Ассемблерный код PowerPC мог бы быть похожим на это:

    .text
    .align 2
    .globl _func
 _func:
    lis r3,ha16(L_bar$non_lazy_ptr)
    lwz r2,lo16(L_bar$non_lazy_ptr)(r3)
    lwz r3,4(r2)
    blr
    .non_lazy_symbol_pointer
 L_bar$non_lazy_ptr:
    .indirect_symbol _bar
    .long 0
mod_init_funcs (S_MOD_INIT_FUNC_POINTERS)

A mod_init_funcs раздел содержит 4-байтовые указатели на функции, которые должны быть вызваны сразу после того, как модуль, содержащий указатель, связывается в программу редактора динамического канала. Статический редактор связей не делает никакой специальной обработки для этого типа раздела за исключением запрещения упорядочивания раздела. Это сделано для поддержания порядка, функции вызваны (который является порядком, их указатели появляются в исходном модуле). Должна быть точно одна запись перемещения для каждого указателя в этом разделе. Пример a mod_init_funcs раздел - тот, в котором компилятор генерировал код для вызова конструкторов C++ для модулей, динамично связывающихся во время выполнения.

mod_term_funcs (S_MOD_TERM_FUNC_POINTERS)

A mod_term_funcs раздел содержит 4-байтовые указатели на функции, которые должны быть вызваны непосредственно перед тем, как модуль, содержащий указатель, разгружен редактором динамического канала, или программа завершается. Статический редактор связей не делает никакой специальной обработки для этого типа раздела за исключением запрещения упорядочивания раздела. Это сделано для поддержания порядка, функции вызваны (который является порядком, их указатели появляются в исходном модуле). Должна быть точно одна запись перемещения для каждого указателя в этом разделе. Пример a mod_term_funcs раздел - тот, в котором компилятор генерировал код для вызова деструкторов C++ для модулей, динамично связывающихся во время выполнения.

объединенный (S_COALESCED)

A coalesced когда больше чем одно определение символа могло быть определено в многократных соединяемых объектных файлах, раздел может содержать любые инструкции или данные и используется. Статический редактор связей сохраняет данные связанными с объединенным символом от первого объектного файла, это соединяет и тихо отбрасывает данные от других объектных файлов. Пример a coalesced раздел - тот, в котором компилятор генерировал код для неявных инстанцирований шаблонов C++.

Идентификаторы атрибута

Следующие разделы описывают идентификаторы атрибута.

ни один (0)

Никакие атрибуты для этого раздела. Это - атрибут раздела по умолчанию.

S_ATTR_SOME_INSTRUCTIONS

Этот атрибут установлен ассемблером каждый раз, когда это собирает машинную команду в разделе. Нет никакой директивы, связанной с ним, так как Вы не можете установить его сами. Это используется редактором динамического канала вместе с S_ATTR_EXT_RELOC и S_ATTR_LOC_RELOC, установленный статическим редактором связей, для знания это должно сбросить кэш и другие связанные с процессором функции, когда это перемещает инструкции путем записи на них.

no_dead_strip (S_ATTR_NO_DEAD_STRIP)

no_dead_strip атрибут раздела указывает, что определенный раздел не должен быть мертво разделен. См. Директивы для Невыполняемого кода, Разделяющего для получения дополнительной информации.

no_toc (S_ATTR_NO_TOC)

no_toc разделите средние значения атрибута, что глобальные символы в этом разделе не должны использоваться в оглавлении статической библиотеки, как произведено программой ranlib(1). Это обычно используется с a coalesced разделите, когда ожидается, что каждый объектный файл имеет определение символов, которые это использует.

live_support (S_ATTR_LIVE_SUPPORT)

live_support атрибут раздела указывает, что блоки раздела не должны быть мертво разделены, если они код ссылки, который жив, но ссылка, необнаруживаемые. См. Директивы для Невыполняемого кода, Разделяющего для получения дополнительной информации.

pure_instructions (S_ATTR_PURE_INSTRUCTIONS)

pure_instructions припишите означает, что этот раздел содержит только машинные команды. Этот атрибут использовался бы для (__TEXT,__text) раздел компиляторов OS X и разделы, имеющие тип раздела symbol_stubs.

strip_static_syms (S_ATTR_STRIP_STATIC_SYMS)

strip_static_syms разделите средние значения атрибута, что статические символы в этом разделе могут быть разделены от соединенных изображений, использующихся с динамическим компоновщиком, когда также разделяется отладочная информация. Это обычно используется с a coalesced раздел, имеющий частный extern символы, так, чтобы после соединения и частного экстерна символы были превращены в статические символы, они могут быть разделены для оставления свободного места в соединенном изображении.

self_modifying_code (S_ATTR_SELF_MODIFYING_CODE)

self_modifying_code атрибут раздела идентифицирует раздел с кодом, который может быть изменен динамическим компоновщиком. Например, тупики символа IA-32 реализованы как команды перехода, первоначально указывающие динамическому компоновщику, но изменяющиеся динамическим компоновщиком для указания на реальный символ.

Встроенные директивы

Директивы, описанные здесь, являются просто встроенными эквивалентами для .section директивы с определенными параметрами.

Обозначение разделов в __ сегмент текста

Директивы упомянули ниже причину ассемблер, чтобы начать собираться в обозначенный раздел __TEXT сегмент. Обратите внимание на то, что подчеркивание прежде __TEXT, __text, и остальная часть сегмента называет, фактически два символа подчеркивания.

Директива

Раздел

.text

(__TEXT,__text)

.const

(__TEXT,__const)

.static_const

(__TEXT,__static_const)

.cstring

(__TEXT,__cstring)

.literal4

(__TEXT,__literal4)

.literal8

(__TEXT,__literal8)

.literal16

(__TEXT,__literal16)

.constructor

(__TEXT,__constructor)

.destructor

(__TEXT,__destructor)

.fvmlib_init0

(__TEXT,__fvmlib_init0)

.fvmlib_init1

(__TEXT,__fvmlib_init1)

.symbol_stub

(__TEXT,__symbol_stub1 или __TEXT,__jump_table)

.picsymbol_stub

(__TEXT, __picsymbolstub1 или __TEXT, __picsymbol_stub)

Следующие разделы описывают разделы в __TEXT сегмент и типы информации, которая должна быть собрана в каждого из них.

.text

Это эквивалентно .section __TEXT,__text,regular,pure_instructions когда значение по умолчанию -dynamic флаг имеет силу и эквивалентный .section __TEXT,__text,regular когда -static флаг указан.

Компилятор помещает только машинные команды в (__TEXT,__text) раздел (никакие данные только для чтения, таблицы переходов или что-либо еще). С этим, все (__TEXT,__text) раздел является чистыми инструкциями и инструментами, воздействующими на объектные файлы. Время выполнения может использовать в своих интересах это, чтобы определить местоположение инструкций программы и не запутаться с данными, которые, возможно, были смешаны в. Для создания этой работы весь код поддержки во время выполнения, соединенный в программу, должен также соблюсти это правило (весь код библиотеки OS X соблюдает это правило).

.const

Это эквивалентно .section __TEXT,__const

Компилятор помещает все объявленные данные const и все таблицы переходов это генерирует для операторов переключения в этом разделе.

.static_const

Это эквивалентно .section __TEXT,__static_const

Это в настоящее время не используется компилятором. Это было добавлено к ассемблеру так, чтобы компилятор мог разделить глобальную переменную и static const данные в отдельные участки, если это хотело.

.cstring

Это эквивалентно .section __TEXT,__cstring, cstring_literals

Этот раздел отмечен с типом раздела cstring_literals, который распознает редактор связей. Редактор связей объединяет подобные литеральные струны до во всех файлах входного объекта к одной уникальной струне до в выходном файле. Поэтому этот раздел должен содержать только струны до (струна до в последовательности байтов, заканчивающейся в нулевом байте, \0, и не содержит никакие другие нулевые байты кроме его разделителя). Компилятор помещает литеральные струны до, найденные в код, которые не являются инициализаторами и не содержат, любой встроенный обнуляет в этом разделе.

.literal4

Это эквивалентно .section __TEXT,__literal4,4byte_literals

Этот раздел отмечен с типом раздела 4byte_literals, который распознает редактор связей. Редактор связей может тогда объединить подобные 4-байтовые литералы во всех файлах входного объекта к одному уникальному 4-байтовому литералу в выходном файле. Поэтому этот раздел должен содержать только 4-байтовые литералы. Это обычно предназначается для одинарной точности, константы с плавающей точкой и компилятор используют этот раздел с этой целью. На некоторой архитектуре более эффективно поместить эти константы в строку как immediates как часть инструкции.

.literal8

Это эквивалентно .section __TEXT,__literal8,8byte_literals

Этот раздел отмечен с типом раздела 8byte_literals, который распознает редактор связей. Редактор связей тогда может объединить подобные 8-байтовые литералы во всех файлах входного объекта к одному уникальному 8-байтовому литералу в выходном файле. Поэтому этот раздел должен содержать только 8-байтовые литералы. Это обычно предназначается для двойной точности, константы с плавающей точкой и компилятор используют этот раздел с этой целью. На некоторой архитектуре более эффективно поместить эти константы в строку как immediates как часть инструкции.

.literal16

Это эквивалентно .section __TEXT,__literal16,16byte_literals

Этот раздел отмечен с типом раздела 16byte_literals, который распознает редактор связей. Редактор связей может тогда объединить подобные 16-байтовые литералы во всех файлах входного объекта к одному уникальному 16-байтовому литералу в выходном файле. Поэтому этот раздел должен содержать только 16-байтовые литералы. Это обычно предназначается для векторных констант, и компилятор использует этот раздел с этой целью.

.constructor

Это эквивалентно .section __TEXT,__constructor

.destructor

Это эквивалентно .section __TEXT,__destructor

.constructor и .destructor разделы используются системой времени выполнения C++ и резервируются исключительно для компилятора C++.

.fvmlib_init0

Это эквивалентно .section __TEXT,__fvmlib_init0

.fvmlib_init1

Это эквивалентно .section __TEXT,__fvmlib_init1

.fvmlib_init0 и .fvmlib_init1 разделы используются совместно использованной инициализацией библиотеки устаревшей фиксированной виртуальной памяти. Компилятор ничего не помещает в эти разделы, поскольку они резервируются исключительно для устаревшего совместно используемого механизма библиотеки.

.symbol_stub

Этот раздел имеет тип symbol_stubs и имеет атрибут pure_instructions. Компилятор помещает тупики символа в этот раздел для неопределенных функций, вызванных в модуле. Это - раздел тупика стандартного символа для непозиционно-независимого кода.

Тупики символа реализованы по-другому на PPC (и PPC64) и на IA-32. Следующие разделы описывают каждую реализацию.

PowerPC .symbol_stub

На PowerPC (PPC и PPC64), .symbol_stub эквивалентно .section __TEXT,__symbol_stub1, symbol_stubs, pure_instructions, 20.

Тупик стандартного символа на PPC и PPC64 составляет 20 байтов и имеет выравнивание 4 байтов (.align 2). Например, тупик для символа _foo был бы (использование ленивого указателя символа L_foo$lazy_ptr):

        .symbol_stub
L_foo$stub:
        .indirect_symbol _foo
        lis     r11,ha16(L_foo$lazy_ptr)
        lwz     r12,lo16(L_foo$lazy_ptr)(r11)
        mtctr   r12
        addi    r11,r11,lo16(L_foo$lazy_ptr)
        bctr
 
        .lazy_symbol_pointer
L_foo$lazy_ptr:
        .indirect_symbol _foo
        .long   dyld_stub_binding_helper
Тупики символа IA-32

На IA-32 тупики символа непосредственно используют .section __IMPORT,__jump_table, symbol_stubs, self_modifying_code + pure_instructions, 5. Встроенная директива .symbol_stub больше не используется.

На IA-32 этот раздел имеет дополнительный атрибут, self_modifying_code, который указывает, что код в этом разделе может быть изменен во время выполнения. Во время выполнения динамический компоновщик использует эту функцию в тупиках IA-32 для изменения команды перехода в тупике так, чтобы это перешло к реальному символу вместо их начальной цели, динамический компоновщик самой. Это - пример тупика символа _foo символ:

        .section __IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,5
L_foo$stub:
        .indirect_symbol _foo
        hlt ; hlt ; hlt ; hlt ; hlt
.picsymbol_stub

В PowerPC эта директива переводит в .section __TEXT, __picsymbolstub1, symbol_stubs, pure_instructions, NBYTES.

Этот раздел имеет тип symbol_stubs и имеет атрибут pure_instructions. Компилятор помещает тупики символа в этот раздел для неопределенных функций, вызванных в модуле. Это - раздел тупика стандартного символа для позиционно-независимого кода. Значение NBYTES зависит от целевой архитектуры.

Стандартный позиционно-независимый тупик символа для PowerPC составляет 36 байтов и имеет выравнивание 4 байтов (.align 2). Например, тупик длясимвол _foo был бы (использование ленивого указателя символа L_foo$lazy_ptr):

    .picsymbol_stub
 L_foo$stub:
    .indirect_symbol _foo
    mflr r0
    bcl 20,31,L0$_foo
 L0$_foo:
    mflr r11
    addis r11,r11,ha16(L_foo$lazy_ptr - L0$_foo)
    mtlr r0
    lwz r12,lo16(L_foo$lazy_ptr - L0$_foo)(r11)
    mtctr r12
    addi r11,r11,lo16(L_foo$lazy_ptr - L0$_foo)
    bctr

Обозначение разделов в __ сегмент данных

Эти директивы заставляют ассемблер начинать собираться в обозначенный раздел __DATA сегмент:

Директива

Раздел

.data

(__DATA,__data)

.static_data

(__DATA,__static_data)

.non_lazy_symbol_pointer

(__DATA,__nl_symbol_pointer)

.lazy_symbol_pointer

(__DATA,__la_symbol_pointer)

.dyld

(__DATA,__dyld)

.mod_init_func

(__DATA,__mod_init_func)

.mod_term_func

(__DATA,__mod_term_func)

.const_data

(__DATA,__const)

Следующие разделы описывают разделы в __DATA сегмент и типы информации, которая должна быть собрана в каждого из них.

.data

Это эквивалентно.section __DATA, __data

Компилятор помещает все не -const инициализируемые данные (даже инициализированный для обнуления) в этом разделе.

.static_data

Это эквивалентно.section __DATA, __static_data

Это в настоящее время не используется компилятором. Это было добавлено к ассемблеру так, чтобы компилятор мог разделить глобальный и статический символ данных на отдельные участки, если бы это хотело.

.const_data

Это эквивалентно .section __DATA, __const, regular.

Этот раздел имеет тип regular и не имеет никаких атрибутов. Когда динамический код компилируется для, этот раздел используется const данные, которые должны быть инициализированы.

.lazy_symbol_pointer

Это эквивалентно.section __DATA, __la_symbol_ptr,lazy_symbol_pointers

Этот раздел имеет тип lazy_symbol_pointers и не имеет никаких атрибутов. Компилятор помещает ленивый указатель символа в этот раздел для каждого тупика символа, который это создает для неопределенных функций, вызванных в модуле. (См. .symbol_stub для примеров.) Этот раздел имеет выравнивание 4 байтов (.align 2).

.non_lazy_symbol_pointer

Это эквивалентно .section __DATA, __nl_symbol_ptr,non_lazy_symbol_pointers

Этот раздел имеет тип non_lazy_symbol_pointers и не имеет никаких атрибутов. Компилятор помещает неленивый указатель символа в этот раздел для каждого неопределенного символа, на который ссылается модуль (за исключением вызовов функции). Этот раздел имеет выравнивание 4 байтов (.align 2).

.mod_init_func

Это эквивалентно .section __DATA, __mod_init_func, mod_init_funcs

Этот раздел имеет тип mod_init_funcs и не имеет никаких атрибутов. Компилятор C++ помещает указатель на функцию в этом разделе для каждой функции, которую это создает для вызова конструкторов (если модуль имеет их).

.mod_term_func

Это эквивалентно .section __DATA, __mod_term_func, mod_term_funcs

Этот раздел имеет тип mod_term_funcs и не имеет никаких атрибутов. Компилятор C++ помещает указатель на функцию в этом разделе для каждой функции, которую это создает для вызова деструкторов (если модуль имеет их).

.dyld

Это эквивалентно .section __DATA, __dyld,regular

Этот раздел имеет тип regular и не имеет никаких атрибутов. Этот раздел используется редактором динамического канала. Компилятор ничего не помещает в этот раздел, поскольку это резервируется исключительно для редактора динамического канала.

Обозначение разделов в __ сегмент OBJC

Эти директивы заставляют ассемблер начинать собираться в обозначенный раздел __OBJC сегмент (или __TEXT сегмент):

Директива

Раздел

.objc_class

(__OBJC,__class)

.objc_meta_class

(__OBJC,__meta_class)

.objc_cat_cls_meth

(__OBJC,__cat_cls_meth)

.objc_cat_inst_meth

(__OBJC,__cat_inst_meth)

.objc_protocol

(__OBJC,__protocol)

.objc_string_object

(__OBJC,__string_object)

.objc_cls_meth

(__OBJC,__cls_meth)

.objc_inst_meth

(__OBJC,__inst_meth)

.objc_cls_refs

(__OBJC,__cls_refs)

.objc_message_refs

(__OBJC,__message_refs)

.objc_symbols

(__OBJC,__symbols)

.objc_category

(__OBJC,__category)

.objc_class_vars

(__OBJC,__class_vars)

.objc_instance_vars

(__OBJC,__instance_vars)

.objc_module_info

(__OBJC,__module_info)

.objc_class_names

(__TEXT,__cstring)

.objc_meth_var_types

(__TEXT,__cstring)

.objc_meth_var_names

(__TEXT,__cstring)

.objc_selector_strs

(__OBJC,__selector_strs)

Все разделы в __OBJC сегмент, включая старые разделы, больше не использующиеся и будущие разделы, которые могут быть добавлены, исключительно резервируется для использования компилятора Objective C.

Директивы для перемещения счетчика адреса

В этом разделе описываются директивы, совершенствующие счетчик адреса к расположению выше в памяти. Они имеют дополнительный эффект установки прошедшей памяти к некоторому значению.

.align

РЕЗЮМЕ

.align    align_expression [ , 1byte_fill_expression [,max_bytes_to_fill]]
.p2align  align_expression [ , 1byte_fill_expression [,max_bytes_to_fill]]
.p2alignw align_expression [ , 2byte_fill_expression [,max_bytes_to_fill]]
.p2alignl align_expression [ , 4byte_fill_expression [,max_bytes_to_fill]]
.align32  align_expression [ , 4byte_fill_expression [,max_bytes_to_fill]]

Выровнять директивы совершенствуют счетчик адреса к следующей align_expression границе, если это в настоящее время не находится на такой границе. align_expression является питанием 2 между 0 и 15 (например, параметр .align 3 средние значения 2 ^ 3 (8) - выравнивание байта). Выражение заливки, если указано, должно быть абсолютным. Пространство между текущей стоимостью счетчика адреса и требуемым значением заполнено выражением заливки (или нулями, если fill_expression не указан). Пространство между текущей стоимостью счетчика адреса к выравниванию ширины выражения заливки заполнено нулями сначала. Тогда выражение заливки используется, пока желаемое выравнивание не достигнуто. max_bytes_to_fill является максимальным количеством байтов, которым позволяют быть заполненными для выровнять директивы. Если выровнять директива не может быть сделана в max_bytes_to_fill или меньше, это не имеет никакого эффекта. Если нет никакого fill_expression, и раздел имеет pure_instructions атрибут, или содержит некоторые инструкции, nop код операции используется в качестве выражения заливки.

ПРИМЕР

.align 3
one:    .double 0r1.0

.org

РЕЗЮМЕ

.org  expression [ , fill_expression ]

.org директива устанавливает счетчик адреса в выражение, которое должно быть в настоящее время известным абсолютным выражением. Эта директива может только повысить счетчик адреса в адресе. Выражение заливки, если указано, должно быть абсолютным. Пространство между текущей стоимостью счетчика адреса и требуемым значением заполнено байтом младшего разряда выражения заливки (или с нулями, если fill_expression не указан).

ПРИМЕР

.org 0x100,0xff

Директивы для генерации данных

Директивы, описанные в этом разделе, генерируют данные. (Если не указано иначе, данные входят в текущий раздел.) В некотором отношении, они подобны директивам, объясненным в Директивах для Перемещения Счетчика адреса — они действительно имеют эффект перемещения счетчика адреса — но это не их основная цель.

.ascii и .asciz

РЕЗЮМЕ

.ascii  [ “string” ] [ , “string” ] ...
.asciz  [ “string” ] [ , “string” ] ...

Эти директивы переводят символьные строки в свои эквиваленты ASCII для использования в исходной программе. Каждая директива берет нуль или более разделенные от запятой строки, окруженные кавычками. Каждая строка может содержать любую последовательность символов или escape-последовательность, которая может появиться в символьной строке; символ новой строки не может появиться, но он может быть представлен escape-последовательностью \012 или \n:

  • .ascii директива генерирует последовательность символов ASCII.

  • .asciz директива подобна .ascii директива, за исключением того, что это автоматически завершает последовательность символов ASCII с нулевым символом (\0), необходимый при генерации строк, применимых программами C.

Если никакие строки не указаны, директива проигнорирована.

ПРИМЕР

.ascii "Can't open the DSP.\0"
.asciz "%s has changes.\tSave them?"

.byte, .short, .long, и .quad

РЕЗЮМЕ

.byte  [ expression ] [ , expression ] ...
.short  [ expression ] [ , expression ] ...
.long  [ expression ] [ , expression ] ...
.quad [ expression ] [ , expression ] ...

Эти директивы резервируют места хранения в текущем разделе и инициализируют их с указанными значениями. Каждая директива берет нуль или более разделенные от запятой абсолютные выражения и генерирует последовательность байтов для каждого выражения. Выражения являются усеченными к размеру, сгенерированному директивой:

  • .byte генерирует 1 байт за выражение.

  • .short генерирует 2 байта за выражение.

  • .long генерирует 4 байта за выражение.

  • .quad генерирует 8 байтов за выражение.

ПРИМЕР

.byte  74,0112,0x4A,0x4a,'J                             | the same byte
.short 64206,0175316,0xface                             | the same short
.long  -1234,037777775456,0xfffffb2e                    | the same long
.quad  -1234,01777777777777777775456,0xfffffffffffffb2e | the same quad

.comm

РЕЗЮМЕ

.comm  name, size

.comm директива создает обычный символ, названный именем байтов размера. Если символ не определяется в другом месте, его тип «распространен».

Редактор связей выделяет хранение для иначе не определяющихся обычных символов. Достаточно пространства оставляют после символа содержать максимальный размер (в байтах) видевший каждый символ в (__DATA,__common) раздел.

Редактор связей выравнивает каждый такой символ (на основе его размера, выровненного к следующему большему питанию два) к максимальному выравниванию (__DATA,__common) раздел. Для получения информации о том, как изменить максимальное выравнивание, см. описание -sectalign в ld(1) Страница справочника OS X.

ПРИМЕР

.comm _global_uninitialized,4

.fill

РЕЗЮМЕ

.fill repeat_expression , fill_size , fill_expression

.fill директива совершенствует счетчик адреса к repeat_expression временам fill_size байты:

  • fill_size находится в байтах и должен иметь значение 1, 2, или 4

  • repeat_expression должен быть абсолютным выражением, больше, чем нуль

  • fill_expression может быть любым абсолютным выражением (это становится усеченным к размеру заливки),

ПРИМЕР

.fill 69,4,0xfeadface   | put out 69 0xfeadface’s

.lcomm

РЕЗЮМЕ

.lcomm  name, size [ , align ]

.lcomm директива создает символ, названный именем байтов размера в (__DATA,__bss) раздел. Это содержит нули при выполнении. Имя не объявляется как глобальная переменная, и следовательно неизвестно вне объектного модуля.

Дополнительные выравнивают выражение, если указано, заставляет счетчик адреса быть окруженным к выравниванию power-two граница прежде, чем присвоить счетчик адреса значению имени.

ПРИМЕР

.lcomm abyte,1     | or:  .lcomm abyte,1,0
.lcomm padding,7
.lcomm adouble,8   | or:  .lcomm adouble,8,3

Они совпадают с:

.zerofill __DATA,__bss,abyte,1
.lcomm __DATA,__bss,padding,7
.lcomm __DATA,__bss,adouble,8

.single и .double

РЕЗЮМЕ

.single  [ number ] [ , number ] ...
.double  [ number ] [ , number ] ...

Эти директивы резервируют места хранения в текущем разделе и инициализируют их с указанными значениями. Каждая директива берет нуль или более разделенные от запятой десятичные числа с плавающей точкой:

  • .single берет числа одинарной точности с плавающей точкой IEEE. Это резервирует 4 байта для каждого числа и инициализирует их к значению соответствующего числа.

  • .double берет числа с плавающей точкой двойной точности IEEE. Это резервирует 8 байтов для каждого числа и инициализирует их к значению соответствующего числа.

ПРИМЕР

.single 3.33333333333333310000e-01
.double 0.00000000000000000000e+00
.single +Infinity
.double -Infinity
.single NaN

.space

РЕЗЮМЕ

.space  num_bytes [ , fill_expression ]

.space директива совершенствует счетчик адреса num_bytes, где num_bytes является абсолютным выражением, больше, чем нуль. Выражение заливки, если указано, должно быть абсолютным. Пространство между текущей стоимостью счетчика адреса и требуемым значением заполнено байтом младшего разряда выражения заливки (или с нулями, если fill_expression не указан).

ПРИМЕР

ten_ones:
          .space 10,1

Директивы для контакта с символами

В этом разделе описываются директивы, имеющие эффект на символы и таблицу символов.

.globl

РЕЗЮМЕ

.globl  symbol_name

.globl директива делает symbol_name внешний. Если symbol_name иначе определяется ( .set или появлением как метка), это действует в блоке точно как будто .globl оператор не был дан; однако, редактор связей может использоваться для объединения этого объектного модуля с другими модулями, относящимися к этому символу.

ПРИМЕР

.globl abs
      .set abs,1
 
      .globl var
var:  .long 2

.indirect_symbol

РЕЗЮМЕ:

.indirect_symbol symbol_name

.indirect_symbol директива создает косвенный символ сsymbol_name и партнеры текущее расположение с косвенным символом. Косвенный символ должен быть сразу определен перед каждым элементом в a symbol_stub, lazy_symbol_pointers, и non_lazy_symbol_pointers раздел. Статические и динамические компоновщики используютsymbol_name для идентификации символа связался с элементом после директивы.

.reference

РЕЗЮМЕ

.reference  symbol_name

.reference директива заставляет symbol_name быть неопределенным настоящим символа в таблице символов выходного файла. Это полезно в ссылке на символ, не генерируя байтов, чтобы сделать это (используемый, например, системой времени выполнения Objective C для ссылки на суперобъекты класса).

ПРИМЕР

.reference  .objc_class_name_Object

.weak_reference

РЕЗЮМЕ

.weak_reference  symbol_name

.weak_reference директива заставляет symbol_name быть слабым неопределенным настоящим символа в таблице символов выходного файла. Это используется компилятором при ссылке на символ с weak_import атрибут.

ПРИМЕР

.weak_reference  .objc_class_name_Object

.lazy_reference

РЕЗЮМЕ

.lazy_reference  symbol_name

.lazy_reference директива заставляет symbol_name быть ленивым неопределенным настоящим символа в таблице символов выходного файла. Это полезно при ссылке на символ, не генерируя байтов, чтобы сделать это (используемый, например, системой времени выполнения Objective C с динамическим компоновщиком, чтобы сослаться на суперобъекты класса, но позволить времени выполнения связывать их на первом использовании).

ПРИМЕР

.lazy_reference  .objc_class_name_Object

.weak_definition

РЕЗЮМЕ

.weak_definition symbol_name

.weak_definition директива заставляет symbol_name быть слабым определением. symbol_name может быть определен только в a coalesced раздел. Это используется компилятором C++ для поддержки шаблонного инстанцирования. Компилятор использует a coalesced раздел с .weak_definition директива для неявно инстанцированных шаблонов. И это использует регулярный раздел (.text, .data, так на) для явного шаблонного инстанцирования.

.private_extern

РЕЗЮМЕ:

.private_extern symbol_name

.private_extern директива делает symbol_name частным внешним символом. Когда редактор связей комбинирует этот модуль с другими модулями (и -keep_private_externs параметр командной строки не указан), символ поворачивает его от глобальной переменной до помех. Если оба .private_extern и .globl ассемблерные директивы используются на том же символе, эффект состоит в том как будто только .private_extern директива использовалась.

.stabs, .stabn, и .stabd

РЕЗЮМЕ

.stabs  n_name , n_type , n_other , n_desc , n_value
.stabn  n_type , n_other , n_desc , n_value
.stabd  n_type , n_other , n_desc

Эти директивы используются для размещения символов в таблицу символов для символьного отладчика («удар» является записью таблицы символов).

  • .stabs указывает все поля в записи таблицы символов. n_name является именем символа; если имя символа является нулем, .stabn директива может использоваться вместо этого.

  • .stabn подобно .stabs, за исключением того, что это использует NULL ("") имя.

  • .stabd подобно .stabn, за исключением того, что это использует значение счетчика адреса (.) как n_value поле.

В каждом случае n_type поле, как предполагается, содержит подобное 4.3BSD значение для битов N_TYPE (определенный в mach-o/stab.h). Для .stabs и .stabn, n_sect поле Мужественного файла nlist установлен в число раздела символа для указанного n_value параметра. Для .stabd, n_sect поле установлено в текущее число раздела для счетчика адреса. nlist структура определяется в mach-o/nlist.h.

ПРИМЕР

.stabs  "hello.c",100,0,0,Ltext
.stabn  192,0,0,LBB2
.stabd  68,0,15

.desc

РЕЗЮМЕ

.desc  symbol_name , absolute_expression

.desc директива устанавливает n_desc поле указанного символа к absolute_expression.

ПРИМЕР

.desc _environ, 0x10 ; set the REFERENCED_DYNAMICALLY bit

.set

РЕЗЮМЕ

.set  symbol_name , absolute_expression

.set директива создает символ symbol_name и устанавливает его значение в absolute_expression. Это совпадает с использованием symbol_name=absolute_expression.

ПРИМЕР

.set one,1
two = 2

.lsym

РЕЗЮМЕ

.lsym  symbol_name , expression

Уникальное и иначе unreferenceable символ symbol_name, пара выражения создается в таблице символов. Создаваемый символ является статическим символом с типом абсолютных (N_ABS). Некоторый ФОРТРАН 77 компиляторов использует этот механизм для передачи с отладчиком.

Директивы для разделения невыполняемого кода

Разделение невыполняемого кода является процессом, которым статический редактор связей удаляет неиспользованный код и блоки данных от исполняемых файлов. Этот процесс помогает сократить полный размер исполнимых программ, поочередно улучшающий производительность путем сокращения объема потребляемой памяти исполнимой программы. Это также позволяет программам соединяться успешно в ситуации, где неиспользованный код относится к неопределенному символу, что-то, что обычно приводило бы к ошибке ссылки. Для получения дополнительной информации о разделении невыполняемого кода посмотрите Соединение в руководстве пользователя Xcode 2.1.

Следующие разделы описывают директивы разделения невыполняемого кода.

.subsections_via_symbols

РЕЗЮМЕ

.subsections_via_symbols

.subsections_via_symbols директива говорит статическому редактору связей, что разделы объектного файла могут быть разделены на отдельные блоки. Эти блоки тогда разделяются, если они не используются другим кодом. Эта директива применяется ко всем объявлениям раздела в сборочном файле и должна быть помещена вне любых объявлений раздела, как показано сюда:

.subsections_via_symbols
 
; Section declarations...

При использовании этой директивы гарантируйте, что каждый символ в разделе в начале блока кода. Неявные зависимости между блоками кода могут привести к удалению необходимого кода от исполнимой программы. Например, следующий раздел содержит три символа, но выполнение кода в _plus_three концы в blr оператор у основания блока кода:

.text
 .globl _plus_three
 _plus_three:
 addi r3, r3, 1
 .globl _plus_two
 _plus_two:
 addi r3, r3, 1
 .globl _plus_one
 _plus_one:
 addi r3, r3, 1
 blr

Если Вы используете .subsections_via_symbols директива по этому коду и _plus_two и _plus_three не вызываются никаким другим кодом, статический редактор связей не добавил бы _plus_two и _plus_one к исполнимой программе. В этом случае, _plus_three не возвратил бы правильное значение, потому что будет отсутствовать часть его реализации. Кроме того, если _plus_one мертво разделяется, программа может отказать когда _plus_three выполняется, поскольку это продолжало бы выполняться в следующий блок.

.no_dead_strip

РЕЗЮМЕ

.no_dead_strip symbol_name

.no_dead_strip директива говорит ассемблеру, что символ, указанный symbol_name, не должен быть мертво разделен. Например, следующий код предотвращает _my_version_string от того, чтобы быть мертво разделенным:

.no_dead_strip _my_version_string
.cstring
_my_version_string:
.ascii "Version 1.1"

Разные директивы

В этом разделе описываются дополнительные директивы, не вписывающиеся ни в один из предыдущих разделов.

.abort

РЕЗЮМЕ

.abort  [  "abort_string" ]

.abort директива заставляет ассемблер игнорировать далее ввод и выходить из обработки. Никакие файлы не создаются. Директива могла использоваться, например, в соединенной каналом версии компилятора — первая главная синтаксическая ошибка заставит компилятор выпускать эту директиву, сохраняя ненужную работу в собирающемся коде, который должен был бы быть отброшен так или иначе.

Дополнительное abort_string распечатан как часть сообщения об ошибке когда .abort с директивой встречаются.

ПРИМЕР

#ifndef VAR
    .abort "You must define VAR to assemble this file."
#endif

.abs

РЕЗЮМЕ

.abs  symbol_name , expression

Эта директива устанавливает значение symbol_name к 1 если выражение является абсолютным выражением; иначе, это обнуляет значение.

ПРИМЕР

.macro var
.abs is_abs,$0
.if is_abs==1
.abort "must be absolute"
.endif
.endmacro

.dump и .load

РЕЗЮМЕ

.dump filename
.load filename

Эти директивы позволяют Вам вывести и загрузить абсолютные символы и макроопределения для более быстрой загрузки и более быстрого блока.

Они работают как это:

.include "big_file_1"
.include "big_file_2"
.include "big_file_3"
...
.include "big_file_N"
.dump    "symbols.dump"

.dump директива выписывает все символы N_ABS и макросы. Можно позже использовать .load директива для загрузки всех символов N_ABS и макросов быстрее, чем Вы могла с .include:

.load "symbols.dump"

Один полезный побочный эффект загружающихся символов, которыми этот путь состоит в том, что они не выписаны к объектному файлу.

.file и .line

РЕЗЮМЕ

.file  file_name
.line  line_number

.file директива заставляет ассемблер сообщать о сообщениях об ошибках, как будто это обрабатывало файл file_name.

.line директива заставляет ассемблер сообщать о сообщениях об ошибках, как будто это обрабатывало строку line_number. Следующая строка после .line директива, как предполагается, является line_number.

Ассемблер поворачивает комментарии препроцессора C формы:

# line_number file_name level

в:

.line line_number; .file file_name

ПРИМЕР

.line 6
nop       | this is line 6

.if, .elseif, .else, и .endif

РЕЗЮМЕ

.if expression
.elseif expression
.else
.endif

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

Для каждого .if директива:

  • должно быть соответствие .endif

  • может быть как многие вмешательство .elseifкак желаемый

  • может быть не больше, чем одно вмешательство .else перед концом .endif

Метки или многократные операторы не должны быть помещены в ту же строку как ни одна из этих директив; иначе, операторы включая эти директивы не распознаны и производят ошибки или неправильный условный блок.

ПРИМЕР

.if a==1
.long 1
.elseif a==2
.long 2
.else
.long 3
.endif

.include

РЕЗЮМЕ

.include "filename"

.include директива заставляет именованный файл быть включенным в текущую точку в блоке. -Idir опция к ассемблеру указывает альтернативные пути, которые будут использоваться в поиске файла, если это не найдено в текущем каталоге.

ПРИМЕР

.include  "macros.h"

.machine

РЕЗЮМЕ

.machine arch_type

.machine директива указывает целевую архитектуру сборочного файла. arch_type может быть любым типом архитектуры, который можно указать в -arch опция ассемблерного драйвера. Посмотрите Ассемблерные Опции для получения дополнительной информации.

.macro, .endmacro, .macros_on, и .macros_off

РЕЗЮМЕ

.macro
.endmacro
.macros_on
.macros_off

Эти директивы позволяют Вам определять простые макросы (как только макрос определяется, однако, Вы не можете переопределить его). Например:

.macro  var
instruction_1  $0,$1
instruction_2  $2
 . . .
instruction_N
.long $n
.endmacro

$d (где d является единственной десятичной цифрой, 0 до 9) представляет каждый параметр — может быть самое большее 10 параметров. $n заменяется фактическим числом параметров, с которыми вызывается макрос.

При использовании макроса параметры разделяются запятой (кроме внутренних парных скобок — например, xxx(1,3,4),yyy содержит только два параметра). Вы могли использовать макрос, определенный выше следующим образом:

var  #0,@sp,4

Это было бы расширено до:

instruction_1 #0,@sp
instruction_2 4
 . . .
instruction_N
.long 3

Директивы .macros_on и .macros_off позвольте макросам быть записанными то переопределение инструкция или директива все еще с помощью инструкции или директивы. Например:

.macro .long
.macros_off
.long $0,$0
.macros_on
.endmacro

Если Вы не указываете параметр, макрос ничем не заменяет (см. .abs).

Специфичные для PowerPC директивы

Следующие директивы являются определенными для архитектуры PowerPC.

.flag_reg

РЕЗЮМЕ

.flag_reg reg_number

Это заставляет использование reg_number общего регистра быть отмеченным как предупреждения. Это предназначается для использования в макросах.

.greg

РЕЗЮМЕ

.greg symbol_name, expression...

Эта директива устанавливает symbol_name в 1 когда выражение является общим регистром или нулем иначе. Это предназначается для использования в макросах.

.no_ppc601

РЕЗЮМЕ

Это заставляет PowerPC 601 инструкция быть отмеченным как ошибки. Это совпадает с если -no_ppc601 опция указана.

.noflag_reg

РЕЗЮМЕ

.noflag_reg reg_number

Это выключает установку флага использования reg_number общего регистра, таким образом, они не становятся отмеченными как предупреждения. Это предназначается для использования в макросах.

Дополнительные специфичные для процессора директивы

Следующие специфичные для процессора директивы являются синонимами для других стандартных директив, описанных ранее в этой главе; несмотря на то, что они перечислены здесь для полноты, их использование не рекомендуется. Везде, где возможно, необходимо использовать стандартную директиву вместо этого.

Следующее является i386-специфичными директивами:

Директива i386

Стандартная директива

.ffloat

.single

.dfloat

.double

.tfloat

[expression] ¨ 80-разрядная расширенная точность IEEE, с плавающей точкой

.word

.short

.value

.short

.ident

(проигнорированный)

.def

(проигнорированный)

.optim

(проигнорированный)

.version

(проигнорированный)

.ln

(проигнорированный)