Trao đổi với tôi

http://www.buidao.com

7/21/09

[MASM] Dynamic Link Library in ASM

Dynamic Link Library in ASM
Link: http://nhatphuongle.spaces.live.com/blog/cns!320FF19317F0C9A2!548.entry
Nếu bạn lập trình đủ lâu, thì bạn nhận thấy rằng các chương trình mà trước đây bạn viết thường có những đoạn code giống nhau, nó thường là các thủ hàm (routines). Nó giúp bạn tiết kiệm thời gian tránh phải viết lại mỗi khi bắt đầu viết một chương trình mới. Trở lại thời lập trình trên nền DOS, những hàm thường xuyên được gọi sử dụng, sẽ được lưu trữ trong tập tin đối tượng (.OBJ, .LIB, .RES). Khi bạn muốn sử dụng các hàm này, bạn chỉ liên kết tới tập tin đối tượng này, sau đó trình liên kết sẽ extract các hàm này và nhúng nội dung của hàm vào tập tin EXE. Tiến trình này được gọi là liên kết tĩnh. Các thư viện lúc biên dịch trong ngôn ngữ lập trình C là ví dụ dễ thấy nhất.

Liên kết tĩnh không hiệu quả bởi vì đoạn mã để thực thi một hàm thường phải nhúng nhiều lần vào các tập tin .EXE khác nhau. Không gian đĩa cứng của bạn sẽ tốn nhiều bộ nhớ để lưu trữ các bản sao của hàm. Tuy nhiên, phương pháp này có thể chấp nhận được bởi vì thường chỉ có một chương trình được gọi thực thi trên bộ nhớ. Tuy nhiên, dưới nền tảng Windows thì việc tiết kiệm bộ nhớ được quan tâm hơn bởi vì có thể có nhiều chương trình chạy cùng lúc. Lúc này, bộ nhớ được chia nhau sử dụng bởi các chương trình, và nếu như chương trình bạn càng lớn thì nó sẽ “ngốn” bộ nhớ càng nhiều. Windows đã đưa ra hướng giải quyết cho vấn đề này là thư viện liên kết động. Windows sẽ không nạp các bản sao của một DLL lên bộ nhớ vì thế thậm chí có nhiều thể hiện của chương trình đang chạy cùng 1 lúc, cũng chỉ có duy nhất một bản sao của DLL mà chương trình đang sử dụng được nạp lên bộ nhớ.

Tôi giải thích rõ hơn cho bạn hiểu. Thực ra, tất cả các tiến trình đều sử dụng chung một DLL, mà DLL này chính là bản sao của chính nó. Điều này thì tương tự như là có nhiều bản sao của DLL trong bộ nhớ. Nhưng trong thực tế, Windows sẽ “thực hiện” điều này bằng cách phân trang bộ nhớ và tất cả các tiến trình sẽ chia sẻ mã nguồn của cùng 1 DLL. Vì thế trong bộ nhớ vật lý, chỉ có duy nhất một bản sao của mã nguồn DLL. Tuy nhiên, mỗi tiến trình sẽ có một section dữ liệu của DLL cho riêng nó.


DLL Skeleton.asm
.386
.model flat,stdcall
option casemap:none

include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

DllEntry proc hInstance:HINSTANCE,reason:DWORD, reserved1:DWORD
...
mov eax,TRUE
ret
DllEntry Endp

Function proc
...
ret
Function endp

End DllEntry

Download Tut+ Source": http://www.mediafire.com/?mwltyyhdzyj