質問

私は(私はこの単一.ASMファイルを追加するために、空のWin32 DLLプロジェクトの一環として)VS2008で次の.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が適切に呼び出すことができます。

私はVS2008溶液中のasmファイルをインクルードし、代わりにMASM32を使用するので、そこからそれを構築したいと思います。したがって、私は、私が働いてdllファイルを取得するために私のビルドプロセスについて変更する必要があるかを知りたいと思います。また、私は、私はVS2008の中から、DLLの64ビットバージョンを作成する方法を聞いて興味を持っています。

役に立ちましたか?

解決

end startend DllEntryを変更すると、問題を修正する必要があります。 VS2008は、MASM32に含まれているものにMLの多くの新しいバージョンを持っており、それはエントリポイントへに関してより厳密であってもよい。

DllEntrystartは、コードが実行理由である、実際には同じ点です。私は、警告が表示されたら、エントリポイントが実際PEヘッダーに指定されていないことを推測する。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top