现在编程序,不用说,都是在调用别人做好的动态链接库中的函数,能不能编写自己的动态链接库呢?答案是肯定的!让我们开始吧!
;------------------------------------------------------- ;例:将EDX:EAX中的值转换成十进制输出形式字符串。 ;文件名:MyDll.asm,这是动态链接库的源程序 ;编译模式="DLL" ;这是AoGo的最新版本MASM for EditPlus的要求,只需指明编译模式,则都只需要按Ctrl+1就能编译所有的模式,真是方便. .386 .model flat,stdcall option casemap:none
include windows.inc
.code ;DllEntry是动态链接库的入口,当动态链接库被加载/卸载时,或同一进程的线程生成/退出时,都会调用该入口函数 ;当然,函数名不一定非是这个,但要和最后的End DllEntry保持一致。 DllEntry proc hInstDLL:HINSTANCE, reason:DWORD, reserved1:DWORD mov eax,TRUE ;若返回FALSE,动态链接库就不会加载了 ret DllEntry Endp
;将EDX:EAX中的值转换成十进制输出形式字符串,很熟悉吧,前面的例子中有的! OutEdxEax proc / ;比如:EDX=0,EAX=01234567H,则转换后的字符串为: uses ebx esi edi,lpString ; -> '19088743',0 mov edi,lpString ;指向存放结果的地址 mov esi,lpString
mov ecx,10 ;转换成十进制 .while eax!=0 || edx!=0 push eax mov eax,edx xor edx,edx div ecx mov ebx,eax pop eax div ecx add dl,'0' mov [edi],dl ;存放结果 inc edi mov edx,ebx .endw
mov BYTE ptr [edi],0;字符串以0为结尾 dec edi
.while edi>esi ;结果前变后,后变前! mov al,[esi] xchg al,[edi] mov [esi],al inc esi dec edi .endw ret OutEdxEax endp end DllEntry ------------------------------------------------------------------- ;文件名:Mydll.def,要和MyDll.asm保存在相同的目录下 ;模块定义文件,定义能被其它程序调用的函数名
LIBRARY MyDll ;动态链接库的名字 EXPORTS OutEdxEax ;可被调用的函数名 ------------------------------------------------------------------- ;文件名:MyDll.inc,函数声明
OutEdxEax PROTO :DWORD ;一个缓冲区指针参数,用来存放转换后的子符串,注意缓冲区要足够存放结果。 ------------------------------------------------------------------- 编译链接:
用EditPlus打开文件MyDll.asm,执行“工具/编译&链接&运行”或直接用“Ctrl+1”,只要程序没输入错,就可看到编译后生成的文件。如下:
D:/MASM7>dir mydll Volume in drive D has no label Volume Serial Number is 18F0-186B Directory of D:/MASM7 MYDLL ASM 1,675 02-17-03 21:12 MyDll.asm MYDLL DEF 36 02-17-03 20:48 MyDll.def MYDLL INC 28 02-17-03 21:28 MyDll.inc MYDLL DLL 2,560 02-17-03 20:49 MyDll.DLL MYDLL LIB 2,064 02-17-03 20:49 MyDll.lib MYDLL EXP 516 02-17-03 20:49 MyDll.exp 6 file(s) 6,879 bytes 0 dir(s) 2,398,564,352 bytes free
注意:将mydll.inc拷贝到/masm32/include目录下,将mydll.lib拷贝到/masm32/lib目录下,将mydll.dll拷贝到和程序相同的目录下或...。 ------------------------------------------------------------------- 调用生成的动态链接库,看看效果怎么样吧!
;例:文件名:10.asm ;调用MyDll.dll,看能否正常工作
.386 .model flat,stdcall option casemap:none
include windows.inc
include mydll.inc include masm32.inc include kernel32.inc
includelib mydll.lib includelib masm32.lib includelib kernel32.lib
.data? CharOut db 100 dup(?)
.code start: mov edx,12345678h mov eax,87654321h invoke OutEdxEax,addr CharOut ;用我们自己的程序转换! invoke StdOut,addr CharOut invoke ExitProcess,NULL end start
用EditPlus打开文件10.asm,执行“工具/编译&链接&运行”或直接用“Ctrl+1”,就可看到执行的结果:1311768467139281697,对吗?
 
|