Переменная смещения толчка выдает ошибку A2070: недопустимые операнды команд на MASM64

Я новичок в сборке, и я пытаюсь написать простую программу для создания всплывающего окна с текстом в 64-битной сборке, используя MASM64. Я нашел 32-разрядную версию по адресу https://www.bigmessowires.com/2015/10/06/assembly-language-windows-programming/ и пытался адаптировать ее для 64-разрядной сборки.

32-битный оригинал прекрасно компилируется с ml.exe, но, конечно, выдает ошибки с ml64. Пока я удалил .686.model flat stdcall в начале поменял End Main в конце ENDи изменил push eax в push rax,

Это мой код до сих пор:

EXTERN MessageBoxA@16 : proc
EXTERN ExitProcess@4 : proc

.const
msgText db 'YES IT FINALLY WORKS!!!', 0
msgCaption db 'Hello World', 0

.code
Main:
push 0
push offset msgCaption
push offset msgText
push 0
call MessageBoxA@16
push rax
call ExitProcess@4

END

Тем не менее, строки 11 и 12 (push offset msgCaptionpush offset msgText) продолжайте выдавать эту ошибку error A2070:invalid instruction operands,

Я искал везде и не могу найти, почему это не работает. Что мне нужно сделать по-другому в x64?

(Я нахожусь на Windows 10, Visual Studio 2017.)


ОБНОВИТЬ:

Я изменился push offset var в mov rax, offset var | puah rax и это скомпилировалось нормально, а затем я перешел на соглашение о быстрых вызовах, как упомянуто в комментариях.

EXTERN MessageBoxA@16 : proc
EXTERN ExitProcess@4 : proc

.const
msgText db 'YES IT FINALLY WORKS!!!', 0
msgCaption db 'Hello World', 0

.code
WinMainCRTStartup: ;fast calling convention...
mov rcx, 0
mov rdx, offset msgText
mov r8, offset msgCaption
mov r9, 0
sub rsp, 32
call MessageBoxA@16
mov rcx, rax
sub rsp, 32
call ExitProcess@4

END

Но я пытаюсь связать это с
link /subsystem:windows /out:test64.exe kernel32.lib user32.lib test64.obj
и получить эту ошибку компоновщика...

test64.obj: ошибка LNK2001: неразрешенный внешний символ MessageBoxA @ 16
test64.obj: ошибка LNK2001: неразрешенный внешний символ ExitProcess@4
ССЫЛКА: ошибка LNK2001: неразрешенный внешний символ WinMainCRTStartup
test64.exe: фатальная ошибка LNK1120: 3 неразрешенных внешних кода

Я включил kernel32.lib и user32.lib, и, очевидно, 64-битные версии имеют одно и то же имя. Я использую "x64 Native Tools Cmd Prompt для VS 2017", если это поможет...


ОБНОВЛЕНИЕ 2:

Исправлено, глядя на код в дубликате ссылки. (Почему x86 и x64 такие разные? Вздох)

0 ответов

Другие вопросы по тегам