macOS下DOSBox使用MASM汇编出现ExitProcess相关A2105错误如何解决
错误根本原因
你当前的报错核心是代码与运行环境完全不匹配:
你编写的是32位Windows平台的Win32汇编代码,依赖Windows系统API、32位保护模式语法,但DOSBox搭载的是16位实模式的DOS环境,内置的MASM是面向8086的16位版本,不支持.386平展内存模型、stdcall调用约定、ExitProcess Win32 API、INVOKE伪指令这些语法,汇编时识别不出对应伪指令就会抛出A2105错误。
解决方案
方案1:修改代码适配DOSBox环境(推荐,符合你当前的教程定位)
将代码改为16位DOS兼容的汇编语法,用DOS系统中断替换Win32 API即可,修改后代码如下:
; AddTwo.asm - 16位DOS环境下两数相加示例 .8086 .model small .stack 4096 .code main PROC mov ax, 5 add ax, 6 ; 相加结果存储在AX寄存器中 ; 调用DOS中断退出程序,替代Win32的ExitProcess mov ah, 4Ch int 21h main ENDP END main
修改后执行以下命令汇编运行即可:
- 汇编:
masm AddTwo.asm;末尾分号可跳过后续参数询问 - 链接:
link AddTwo.obj; - 直接运行生成的
AddTwo.exe即可,如需查看计算结果可额外添加DOS中断输出AX寄存器值到屏幕的代码。
方案2:保留原32位代码,更换运行环境
如果你需要运行原版32位汇编代码,无需使用DOSBox,可在mac上直接更换工具链:
- 安装Homebrew后,安装
nasm汇编器、wine运行环境,用nasm汇编为Win32格式目标文件后,用MinGW链接成可执行文件,再通过Wine运行即可 - 也可以直接调整语法为macOS支持的Mach-O格式32位汇编,用clang或gcc直接编译运行
内容的提问来源于stack exchange,提问作者JimmyyyChen
相关产品推荐
相关产品推荐

