手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

在VisualC 中使用内联汇编

来源:互联网 作者:西部数码 时间:2008-04-09
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
  一、内联汇编的优缺点

  因为在Visual C 中使用内联汇编不需要额外的编译器和联接器,且可以处理Visual C 中不能处理的一些事情,而且可以使用在C/C 中的变量,所以非常方便。内联汇编主要用于如下场合:

  1.使用汇编语言写函数;
  2.对速度要求非常高的代码;
  3.设备驱动程序中直接访问硬件;
  4."Naked" Call的初始化和结束代码。

  //(."Naked",理解了意思,但是不知道怎么翻译^_^,大概就是不需要C/C 的编译器(自作聪明)生成的函数初始化和收尾代码,请参看MSDN的"Naked Functions"的说明)

  内联汇编代码不易于移植,如果你的程序打算在不同类型的机器(比如x86和Alpha)上运行,应当尽量避免使用内联汇编。这时候你可以使用MASM,因为MASM支持更方便的的宏指令和数据指示符。

  二、内联汇编关键字

  在Visual C 使用内联汇编用到的是__asm关键字,这个关键字有两种使用方法:

  1.简单__asm块

__asm
{
MOV AL, 2
MOV DX, 0XD007
OUT AL, DX
}
  2.在每条汇编指令之前加__asm关键字

__asm MOV AL, 2
__asm MOV DX, 0xD007
__asm OUT AL, DX
  因为__asm关键字是语句分隔符,因此你可以把汇编指令放在同一行:

  __asm MOV AL, 2 __asm MOV DX, 0XD007 __asm OUT AL, DX

  显然,第一种方法和C/C 的风格很一致,并且有很多其它优点,因此推荐使用第一种方法。

  不象在C/C 中的"{}",__asm块的"{}"不会影响C/C 变量的作用范围。同时,__asm块可以嵌套,嵌套也不会影响变量的作用范围。

  三、在__asm块中使用汇编语言

  1.内联汇编指令集

  内联汇编完全支持的Intel 486指令集,允许使用MMX指令。不支持的指令可以使用_EMIT伪指令定义(_EMIT伪指令说明见下文)。

  2.MASM表达式

  内联汇编可以使用MASM中的表达式。比如: MOV EAX, 1。

  3.数据指示符和操作符

  虽然__asm块中允许使用C/C 的数据类型和对象,但它不能用MASM指示符和操作符定义数据对象。这里特别指出,__asm块中不允许MASM中的定义指示符: DB、DW、DD、DQ、DT和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.段说明

  必须使用寄存器来说明段,跨越段必须显式地说明,如ES:[BX]。

  7.类型和变量大小

  我们可以使用LENGTH来取得C/C 中的数组中的元素个数,如果不是一个数组,则结果为一。使用SIZE来取得C/C 中变量的大小,一个变量的大小是LENGTH和TYPE的乘积。TYPE用来取得一个变量的大小,如果是一个数组,它得到的一个数组中的单个元素的大小。

  8.注释

  可以使用C/C 的注释,但推荐用ASM的注释,即";"号。

  9._EMIT伪指令

  _EMIT伪指令相当于MASM中的DB,但一次只能定义一个字节,比如:

__asm
{
JMP _CodeOfAsm

_EMIT 0x00 ; 定义混合在代码段的数据
_EMIT 0x01

_CodeOfAsm:
; 这里是代码
_EMIT 0x90 ; NOP指令
}
  四、在__asm块中使用C/C 语言元素

  C/C 与汇编可以混合使用,在内联汇编可以使用C/C 的变量和很多其它C/C 的元素。在__asm块中可以使用以下C/C 元素:

  1.符号,包括标号、变量和函数名;

  2.常量,包括符号常量和枚举型(enum)成员;

  3.宏定义和预处理指示符;

  4.注释,包括"/**/"和"//";

  5.类型名,包括所有MASM中合法的类型

  6.typedef名称, 像PTR、TYPE、特定的结构成员或枚举成员这样的通用操作符。

  在__asm块中,可以使用C/C 或ASM的基数计数法(比如: 0x100和100H是相等的)。

  __asm块中不能使用像<<一类的C/C 操作符。C/C 和MASM通用的操作符,比如"*"和"[]"操作符,都被认为是汇编语言的操作符。举个例子:

int array[10];

__asm MOV array[6], BX ; Store BX at array 6 (not scaled)

array[6] = 0; /* Store 0 at array 12 (scaled) */
  * 小技巧: 内联汇编中,你可以使用TYPE操作符使作其与C一致。比如,下面两条语句是一样的:

__asm MOV array[6 * TYPE int], 0 ; Store 0 at array 12

array[6] = 0; /* Store 0 at array 12 */
  内联汇编能通过变两名直接引用C/C 的变量。__asm块中可以引用任何符号,包括变量名。

  如果C/C 中的类、结构或者枚举成员具有唯一的名称,如果在"."操作符之前不指定变量或者typedef名称,则__asm块中只能引用成员名称。然而,如果成员不是唯一的,你必须在"."操作符之前加上变量名或typedef名称。例如,下面的两个结构都具有same_name这个成员变量:

struct first_type
{
char *weasel;
int same_name;
};

struct second_type
{
int wonton;
long same_name;

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

热点关注
IDC资讯 虚拟主机 域名注册 托管租用 vps主机 智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 价格总览 | 资讯中心 | 友情链接 | 网站地图 | 招贤纳士 | RSS