当前位置: 代码迷 >> 汇编语言 >> 32位ASM代码,怎么改编为64位,并编译DLL
  详细解决方案

32位ASM代码,怎么改编为64位,并编译DLL

热度:440   发布时间:2016-05-02 04:48:11.0
32位ASM代码,如何改编为64位,并编译DLL?
本帖最后由 AhBian 于 2013-10-02 12:04:57 编辑
以下一段是32位ASM代码
 .386
 .model flat
 
option prologue:none
 option epilogue:none
 option dotname
 
.code
 align DWORD
 DllMain     proc    stdcall public, instance:DWORD, reason:DWORD, reserved:DWORD
         mov     eax, 1  ; success
         ret 12
 DllMain     endp
 
align DWORD
 InvokeFunc proc stdcall public, funcptr:DWORD
 
pop ecx ; save return address
 pop edx ; Get function pointer
 push ecx ; Restore return address
 jmp edx ; Transfer control to the function pointer
 InvokeFunc endp
 
end
 
但编译后的 DLL 不能运行于Win7/64位系统中.
所使用的编译文件内容如下:
 
MLFLAGS = /c /coff /Cp /Fl /Sc /Sg
 
All: Invoke.dll UnitTest.exe
 
Clean: 
[email protected] exist Invoke.obj erase Invoke.obj
[email protected] exist Invoke.dll erase Invoke.dll
[email protected] exist Invoke.lib erase Invoke.lib
[email protected] exist Invoke.exp erase Invoke.exp
[email protected] exist Invoke.lst erase Invoke.lst
[email protected] exist UnitTest.exe erase UnitTest.exe
 
Invoke.obj: Invoke.asm
         ml $(MLFLAGS) $**
 
Invoke.dll: Invoke.obj
 link $** -DLL -entry:DllMain /machine:i386 /subsystem:windows /out:Invoke.dll /export:InvokeFunc
 
UnitTest.exe: UnitTest.cs
 csc $**
 

有关详细信息,来自 CodeProject:
 http://www.codeproject.com/Articles/1557
 
请大拿们帮助解决一下如何编译成一个可在64位上运行的 DLL。 
64位 asm 32位

------解决方案--------------------
试试:

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下
  相关解决方案