我试图编译在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

代码最初发布这里

当我建立我得到一个警告:

警告LNK4086:入口点 '_start' 不与12个字节的参数__stdcall;图像可能无法运行

然而,生成的.dll。

在尝试使用该DLL,我得到一个例外,因为“无法找到入口点CPUIDIsSupported在DLL”

但是,现在在这里是踢球者:

如果我编译正是在MASM32同ASM文件,我仍然得到LNK4086但该dll可以正常调用。

我想包括在我的VS2008溶液中的ASM文件,并从那里,而不必使用MASM32的建立它。因此,我想知道我需要什么,为了得到工作的DLL来改变我的构建过程。我也很感兴趣地听到我如何从VS2008中创建DLL的64位版本。

有帮助吗?

解决方案

更改end startend DllEntry应该修正的问题。 VS2008具有ML得多的较新版本包含MASM32的一个并且它可以是更严格与问候到入口点。

DllEntry start实际上是相同的点,这就是为什么代码运行。我猜想,警告出现时没有入口点在PE头实际上是指定。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top