制作动态链接库

现在编程序,不用说,都是在调用别人做好的动态链接库中的函数,能不能编写自己的动态链接库呢?答案是肯定的!让我们开始吧!

;-------------------------------------------------------
;例:将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,对吗?

时间: 2024-10-12 10:15:00

制作动态链接库的相关文章

Linux下C编程:关于动态链接库

在上篇文章中,是对静态链接库的介绍,其实有了上面的介绍动态链接库的制作就简单了,这篇来制作动态链接库~~~ 创建动态链接库: #gcc –shared –Wall –fPIC bar.o foo.o –olibfoobar.so 或手动指定库路径 $ gcc -o foobar main.c-llt -B /path/to/lib 这里的-B 选项就添加 /path/to/lib 到gcc搜索的路径之中.这样链接没有问题但是方法II中手动链接好的程序在执行时候仍旧需要指定库路径(链接和执行是分开

Linux Debugging(七): 使用反汇编理解动态库函数调用方式GOT/PLT

     本文主要讲解动态库函数的地址是如何在运行时被定位的.首先介绍一下PIC和Relocatable的动态库的区别.然后讲解一下GOT和PLT的理论知识.GOT是Global Offset Table,是保存库函数地址的区域.程序运行时,库函数的地址会设置到GOT中.由于动态库的函数是在使用时才被加载,因此刚开始GOT表是空的.地址的设置就涉及到了PLT,Procedure Linkage Table,它包含了一些代码以调用库函数,它可以被理解成一系列的小函数,这些小函数的数量其实就是库函数

自己在linux上编译、链接、动态库和静态库的学习笔记

在平常的项目中,我们都是使用公司要求的makefile.makedebug一类的文件,因此,在编译.链接.生成和链接动态库与静态库的时候,我们只是简单的使用一些已经设置的变量,只是简单的修改.添加一些文件名,或许这次我们编译通过了,但是,在某一个时候,可能出现了一个问题,无论简单与否,因为平常没有留意,导致的结果可能是花了好长时间才能解决.而如果平常只是简单的留一下心,或许这些问题都是可以避免的. 因此,今天我自己使用几个文件,编译动态库.静态库以及动态库和静态库的嵌套调用等问题,尽量还原我在项

深入浅出剖析C语言函数指针与回调函数(一)

关于静态库和动态库的使用和制作方法. http://blog.csdn.net/morixinguan/article/details/52451612 今天我们要搞明白的一个概念叫回调函数. 什么是回调函数? 百度的权威解释如下: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应.

动手制作属于你自己的WIN PE3.0

最近想要更新公司的网Ghost系统,所以小研究一下win pe ,在网上看见一个很不错的教程,在这里分享给大家! 并非原创,纯属转载!!O(∩_∩)O~天缘的作品,很是佩服这个哥们啊..... 一.WINPE制作准备1.操作系统必须是Windows 2003/2008/2008 R2/Vista/Windows 7中的一种,其中Windows 2003和Windows 2008必须至少打上SP1,另外如果要跨体系部署,则仅支持32位WINPE对x64(AMD64)的Windows版本进行跨体系部

使用VC++6.0制作ASP服务器控件简介

c++|服务器|控件 用ASP写网页的程序员,一定对VBSript语句"Set Conn=Server.Object('ADODB.Connection')"非常熟悉.该语句是利用ASP的Server对象创建了一个数据库控件,它提供了一系列的方法和属性,可以帮助我们在ASP中方便的实现数据库的操作.类似的,在Visual InteDev6.0中,我们还可以看到一些ASP的内置组件如"Scripting.FileSystemObject".但是,在有的场合,仅利用这些

c++-C++/MFC调用动态链接库DLL

问题描述 C++/MFC调用动态链接库DLL 我用MFC制作了一个DLL动态链接库,然后用另外一个MFC程序区调用它,但是没有效果.其程序如下: 制作一个MFC生成DLL程序,改DLL内部封装了一个函数.如下(.cpp文件): int sum(int a,int b) { char temp[200]; itoa((a+b),temp,10); CString c; c=temp; MessageBox(NULL,c,"提示",0); return a+b; } 调用DLL的代码为:

c++ mfc-MFC调用DLL动态链接库

问题描述 MFC调用DLL动态链接库 我用MFC制作了一个DLL动态链接库,然后用另外一个MFC程序区调用它,但是没有效果.其程序如下: 制作一个MFC生成DLL程序,改DLL内部封装了一个函数.如下(.cpp文件): int sum(int a,int b) { char temp[200]; itoa((a+b),temp,10); CString c; c=temp; MessageBox(NULL,c,"提示",0); return a+b; } 调用DLL的代码为: 在预编译

LINUX系统中动态链接库的创建与使用

大家都知道,在WINDOWS系统中有很多的动态链接库(以.DLL为后缀的文件,DLL即Dynamic Link Library).这种动态链接库,和静态函数库不同,它里面的函数并不是执行程序本身的一部分,而是根据执行程序需要按需装入,同时其执行代码可在多个执行程序间共享,节省了空间,提高了效率,具备很高的灵活性,得到越来越多程序员和用户的青睐.那么,在LINUX系统中有无这样的函数库呢? 答案是肯定的,LINUX的动态链接库不仅有,而且为数不少.在/lib目录下,就有许多以.so作后缀的文件,这