第一:VC寫Dll 供asm調用
Dll: BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {return TRUE;} extern "C" int sortBuf(char* pBuf) {…函數實現} DEF: EXPORTS sortBuf @1 編譯後生成xx.dll 和對應的xx.lib文件 |
Asm調用 關鍵1: Includelib xx.lib 關鍵點2: sortBuf proto C :DWORD 調用invoke sortBuf,offset g_StrBuf
總結 最主要的有以下幾點 1:dll與調用模塊命名約定和函數的調用約定要相同 一般dll中在函數前用extern "C"修飾 , 2:如果在dll中使用__cdcel調用約定 則在asm中聲明時需要用 C 修飾 因爲asm中通過.model flat,stdcall 說明了默認的調用約定爲__stdcall 3:asm中包含xx.lib頭文件 |
第二:asm生成dll
Asm Dll ;ASM版彙編 .386 .model flat,stdcall option casemap:none
include windows.inc include user32.inc include kernel32.inc
includelib User32.lib includelib kernel32.lib
.code ;DllMain必須的 而且 end DllMain也是必須的 DllMain proc hModule:DWORD,ul_reason_for_call:DWORD,lpReserved:DWORD ret DllMain endp
;導出函數 ShowMsg proc lpText:DWORD,lpCaption:DWORD invoke MessageBox,NULL,lpText,lpCaption,MB_OK ShowMsg endp
end DllMain
Def文件 EXPORTS ShowMsg @1 鏈接後產生.dll和.lib文件 |
關鍵部分 :ASMdll.asm 編譯後 Asmdll.obj 與asmdll.def的鏈接語句如下 link32 /DLL /subsystem:windows /def:asmdll.def asmdll.obj 注意:asm默認生成的函數是__stdcall約定 所以在使用dll時應該注意 |