当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 内联汇编基础知识

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

VC++ 中的 内联汇编基础知识


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 153 ::
收藏到网摘: n/a

内联汇编基础知识
作者:释雪

几天看了孙原等几位仁兄关于汇编语言的几篇文章,颇感兴趣。于是查了查98版的MSDN中,其中也有几篇关于内联汇编的基础,索引字是asm。讲得不算太难,于是试着将其内容写下来了,特此贴来。

一、 内联汇编简述

Visual C++ 6.0编译器下,内联汇编可以使用所有的Intel486处理器指令集。而且可以对目标处理器建立起伪指令来实现附加指令功能。内联汇编可以使用MASM编译器所允许的表达式,其中的一些表达式可以通过操作符和操作数的组合,对单精值进行运算.

虽然内联汇编可以访问C\C++中的数据变量以及类对象,但它不可能通过MASM指令和操作符来定义数据及对象。尤其你还不能使用DB, DW, DD, DQ, DT和DF等定义指令以及DUP和This操作符。汇编中的结构记录也不是可用的。内联汇编也不支持directives STRUC, RECORD, WIDTH, 和 MASK指令。不过,在内联汇编可以使用到一个_emit宏指令,它类似于MASM中的DB指令,它可以在本区域内定义出一个字节型,虽然它每次只能定义一个字节出来,但还是可以用它来定义出一个字符串,请看示例:
#define randasm __asm _emit 0x4A __asm _emit 0x43 __asm _emit 0x4B …__asm { randasm}
虽然内联汇编不支持MASM中的很多指令,但它支持EVEN 和 ALIGN指令。它们被用于那些需要使用align labels来指定分界线的汇编指令。

内联汇编不可以是一个宏汇编程序,你不可以使用MASM中的宏定义指令以及宏操作符。但内联汇编是可以使用C\C++中的预理指令来定义宏。

在处理段时,你只能使用寄存器,而不是通过名字,因为在内联汇编中这是非法的。而且段必须显式地使用寄存器,如: ES:[BX]

在内联汇编使用操作符LENGTH, SIZE, 和 TYPE可以来对变量以及类型进行长度的测量,你可以使用它们来求得C\C++中的变量及类型的长度:

*LENGTH操作符可以返回在一个变量数组中的元素个数,如果返回为1则代表这不是一个变量数组。

*SIZE操作符可以求得一个变量及类型的总长度。这个值也可以由LENGTH与TYPE积来求得。

*TYPE操作符可以求得一个变量及类型的长度,与SIZE不同的是,如果变量名是一个数组的话,则返加这个数组中单个元素的长度。

具体情况请看下表:

__asm C Size
LENGTH arr sizeof(arr)/sizeof(arr[0]) 8
SIZE arr sizeof(arr) 16
TYPE arr sizeof(arr[0]) 2

包含着内联汇编的程序可以使用/Zi选项编译,从而来进行代码级的调试工作。这样,你就可以同时在C\C++程序段与内联汇编段中设置断点,如果你使用/Fas选项允许混合汇编与C\C++源程序调试方式,那么你就可以看到混合着汇编与源程序的代码集合。

Visual C++编译器允许你在内联汇编程序中使用Intel处理器的MMX指令集。不过如果使用MMX指令集编译器会发生警告。更多的信息请查看MSDN的Web站点。

二、 关于内联汇编的具体使用说明:

因为内联汇编不需要编译与链接过程,因此它比一个汇编程序更为方便。由于它能够访问C\C++中的变量及函数,所以它能够更好和你C\C++代码融为一体。内联汇编可以在以下方面进行编程:

*用汇编语言编写函数。
*使用汇编语言来产生速度最优化代码段。
*直接使用汇编语言来对硬件进行访问。
*为naked函数调用编写保护现场和恢复现场代码( prolog and epilog code)

如果你计划在不同机器上运行程序的话,那么你应该分别放置不同机种的专一汇编代码。因为内联汇编有一定的机器专一性,它不完全支持所有MASM中的宏与数据类型。

VC不支持C++中的asm关键字,所以你需要使用__asm(两个下划线)关键字来编写你的内联