我尝试用VS2008编译以下.asm文件(作为一个空的Win32 dll项目的一部分,我将这个单独的.asm文件添加到该项目中):
.386
.model flat, stdcall
option casemap:none
TRUE equ 1
.code
start:
DllEntry proc instance:DWORD, reason:DWORD, reserved:DWORD
mov eax, TRUE
ret
DllEntry endp
CPUIDIsSupported proc uses ebx edx
mov eax, 0
pushfd
pop eax ; Get EFLAGS to EAX
mov ecx, eax ; Preserve it in ECX
xor eax, 200000h ; Check if CPUID bit can toggle
push eax
popfd ; Restore the modified EAX
; to EFLAGS
pushfd ; Get the EFLAGS again
pop ebx ; to EBX
xor eax, ebx ; Has it toggled?
and eax, 200000h
jnz __not_supported ; No? CPUID is not supported
mov eax, 1
jmp _ciis_ret_ ; Yes? CPUID is supported
__not_supported:
xor eax, eax
_ciis_ret_:
push ecx ; Restore the original EFLAGS
popfd
ret
CPUIDIsSupported endp
.586
__cpuid proc stdcall public uses ebx edi __funcNumber:dword, __eax:dword, __ebx:dword, __ecx:dword, __edx:dword
; Must be 80586 and above
call CPUIDIsSupported
dec eax
jz _cpuid_begin_
; No CPUID instruction
xor eax, eax
jmp _cpuid_ret_
_cpuid_begin_:
mov eax, __funcNumber
cpuid
mov edi, __eax
mov dword ptr [edi], eax
mov edi, __ecx
mov dword ptr [edi], ecx
mov edi, __edx
mov dword ptr [edi], edx
mov edi, __ebx
mov dword ptr [edi], ebx
mov eax, 1
_cpuid_ret_:
ret
__cpuid endp
end start代码最初发布在HERE上。
当我构建的时候,我得到了一个警告:
警告LNK4086:入口点'_start‘不是具有12个字节参数的__stdcall;映像可能无法运行
但是,会生成一个.dll。
当尝试使用该dll时,我得到一个异常,因为“无法在dll中找到入口点CPUIDIsSupported”
但现在关键是:
如果我用MASM32编译完全相同的asm文件,我仍然会得到LNK4086,但是dll可以被正确地调用。
我希望将asm文件包含在我的VS2008解决方案中,并从那里构建它,而不必使用MASM32。因此,我想知道我需要对构建过程进行哪些更改才能获得工作的dll。另外,我很想知道如何在VS2008中创建64位版本的动态链接库。
发布于 2010-08-16 19:23:01
将end start更改为end DllEntry应该可以解决这些问题。与MASM32附带的ML相比,VS2008有一个更新得多的ML版本,它可能对入口点有更严格的要求。
DllEntry和start实际上是同一个点,这就是代码运行的原因。我猜想当警告出现时,实际上没有在PE头中指定入口点。
https://stackoverflow.com/questions/1674220
复制相似问题