__asm
Microsoft 专用
__asm 关键字调用一个内联汇编,并且可以显示,每当 c. 或 C++ 语句合法。它不能单独出现。必须由程序集指令执行它,请在大括号中的命令的一组,或者,至少, null 对大括号。该术语 “__asm 块是”此处称为命令的说明或组,在大括号。
说明 |
---|
Visual C++ 对标准 C++ asm 关键字支持仅限于该条件编译器在关键字不会生成错误。但是, asm 块不会生成任何有意义的代码。使用 __asm而不是 asm。 |
语法:
__asm 程序集命令 [;]
__asm {} 程序集指令列表 [;]
语法
__asmassembly-instruction;opt
__asm {assembly-instruction-list};opt
程序集指令列表:
assembly-instruction;optassembly-instruction;assembly-instruction-list;opt
如果使用,而不用大括号, __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 块括在大括号中) 有一些优点。从 C 或 C++ 代码的大括号明显不同的代码和避免 __asm 关键字不必要的重复。大括号也会阻止多义性。如果在同一 __asm 块的行要将 c. 或 C++ 语句,可以在大括号必须将块。不带大括号,编译器无法告诉程序集代码位置停止,并且 C 或 C++ 语句开始。最后,因为,在大括号的文本与普通 MASM 文本的格式,您可以轻松地剪切和粘贴文本从现有 MASM 源文件。
不同于 C 和 C++ 的大括号,将 __asm 的大括号块不会影响变量的范围。您也可以嵌套 __asm 块;嵌套不影响变量的范围。
特定于 Microsoft 的结尾