Ошибка LNK2001: неразрешенный внешний символ _MessageBox

Я пытаюсь создать программу helloworld, используя только masm, а не masm32 libs. Вот фрагмент кода:

.386
.model flat, stdcall
option casemap :none

extrn MessageBox : PROC
extrn ExitProcess : PROC

.data
        HelloWorld db "Hello There!", 0

.code
start:

        lea eax, HelloWorld
        mov ebx, 0
        push ebx
        push eax
        push eax
        push ebx
        call MessageBox
        push ebx
        call ExitProcess

end start

Я могу собрать это с помощью masm:

c:\masm32\code>ml /c /coff demo.asm
Microsoft (R) Macro Assembler Version 9.00.21022.08
Copyright (C) Microsoft Corporation.  All rights reserved.

 Assembling: demo.asm

Однако я не могу связать его:

c:\masm32\code>link /subsystem:windows /defaultlib:kernel32.lib /defaultlib:user
32.lib demo.obj
Microsoft (R) Incremental Linker Version 9.00.21022.08
Copyright (C) Microsoft Corporation.  All rights reserved.

demo.obj : error LNK2001: unresolved external symbol _MessageBox
demo.obj : error LNK2001: unresolved external symbol _ExitProcess
demo.exe : fatal error LNK1120: 2 unresolved externals

Я включаю libs во время связывания, поэтому не уверен, почему он все еще говорит неразрешенные символы?

UPDATE:

c:\masm32\code>link /subsystem:windows /defaultlib:kernel32.lib /defaultlib:user
32.lib demo.obj
Microsoft (R) Incremental Linker Version 9.00.21022.08
Copyright (C) Microsoft Corporation.  All rights reserved.

demo.obj : error LNK2001: unresolved external symbol [email protected]
demo.exe : fatal error LNK1120: 1 unresolved externals

ОБНОВЛЕНИЕ 2: Окончательный рабочий код!

.386
.model flat, stdcall
option casemap :none

extrn [email protected] : PROC
extrn [email protected] : PROC

.data
        HelloWorld db "Hello There!", 0

.code
start:

        lea eax, HelloWorld
        mov ebx, 0
        push ebx
        push eax
        push eax
        push ebx
        call [email protected]
        push ebx
        call [email protected]

end start

Ответ 1

Правильными именами функций являются [email protected] и [email protected].

Почти все функции API Win32 являются stdcall, поэтому их имена украшены знаком @, за которым следует количество принятых байтов по их параметрам.

Кроме того, когда функция Win32 принимает строку, существует два варианта: один, который принимает строку ANSI (имя заканчивается на A), и когда используется строка Unicode (имя заканчивается на W). Вы поставляете строку ANSI, поэтому вам нужна версия A.

Когда вы не программируете в сборке, компилятор заботится о них для вас.

Ответ 2

Попробуйте добавить это до сегмента .data:

include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib