__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
блоки; вложенные блоки не влияют на область переменной.
Завершение блока, относящегося только к системам Майкрософт