Обзор встроенного кода на ассемблере
Блок, относящийся только к системам Майкрософт
Встроенный ассемблер позволяет внедрять инструкции языка ассемблера непосредственно в исходные программы С и С++ без дополнительных шагов по сборке и компоновке. Встроенный код на ассемблере встроен в компилятор, поэтому вам не требуется отдельный сборщик для языка ассемблера, такой как Microsoft Macro Assembler (MASM).
Так как встроенный ассемблер не требует отдельных действий по сборке и компоновке, он является более удобным, чем отдельный ассемблер. Во встроенном коде на языке ассемблера можно использовать любое имя переменной или функции языка C или C++, находящееся в области видимости, поэтому его легко интегрировать с кодом C и C++ программы. Поскольку в коде на языке ассемблера можно одновременно использовать операторы C или C++, с его помощью можно выполнять задачи, которые слишком сложно или невозможно выполнить только в C или только в C++.
Ключевое слово __asm вызывает встроенный сборщик и может отображаться везде, где является юридический оператор C или C++. Он не может отображаться самостоятельно. За ним должна следовать инструкция по сборке, группа инструкций, заключенная в круглые скобки, либо, в крайнем случае, пустая пара круглых скобок. Термин "блок __asm
" в этом разделе относится к любой инструкции или группе инструкций, в скобках или без них.
Следующий код — это простой блок __asm
, заключенный в фигурные скобки. (Этот код является последовательностью пролога пользовательской функции.)
// asm_overview.cpp
// processor: x86
void __declspec(naked) main()
{
// Naked functions must provide their own prolog...
__asm {
push ebp
mov ebp, esp
sub esp, __LOCAL_SIZE
}
// ... and epilog
__asm {
pop ebp
ret
}
}
Кроме того, можно поставить __asm
перед каждой инструкцией по сборке:
__asm push ebp
__asm mov ebp, esp
__asm sub esp, __LOCAL_SIZE
Поскольку ключевое слово __asm
является разделителем операторов, можно также помещать инструкции ассемблера на одной строке:
__asm push ebp __asm mov ebp, esp __asm sub esp, __LOCAL_SIZE
Завершение блока, относящегося только к системам Майкрософт