Переменная смещения толчка выдает ошибку 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 msgCaption
push 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 такие разные? Вздох)