__asm

Блок, относящийся только к системам Майкрософт

Ключевое слово __asm вызывает встроенный ассемблер и может отображаться везде, где допустим оператор С или С++. Он не может отображаться самостоятельно. За ним должна следовать инструкция по сборке, группа инструкций, заключенная в круглые скобки, либо, в крайнем случае, пустая пара круглых скобок. Термин "блок __asm" в этом разделе относится к любой инструкции или группе инструкций, в скобках или без них.

Примечание

Поддержка стандартного ключевого слова C++ asm в Visual C++ ограничена тем фактом, что компилятор не создаст ошибку по ключевому слову.Однако блок asm не создаст никакого значимого кода.Используйте __asm вместо asm.

Синтаксис:

__asm assembly-instruction [ ; ]

__asm { assembly-instruction-list } [ ; ]

Грамматика

  • __asm assembly-instruction ;необ

    __asm { assembly-instruction-list };необ

  • список инструкций по сборке:
    assembly-instruction;необ

    assembly-instruction;assembly-instruction-list;необ

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

Поскольку ключевое слово __asm является разделителем операторов, можно также помещать инструкции ассемблера на одной строке:

До Visual C++ 2005 эта инструкция

__asm int 3

не вызывала создания машинного кода при компиляции с /clr; компилятор преобразовывал инструкцию в инструкцию прерывания среды CLR.

__asm int 3 теперь приводит к созданию машинного кода для функции. Если необходимо, чтобы функция создавала точку останова в коде и компилировалась в MSIL, воспользуйтесь __debugbreak.

Пример

Следующий фрагмент кода — это простой блок __asm, заключенный в фигурные скобки:

__asm {
   mov al, 2
   mov dx, 0xD007
   out dx, al
}

Кроме того, можно поставить __asm перед каждой инструкцией по сборке.

__asm mov al, 2
__asm mov dx, 0xD007
__asm out dx, al

Поскольку ключевое слово __asm является разделителем операторов, можно также помещать инструкции по сборке на одной строке.

__asm mov al, 2   __asm mov dx, 0xD007   __asm out dx, al

Все три примера создают один и тот же код, но первый стиль (где блок __asm заключен в фигурные скобки) имеет некоторые преимущества. Фигурные скобки четко отделяют код сборки от кода С или С++ и позволяют избежать лишнего повторения ключевого слова __asm. Скобки также помогают избежать неоднозначности. Если требуется поместить оператор C или C++ на одной строке в виде блока __asm, необходимо заключить блок в фигурные скобки. Без фигурных скобок компилятор не может определить, где прекращается код сборки и начинаются операторы C или C++. Наконец, поскольку текст в фигурных скобках имеет тот же формат, что и обычный текст MASM, можно легко вырезать и вставить текст из существующих исходных файлов MASM.

В отличие от фигурных скобок в C и C++ фигурные скобки, в которые заключается блок __asm, не влияют на область видимости переменной. Можно также разместить блоки __asm в виде вложения, вложение не влияет на область видимости переменной.

Завершение блока, относящегося только к системам Майкрософт

См. также

Ссылки

Ключевые слова в C++

Встроенный ассемблер