汇编语言是很多的用途,例如提高程序的速度,减少内存的需要,并控制硬件。若要直接在没有额外的程序集和链接的步骤 C 和C++ 源代码程序中嵌入汇编语言指令,可以使用内联汇编。内嵌汇编器是内置编译器,因此您不需要单独的汇编器如 Microsoft 的宏汇编器 (MASM)。
注意:
内联汇编代码的程序不是完全可移植到其他硬件平台。如果您正在设计的可移植性,避免使用内联汇编。
安腾和 x64 处理器不支持内联程序集。
下列主题介绍了如何使用Visual C/C++内联汇编与 x86 处理器:
;==========================================
1.内嵌汇编器概述
2.__asm 语法
3.其他
;==========================================
1.内嵌汇编器概述
内嵌汇编器允许您在没有额外的程序集和链接的步骤C和 C++源代码程序中嵌入汇编语言指令。编译器中内置内联汇编 — — 你不需要单独的汇编程序如 Microsoft的宏汇编程序(MASM)。
内联汇编并不需要单独的程序集和链接的步骤,因为它是比单独的汇编程序更方便。内联程序集代码可以使用任何 C 或C++变量或函数的名称是在范围内,因此很容易地将其集成到您的程序的 C和 C++代码。并与 C 和C++的语句,可以混合程序集代码,因为它可以做麻烦或不可能在 C 或 C++的单独的任务。
__Asm 关键字调用内联汇编,并可以显示在C 或C++代码的合法地方。它本身没有意义。它必须遵循程序集的指令,一组指令括在大括号内,或对空括号。"__Asm 块"一词在这里是指任何指令或一组指令。
下面的代码是简单 __asm 块放在括号内。(代码是一个自定义函数 prolog 序列。
// 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
;==================================================================
2.__asm 语法
下面的语法:
__asm 程序集指令 [;]
__asm { 指令集单 } [;]
语法
--------------------------------------------------------------------------------
asm 语句:
__asm 程序集指令 ;选择
__asm { 指令集单 } ;选择
如果使