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