You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FASM 64位模式调用winmm.dll触发0xc0000005异常问题排查

问题原因

错误码0xc0000005是内存访问违规,核心原因是64位Windows调用约定的栈对齐要求未被满足:

  • x64 Windows强制规定,调用任何遵循标准约定的系统函数前,栈指针RSP必须保持16字节对齐——很多系统函数内部会依赖movdqa这类只能在16字节对齐内存上执行的SIMD指令。
  • 系统启动64位PE程序并调用入口点start时,会先向栈中压入一个8字节的返回地址,导致此时RSP的偏移量为8字节,破坏了16字节对齐状态。
  • 你的代码直接在入口点调用mixerGetNumDevs,未修正栈对齐问题,触发了函数内部的内存访问违规。

32位Windows没有强制16字节栈对齐的要求,因此32位版本的程序可以正常运行。

修复方法

在入口点调用任何函数前,先调整RSP到16字节对齐状态,同时预留x64调用约定要求的32字节影子空间(供被调用函数使用):

format PE64 GUI 5.0

entry start

include 'win64a.inc'

section '.code' code readable executable 
start: 
    sub rsp, 40  ; 8字节对齐调整 + 32字节影子空间,合计40字节
    invoke mixerGetNumDevs 
    invoke ExitProcess

section '.idata' import data readable 
library kernel, 'kernel32.dll', wmm, 'winmm.dll'
import kernel, ExitProcess, 'ExitProcess'
import wmm, mixerGetNumDevs, 'mixerGetNumDevs' 

内容的提问来源于stack exchange,提问作者Memnon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 15:03:20