一、引言:
汇编语言是一种运行速度最快,能使用所有机器特殊硬件功能的语言。对速度要求很高的程序,如实时响应处理,图形图象处理等都离不开汇编语言。目前,在计算机系统中,无论是操作系统、编译系统、图形处理系统及大量应用系统中都还不能完全离开汇编语言编制的程序模块。众所周知,汇编语言的特点在于其速度和与硬件打交道的能力,而高级语言则通常具有编程容易、方便、调试快速的特点。因此,两者的结合将发挥各自的优势,扬长避短,从而发挥更大的效益。在Windows环境下一般采用动态连接库(DLL)技术使两者相结合,即用汇编语言来建立DLL,再在高级语言中调用DLL。本文将首先详细介绍用汇编建立DLL的方法,然后作为一个例子,在VB程序中调用所建立的DLL。
二、DLL的建立
1、调用约定
调用约定是在语言中为实现调用而建立的一种协议。应用程序采用调用约定来规定应用程序以某种顺序把变量或参数传递给DLL;DLL采用调用约定来决定以何种顺序接收所传递给它的参数。16位的DLL的参数传递遵从PASCAL的调用约定,即对函数参数采用与参数在参数表中出现的顺序"从左到右"压入堆栈的方式进行(见图1),参数在堆栈中所占的字节与调用类型,参数类型等有关;且被调用函数已经明确获知参数的数目,因此在函数结束时,会一并恢复堆栈的状态。
调用约定使应用程序知道哪一些过程、函数是外部的,从而在连接时能找到这些程序模块;同时,也在DLL中说明哪些过程、函数是可以为其它程序模块所使用。在用汇编语言建立的DLL中,调用约定由过程定义语句中的关键字PASCAL指出。
高 地 址
低 地 址
参 数1
参 数2
返 回 地 址
BP 保 护
BP, SP
图1.PASCAL调用堆栈
2、参数传递
应用程序与DLL之间的通讯是经过参数传递来完成的,当DLL中的过程或函数定义之后,就可以在应用程序中对它进行调用,而调用与被调用之间的信息传递和交换可以通过系统堆栈进行参数传递来完成。在定义或说明时用形式参数,调用时则替换成实际参数。如何把实际参数传递给相应的形式参数,而且当过程完结后又如何把所得结果送回应用程序,这是编程中要解决的问题。 DLL中接收应用程序传递过来的参数由过程定义语句中的EXPORT关键字给出。常用的参数传递方式有传值和传址两种:传值是一种最简单的参数传递方法,它把实际参数的值传递给相应的形式参数。DLL中的库函数可用如下方法来接收应用程序传递过来的值(假设应用程序用传值方式传递过来两个整型值):
SUM1 PROC FAR PASCAL EXPORT I:PTR WORD,J:PTR WORD
… …
MOV