Поделиться через


__asm

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

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

Примечание.

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

грамматики

asm-block:
__asmинструкция assembly-instruction ;выбирать
__asm {assembly-instruction-list } ;выбирать

assembly-instruction-list:
Выбор инструкции сборки ;
Выбор сборки-инструкции assembly-instruction-list; ;

Замечания

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

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

Перед Visual Studio 2005 инструкцией

__asm int 3

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

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

Для совместимости с предыдущими версиями является синонимом, _asm если не указан параметр __asm компилятора /Za (отключить расширения языка).

Пример

Следующий фрагмент кода — это простой блок __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 блоки; вложенные блоки не влияют на область переменной.

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

См. также

Ключевые слова
Встроенный сборщик