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

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

关键说明

  1. 参数访问逻辑:Windows x64调用约定中,第5、6个参数由调用者按8字节对齐压入栈,MASM的proc定义会自动映射它们的栈位置,无需额外sub rsp,16分配空间。
  2. 栈操作注意事项:直接push e会把e所在的8字节栈内存(包含后续4字节垃圾数据)压入栈,导致值异常。正确做法是先将DWORD参数加载到32位寄存器(自动清空高32位),再用64位寄存器压栈。
  3. 阴影空间要求:32字节阴影空间是Windows x64的强制要求,用于被调用函数保存前4个寄存器参数,必须分配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 11:42:10