在 macOS 上使用 dosbox 的 MASM 中的 ExitProcess 错误
Posted
技术标签:
【中文标题】在 macOS 上使用 dosbox 的 MASM 中的 ExitProcess 错误【英文标题】:ExitProcess error in MASM using dosbox on macOS 【发布时间】:2021-09-17 10:11:27 【问题描述】:我是汇编语言的新手,我想在 macOS 的 dosbox 上运行一个 asm 程序
我遵循以下说明: Install MASM 8086 DOSBOX(Run Microprocessors program) on MAC OSX
这是我要运行的 asm 代码:
; AddTwo.asm - adds two 32-bit integers
.386
.model flat,stdcall
.stack 4096
ExitProcess PROTO, dwExitCode:DWORD
.code
main PROC
mov eax,5
add eax,6
INVOKE ExitProcess,0
main ENDP
END main
我在dosbox上组装,然后出现错误:
addtwo.ASM(7):错误 A2105:预期:指令或指令
addtwo.ASM(14):错误 A2105:预期:指令或指令
dosbox screenshot
退出过程似乎效果不佳,但我不知道出了什么问题以及如何解决。
请帮忙!
【问题讨论】:
这看起来像一个 Windows,而不是一个 DOS 程序。你是从哪里弄来的? 我认为 ExitProcess 是一个 WinAPI Windows 函数,而不是 DOS。如果你想在 MacOS 上运行这样的代码,你需要 WINE 来运行 Windows 二进制文件,而不是 DOSBox 来运行 DOS 二进制文件。当然,您必须将其组装 + 链接到 Windows.exe
。最好为您真正想学习的 asm 找到教程,可能是 Mac 上的原生 x86-64 或 ARM64 asm。
无论如何,原型声明看起来是错误的。应该是ExitProcess PROTO STDCALL :DWORD
。此外,您必须链接到 kernel32.lib。但正如其他人所指出的,这将是 Windows 可执行文件,而不是 DOS 可执行文件。
Windows 使用 PE 可执行文件,而 DOS 使用较旧的 MZ 可执行文件。但更根本的是,内存模型以及您通过代码与操作系统交互的方式在两个操作系统之间是不同的。您必须选择其中一个,并使用合适的工具链和运行时环境。
哦,对了,现代 MacOS 放弃了对过时的 32 位用户空间的支持,所以可能不仅仅是缺少原生库,甚至 WINE 也无法使用兼容模式。如果你想编写 32 位 Windows 程序,你可能需要一个虚拟机或模拟器(使用 Linux + WINE 来支持 MASM + Irvine32,甚至是真正的 Windows。)当然,你可以选择另一本书而不是那些古怪的书Irvine32 玩具库函数。 MASM 在某些方面有点过于复杂,其“高级”功能(例如 INVOKE)会隐藏您尝试学习的 asm 详细信息。
【参考方案1】:
从您的screenshot,它正在运行 MASM v5.0,并且在 MASM v6.0 之前未添加 INVOKE 关键字
代替INVOKE,尝试使用 CALL 指令的老式代码
push 0
call ExitProcess
【讨论】:
以上是关于在 macOS 上使用 dosbox 的 MASM 中的 ExitProcess 错误的主要内容,如果未能解决你的问题,请参考以下文章