学习Windows 编程,从MSDN翻译开始--2

来源:互联网 发布:淘宝客服提醒买家付款 编辑:程序博客网 时间:2024/05/16 11:08

        __asm关键字能够启动汇编器,可以在任意合法的C或C++语言中加入汇编语言。这个关键字不能单独出现,必须在后面跟上一句汇编指令或者在大括号中添加一组汇编指令,当然大括号中也可以为空。

        Visual C++支持标准C++的asm关键字,但是这局限于一个事实,就是编译器不会为该关键字生成任何汇编指令。注意,asm关键字和__asm不是同一个东西。如果你想嵌入汇编指令,那么请使用__asm。使用方法如下:

如果你在使用__asm的时候不加大括号,那么编译器会把当前行剩余的内容当做汇编指令块。考虑到兼容性,_asm和__asm的含义相同。

        在Visual C++2005之前,指令  __asm int 3  ,当编译参数中有/clr,即使用公共语言运行库时,编译器不会生成本地代码,编译器会将该指令转换成CLR中同等的指令。但是从Visual C++2005开始,__asm int 3 指令就会生成本地代码,这时如果你打算在代码中添加一个断点并且希望编译器将断点代码编译成MSIL,那么请使用__debugbreak。你也可以将代码写成这样:

 

__asm的大括号不会对其他的变量的作用域产生影响。

 

        你还可以将__asm汇编语言块定义成C语言的宏。宏定义为添加汇编语言块提供了一种便捷的方式。但是请注意:宏定义在展开的时候会成为一行代码(逻辑行)。

为了能够让编译器正确的识别你嵌入的汇编代码,请遵循以下的规则:

1. 将你的汇编语言写在大括号里

2. 在每一条汇编指令的前面添加__asm关键字

3. 在添加的注释的时候,请使用旧式注释/* comment */

 比如说如下:

 

乍一看上去,你一定认为大括号里面的__asm是多余的。但是,它们的确是有必要的,因为这个宏会展开为如下这样:

所以说,你必须在每句汇编指令前添加关键字来将它们区别开。宏定义也可以使用参数,但是不能将这种宏定义用作表达式。

注意:在fastcall调用方式的函数中使用这种宏定义可能会产生不可预料的结果,所以不要不分青红皂白的就去使用。

原创粉丝点击