欢迎来到Doc100.Net免费学习资源知识分享平台!
您的位置:首页 > 程序异常 >

32位asm代码,怎么改编为64位,并编译dll

更新时间: 2014-01-05 03:16:41 责任编辑: Author_N1

 

32位ASM代码,如何改编为64位,并编译DLL?

--参考方法--
试试:

HINSTANCE typedef qword
LPVOID    typedef qword

.code
 align DWORD
 DllMain     proc public, instance: HINSTANCE, reason: DWORD, reserved: LPVOID
         mov     rax, 1  ; success
         ret
 DllMain     endp
  
align DWORD
 InvokeFunc proc public, funcptr: LPVOID
         jmp rcx ; Transfer control to the function pointer
 InvokeFunc endp
  
end

--参考方法--
因为Dll是32位的,而UnitTest.exe是Net程序,在64位系统下默认是64位的程序,而64位程序不能调用32位DLL……你可以用.config文件来指定UnitTest.exe运行在32位下
--参考方法--
我无法修改上面那个楼层的内容,所以只能再回复一次了
如果修改ASM代码,4楼的代码正确,用64位的ML编译下,另Link参数要修改一下,/machine:x64
下面是4楼的代码,我只是添加个注释帮助楼主理解下(注意.386一定要去掉,.model也去掉)

HINSTANCE typedef qword  ;64位下,Pointer、Handle都为8个字节,即qword
LPVOID    typedef qword
.code
 align DWORD
 DllMain     proc public, instance: HINSTANCE, reason: DWORD, reserved: LPVOID
         mov     rax, 1  ; success
         ret
 DllMain     endp
 
align DWORD  
 InvokeFunc proc public, funcptr: LPVOID
         jmp rcx  ;64位下,参数传递分别为--第1个用RCX,第2个用RDX,第3个用r8,第4个用r9,第5+用stack
                  ;所以funcptr参数就是rcx,直接jmp就行了
 InvokeFunc endp
  
end

还有一种方法就是我在楼上所说的,用.config文件指定UnitTest.exe运行在32位的net framework下
上一篇:上一篇
下一篇:下一篇

 

随机推荐程序问答结果

 

 

如对文章有任何疑问请提交到问题反馈,或者您对内容不满意,请您反馈给我们DOC100.NET论坛发贴求解。
DOC100.NET资源网,机器学习分类整理更新日期::2014-01-05 03:16:41
如需转载,请注明文章出处和来源网址:http://www.doc100.net/bugs/t/20312/
本文WWW.DOC100.NET DOC100.NET版权所有。