2009-11-04 3 views
0

Я попытались скомпилировать следующий .asm файл в VS2008 (как часть пустого Win32 DLL проект, к которому я добавил этот единственный файл .asm):предупреждения LNK4086 и отсутствуют дллы EntryPoint в VS2008 ассемблерной сборки

.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: EntryPoint '_start' не __stdcall с 12 байт аргументов; изображение может не работать

Однако создается .dll.

При попытке использовать эту DLL я получаю исключение, потому что «Не удалось найти Entrypoint CPUIDIsSupported в DLL»

Но теперь вот кикер:

Если я компилирую точно такой же файл ассемблера в MASM32, Я все еще получаю LNK4086, но dll можно правильно вызвать.

Я хотел бы включить файл asm в мое решение VS2008 и построить его там вместо того, чтобы использовать MASM32. Поэтому я хотел бы знать, что мне нужно изменить для моего процесса сборки, чтобы получить рабочую DLL. Также мне интересно узнать, как я могу создать 64-разрядную версию DLL из VS2008.

ответ

0

Изменение end start до end DllEntry должно устранить проблемы. VS2008 имеет намного более новую версию ML к той, которая включена в MASM32, и может быть более строгой относительно точки входа.

DllEntry и start на самом деле одна и та же точка, поэтому код работает. Я бы предположил, что когда появляется предупреждение, в заголовке PE фактически не указана точка входа.