您当前的位置:五五电子网电子知识电子知识资料计算机应用用汇编与VC++混合编程 实现对硬件资源的访问 正文
用汇编与VC++混合编程 实现对硬件资源的访问

用汇编与VC++混合编程 实现对硬件资源的访问

点击数:7311 次   录入时间:03-04 11:35:11   整理:http://www.55dianzi.com   计算机应用

  本文首先介绍了Visual C++ 6.0中嵌入汇编程序代码的技巧,在此基础上以实际开发的数据采集系统中相关的软、硬件部分为例,给出了用汇编语言与Visual C++ 6.0混合编程实现对计算机总线、端口或外设进行访问和数据交换的方法。

  1.概述

  Visual C++ 6.0(以下简称VC++ 6.0)是Mi-croSOFt到目前为止推出的最新的C++语言软件开发版本,它集成了功能强大的编辑器、编译器、链接器、调试器、AppWizard、ClassWizard、AppStudio等多种多样的可视化编程工具,使得在Windows下用可视化编程语言开发面向对象的应用程序更加轻松、快捷。然而,尽管C++语言相对其他高级语言已经有了很高的代码效率,但是如果要直接访问内存、寄内器、I/O端口等,C++库函数和WinAPI要由编译程序经过一系列转换后才能完成这些操作,速度比汇编代码慢几倍甚至十几倍。因此在用C++开发与硬件密切相关的Windows应用程序时,如果能将汇编代码嵌入到程序中,就可以充分发挥汇编代码内存需求小、能直接访问硬件端口、执行速度快的优势,而且保留了VC++6.0面向对象、可视化等Windows程序风格和C++语言对数据强大的处理能力。另外,VC++程序中对执行速度要求比较高或要多次被调用的函数模块也可用汇编代码编写,这无疑将大大提高程序的执行效率。实际上,VC++从最早版本起就一直支持与MASM汇编语言混合编程。下文就对VC++和汇编混合编程作些介绍,并以开发总线数据采集系统的实例来说明这种编程如何实现对硬件资源的控制和访问。

  2.VC++的嵌入式汇编语言

  嵌入式汇编也称在线汇编(inline assembly),通过关键词“_asm”将MASM汇编语句加入到VC++程序中。嵌入的汇编代码由VC++ 6.0中在线汇编编译器统一完成,不需单独编译,使用相当方便。

  2.1汇编语言的嵌入

  在VC++代码中嵌入汇编有两种方式,都要用到关键词“_asm”。一种是VC++代码行中以“_asm汇编语句”这样的单行形式嵌入,另一种是以“_asm{…}”这样的块状形式嵌入,如下表所列。

54

  这两种形式中前者在VC++代码中可任意插入一行汇编,显得灵活、方便;后者更适合用于大段汇编语句的插入,显得简洁明了、结构清晰。二者在功能上完全相同。

  2.2在_asm{…}块中使用汇编语言

  VC++中嵌入的_asm{…}代码段可使用几乎全部MASM的表达式,完全支持Intel处理器的指令集。但要注意,VC++的在线汇编器和MASM宏汇编器并不完全相同,它不支持MASM中的MACRO、REPT、IRC、IRP、ENDM等宏指令或〈〉、&、%、TYPE等宏操作符。另外,_asm{…}代码段内部的注释语句可使用汇编注释符“;”来标识,也可用C语言风格的注释符“/*…*/”和“∥”来标识。

  VC++推荐使用C语言风格的注释符。

  2.3在_asm{…}块中使用C语言资源

  VC++中嵌入的_asm{…}代码段可以方便地通过名字来访问C++中的多种资源,这也是两者能够无缝结合的一个条件。下面列出在线汇编语言指令具体可以使用的C++语言元素:

  (1)符号:包括标号、变量和函数名;

  (2)常量:包括符号常量和enum成员;

  (3)C++宏指令和预处理指令;

  (4)类型名:

  (5)注释符号(/**/和//)。

  _asm{…}代码段使用C语言资源时有以下一些注意事项:

  (1)不能使用C、C++专用的操作符,如“《”。而C、C++和MASM共享的操作符,如“*”、“[]”等,将被理解成汇编语言操作符。例如在一asm{…}内“[]”被视为字节索引操作,产生一个相对标号或数据的字节偏移量。正因为这种区别,如果一asm{…}内要访问_asm{…}外某INT型数组array的第,z个元素,则必须在_asm{…}内访问array[4*n]开始的双字数据。

  (2) -行汇编语句中只能包含一个C、C++符号。但与LENGTH、TYPE、及SIZE相伴的汇编表达式除外。

  (3)_asm{…}内使用的C、C++符号不能和MASM的保留字冲突,如指令名和寄存器名。

  (4)_asm{…}内访问C、C++的结构或联合的成员时,点操作符前必须加上变量名或类型定义名。

  (5)_asm{…}可以调用非重载的全局C ++函数和任何以extern“C”链接声明的函数。也就是说_asm{…}内可以调用所有C标准库函数,因为所有标准头文件都声明库函数为extern“C”链接。由于函数的参数都是通过栈传递的,所以调用函数前要将所需参数以逆序压栈,这样参数从栈中弹出时顺序才能和实际一致。

  3.基于总线的采集系统实例

  虽然VC++等高级语言有很多手段,如编写设备驱动程序、使用WinAPI等等,可以实现对计算机底层硬件的访问和管理,但是这些方法比较复杂,对程序员要求也相对较高。选择使用嵌入汇编的VC++编程既保持了VC++的Windows程序风格,又具备灵活地对内存、总线、I/O端口、寄存器的控制访问能力,是一种可以实现对硬件资源访问的方便可行的编程方式。下面就结合实际开发的数据采集系统对用汇编语言和VC++混合编程实现硬件资源访问作些介绍。

  3.1采集系统简介

  该系统完成对模拟信号的采样、量化,并通过计算机ISA扩展总线将数据传至计算机进行存储与分析。系统与微机接口如下图所示。

系统与微机接口

控制软件通过总线向采集设备发送初始化命令和控制指令。主机的控制软件如下图所示。

45

BOOL CMainFrame::OnColButton()

{

∥为数据分配内存空间,MemData为起始地址

    if( col_ flag==TRUE)

    delete( MemData);

  MemData= new char[1024* 1024* MemLengh];

45

45

  在OnColButton()函数中,我们可以看到嵌入的_asm{…}中使用了C++代码定义的内存地址指针MemData( Mov ebx,MemData),利用基址寄存器ebx实现对内存的访问;_asm{…}中也访问了C++定义的int型变量i(Mov eax,i);使用了C++预编译处理命令(# define IO_ PORT 340h)的定义,用IO_PORT代替340h( mov edx,IO_PORT),这也是对C++资源的共享;对总线、端口数据的访问则通过in al,edx指令来实现,当然与之对应的硬件地址译码电路必须和edx寄存器中的值IO_PORT(340h)对应。




本文关键字:硬件  资源  计算机应用电子知识资料 - 计算机应用

《用汇编与VC++混合编程 实现对硬件资源的访问》相关文章>>>