Ассемблерные директивы
В этой главе описываются ассемблерные директивы (также известный как псевдо операции или псевдооперация в секунду), которые позволяют управление действиями ассемблера.
Директивы для обозначения текущего раздела
Ассемблер поддерживает обозначение произвольных разделов с .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
Это эквивалентно .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
Это эквивалентно.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
сегмент, включая старые разделы, больше не использующиеся и будущие разделы, которые могут быть добавлены, исключительно резервируется для использования компилятора 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 | Стандартная директива |
---|---|
|
|
|
|
|
|
|
|
|
|
| (проигнорированный) |
| (проигнорированный) |
| (проигнорированный) |
| (проигнорированный) |
| (проигнорированный) |