程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 匯編語言 >> 制作動態鏈接庫

制作動態鏈接庫

編輯:匯編語言

現在編程序,不用說,都是在調用別人做好的動態鏈接庫中的函數,能不能編寫自己的動態鏈接庫呢?答案是肯定的!讓我們開始吧!

;-------------------------------------------------------
;例:將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,對嗎?

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved