欢迎来到天天文库
浏览记录
ID:14409006
大小:92.50 KB
页数:13页
时间:2018-07-28
《在 visual c++ 中使用内联汇编》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、在VisualC++中使用内联汇编--使用内联汇编可以在C/C++代码中嵌入汇编语言指令,而且不需要额外的汇编和连接步骤。在VisualC++中,内联汇编是内置的编译器,因此不需要配置诸如MASM一类的独立汇编工具。这里,我们就以VisualStudio.NET2003为背景,介绍在VisualC++中使用内联汇的相关知识(如果是早期的版本,可能会有些许出入)。内联汇编代码可以使用C/C++变量和函数,因此它能非常容易地整合到C/C++代码中。它能做一些对于单独使用C/C++来说非常笨重或不可能完成的任务。一、优点使用内联汇编可
2、以在C/C++代码中嵌入汇编语言指令,而且不需要额外的汇编和连接步骤。在VisualC++中,内联汇编是内置的编译器,因此不需要配置诸如MASM一类的独立汇编工具。这里,我们就以VisualStudio.NET2003为背景,介绍在VisualC++中使用内联汇的相关知识(如果是早期的版本,可能会有些许出入)。内联汇编代码可以使用C/C++变量和函数,因此它能非常容易地整合到C/C++代码中。它能做一些对于单独使用C/C++来说非常笨重或不可能完成的任务。内联汇编的用途包括:使用汇编语言编写特定的函数;编写对速度要求非常较高的代
3、码;在设备驱动程序中直接访问硬件;编写naked函数的初始化和结束代码。二、关键字使用内联汇编要用到__asm关键字,它可以出现在任何允许C/C++语句出现的地方。我们来看一些例子:简单的__asm块:__asm{MOVAL,2MOVDX,0xD007OUTAL,DX}在每条汇编指令之前加__asm关键字:__asmMOVAL,2__asmMOVDX,0xD007__asmOUTAL,DX因为__asm关键字是语句分隔符,所以可以把多条汇编指令放在同一行:__asmMOVAL,2__asmMOVDX,0xD007__asmOUT
4、AL,DX显然,第一种方法与C/C++的风格很一致,并且把汇编代码和C/C++代码清楚地分开,还避免了重复输入__asm关键字,因此推荐使用第一种方法。不像在C/C++中的"{}",__asm块的"{}"不会影响C/C++变量的作用范围。同时,__asm块可以嵌套,而且嵌套也不会影响变量的作用范围。为了与低版本的VisualC++兼容,_asm和__asm具有相同的意义。另外,VisualC++支持标准C++的asm关键字,但是它不会生成任何指令,它的作用仅限于使编译器不会出现编译错误。要使用内联汇编,必须使用__asm而不是a
5、sm关键字。三、汇编语言1.指令集内联汇编支持IntelPentium4和AMDAthlon的所有指令。更多其它处理器的指令可以通过_EMIT伪指令来创建(_EMIT伪指令说明见下文)。2.MASM表达式在内联汇编代码中,可以使用所有的MASM表达式(MASM表达式是指用来计算一个数值或一个地址的操作符和操作数的组合)。3.数据指示符和操作符虽然__asm块中允许使用C/C++的数据类型和对象,但它不能使用MASM指示符和操作符来定义数据对象。这里特别指出,__asm块中不允许MASM中的定义指示符(DB、DW、DD、DQ、DT
6、和DF),也不允许使用DUP和THIS操作符。MASM中的结构和记录也不再有效,内联汇编不接受STRUC、RECORD、WIDTH或者MASK。4.EVEN和ALIGN指示符尽管内联汇编不支持大多数MASM指示符,但它支持EVEN和ALIGN。当需要的时候,这些指示符在汇编代码里面加入NOP指令(空操作)使标号对齐到特定边界。这样可以使某些处理器取指令时具有更高的效率。5.MASM宏指示符内联汇编不是宏汇编,不能使用MASM宏指示符(MACRO、REPT、IRC、IRP和ENDM)和宏操作符(<>、!、&、%和.TYPE)。6.
7、段必须使用寄存器而不是名称来指明段(段名称"_TEXT"是无效的)。并且,段跨越必须显式地说明,如ES:[EBX]。7.类型和变量大小在内联汇编中,可以用LENGTH、SIZE和TYPE来获取C/C++变量和类型的大大小。*LENGTH操作符用来取得C/C++中数组的元素个数(如果不是一个数组,则结果为1)。*SIZE操作符可以获取C/C++变量的大小(一个变量的大小是LENGTH和TYPE的乘积)。*TYPE操作符可以返回C/C++类型和变量的大小(如果变量是一个数组,它得到的是数组中单个元素的大小)。例如,程序中定义了一个8
8、维的整数型变量:intiArray[8];下面是C和汇编表达式中得到的iArray及其元素的相关值:__asmCSizeLENGTHiArraysizeof(iArray)/sizeof(iArray[0])8SIZEiArraysizeof(iArray)32
此文档下载收益归作者所有