第一: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时应该注意 |