x64汇编中DWORD参数入栈问题:6个int参数传递报错求助
Windows x64汇编处理栈上DWORD参数的问题解决
你遇到的invalid instruction operands错误,根源是x86/x64架构不支持内存到内存直接mov的指令。代码里mov DWORD PTR [rsp + 20h], e试图把栈内存中的参数e直接复制到另一个栈内存位置,这属于非法操作,必须通过寄存器中转实现。
结合Windows x64调用约定,以下是修正后的代码和关键说明:
修正后的代码示例
.code myProc1 proc a:DWORD, b:DWORD, c:DWORD, d:DWORD, e:DWORD, f:DWORD push rbp mov rbp, rsp sub rsp, 32 ; 分配Windows x64要求的32字节阴影空间 ; 1. 读取e和f的值到寄存器 mov eax, e ; 将栈上的DWORD参数e加载到EAX mov ecx, f ; 将栈上的DWORD参数f加载到ECX ; 2. 若需将e/f保存到自定义栈区域 mov DWORD PTR [rsp + 0], eax ; 把e的值存入阴影空间起始位置 mov DWORD PTR [rsp + 4], ecx ; 把f的值存入下一个DWORD位置 ; 3. 若需将e/f压栈(比如给其他函数传参) mov eax, e push rax ; 先将DWORD的e零扩展为QWORD(RAX),再压栈,符合x64栈对齐要求 mov eax, f push rax mov rsp, rbp pop rbp ret myProc1 endp end
关键说明
- 参数访问逻辑:Windows x64调用约定中,第5、6个参数由调用者按8字节对齐压入栈,MASM的
proc定义会自动映射它们的栈位置,无需额外sub rsp,16分配空间。 - 栈操作注意事项:直接
push e会把e所在的8字节栈内存(包含后续4字节垃圾数据)压入栈,导致值异常。正确做法是先将DWORD参数加载到32位寄存器(自动清空高32位),再用64位寄存器压栈。 - 阴影空间要求:32字节阴影空间是Windows x64的强制要求,用于被调用函数保存前4个寄存器参数,必须分配。
内容的提问来源于stack exchange,提问作者kaczuha
相关产品推荐
相关产品推荐

