“ push offset variable”在MASM64上产生“错误A2070:无效的指令操作数”

时间:2019-01-02 21:44:27

标签: assembly 64-bit masm64

我是汇编语言的新手,我正在尝试编写一个简单的程序,以使用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如此不同?叹气

0 个答案:

没有答案