0

我尝试在 VS2008 中编译以下 .asm 文件(作为我添加了这个单个 .asm 文件的空 Win32 dll 项目的一部分):

.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 时出现异常,因为“无法在 dll 中找到入口点 CPUIDIsSupported”

但现在这是踢球者:

如果我在 MASM32 中编译完全相同的 asm 文件,我仍然会得到 LNK4086,但可以正确调用 dll。

我想在我的 VS2008 解决方案中包含 asm 文件并从那里构建它,而不必使用 MASM32。因此,我想知道我需要对构建过程进行哪些更改才能获得工作的 dll。我也很想知道如何从 VS2008 中创建 64 位版本的 dll。

4

1 回答 1

0

更改end starttoend DllEntry应该可以解决问题。VS2008 的 ML 版本比 MASM32 包含的版本更新得多,并且在入口点方面可能更加严格。

DllEntry并且start实际上是同一点,这就是代码运行的原因。我猜想当警告出现时,PE 标头中实际上没有指定入口点。

于 2010-08-16T11:23:01.223 回答