6.43.1 Basic Asm — Инструкции ассемблера без операндов
Базовая asm инструкция имеет следующий синтаксис:
asm [ volatile ] ( AssemblerInstructions )
Ключевое слово asm — это расширение GNU. При написании кода, который может быть скомпилирован с -ansi и различными -std опциями, используйте __asm__ вместо asm (см. Альтернативные ключевые слова).
Квалификаторы
volatileНеобязательный квалификатор
volatileне оказывает никакого влияния. Все базовыеasmблоки неявно являются volatile.
Параметры
- AssemblerInstructions
-
Это строковая литерал, которая указывает код ассемблера. Строка может содержать любые инструкции, распознаваемые ассемблером, включая директивы. GCC не анализирует сами инструкции ассемблера и не знает, что они означают или даже являются ли они допустимым входными данными ассемблера.
Вы можете разместить несколько инструкций ассемблера вместе в одной строке
asm, разделенных символами, обычно используемыми в коде ассемблера для системы. Комбинация, которая работает в большинстве случаев, это перевод строки и символ табуляции (записанные как ‘\n\t’). Некоторые ассемблеры допускают использование точки с запятой в качестве разделителя строк. Однако обратите внимание, что некоторые диалекты ассемблера используют точки с запятой для начала комментария.
Замечания
Использование расширенного asm обычно приводит к более компактному, безопасному и эффективному коду, и в большинстве случаев это лучшее решение, чем базовый asm. Однако существуют две ситуации, где можно использовать только базовый asm:
- Расширенные
asmинструкции должны быть внутри функции C, поэтому для написания встроенного языка ассемблера на уровне файла («на верхнем уровне»), вне функций C, необходимо использовать базовыйasm. Вы можете использовать эту технику для вывода директив ассемблера, определения макросов языка ассемблера, которые могут быть вызваны в других частях файла, или для написания целых функций на языке ассемблера. - Функции, объявленные с атрибутом
naked, также требуют базовогоasm(см. Атрибуты функций).
Безопасный доступ к данным C и вызов функций из базового asm более сложен, чем может показаться. Для доступа к данным C лучше использовать расширенный asm.
Не ожидайте, что последовательность asm инструкций останется идеально последовательной после компиляции. Если некоторые инструкции должны оставаться последовательными в выводе, поместите их в одну многоинструкционную asm инструкцию. Обратите внимание, что оптимизаторы GCC могут перемещать asm инструкции относительно другого кода, включая переходы.
asm инструкции не могут производить переходы в другие asm инструкции. GCC не знает об этих переходах и, следовательно, не может учитывать их при принятии решения о том, как оптимизировать. Переходы из asm к меткам C поддерживаются только в расширенных asm.
В определенных обстоятельствах GCC может дублировать (или удалять дубликаты) вашего кода ассемблера при оптимизации. Это может привести к неожиданным ошибкам дублирования символов во время компиляции, если ваш код ассемблера определяет символы или метки.
Поскольку GCC не анализирует AssemblerInstructions, он не видит никаких символов, на которые ссылается. Это может привести к тому, что GCC отбросит эти символы как неиспользуемые.
Компилятор копирует инструкции ассемблера в базовом asm дословно в файл вывода ассемблера без обработки диалектов или операторов ‘%’, которые доступны с расширенными asm. Это приводит к небольшим различиям между строками базового asm и шаблонами расширенного asm. Например, для обращения к регистрам можно использовать ‘%eax’ в базовом asm и ‘%%eax’ в расширенном asm.
На таких целевых платформах, как x86, которые поддерживают несколько диалектов ассемблера, все базовые asm блоки используют диалект ассемблера, указанный опцией командной строки -masm (см. Опции x86). Базовый asm не предоставляет механизма для предоставления различных строк ассемблера для различных диалектов.
Вот пример базового asm для i386:
/* Note that this code will not compile with -masm=intel */
#define DebugBreak() asm("int $3")
Далее: Расширенный Asm, Вверх: Использование языка ассемблера с C [Содержание][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-5.5.0/gcc/Basic-Asm.html