我是汇编语言的新手,我正在尝试编写一个简单的程序,以使用MASM64在64位汇编语言中生成带有一些文本的弹出窗口。我在https://www.bigmessowires.com/2015/10/06/assembly-language-windows-programming/找到了32位版本,并且一直在尝试使其适应64位汇编。
使用ml.exe可以很好地编译32位原始文件,但是使用ml64当然会产生错误。到目前为止,我已经开始删除了.686
.model flat stdcall
,最后将End Main
更改为END
,并将push eax
更改为{{1} }。
到目前为止,这是我的代码:
push rax
但是,第11和12行(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
push offset msgCaption
)继续产生此错误push offset msgText
。
我到处都看过,找不到为什么这行不通。在x64中我需要做些什么?
(我在Windows 10,Visual Studio 2017中。)
更新:
我将error A2070:invalid instruction operands
更改为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
并得到此链接器错误...
test64.obj:错误LNK2001:无法解析的外部符号MessageBoxA @ 16
test64.obj:错误LNK2001:无法解析的外部符号ExitProcess @ 4
链接:错误LNK2001:无法解析的外部符号WinMainCRTStartup
test64.exe:致命错误LNK1120:3个未解决的外部组件
我包含了kernel32.lib和user32.lib,显然64位版本具有相同的名称。如果有帮助,我正在使用“ VS 2017 x64本机工具命令提示” ...
更新2:
通过查看重复链接中的代码来修复。 (为什么x86和x64如此不同?叹气)