【问题标题】:in winapi __stdcall on x86, what register is 2nd paramter in?在 x86 上的 winapi __stdcall 中,第二个参数在哪个寄存器中?
【发布时间】:2015-02-15 07:42:51
【问题描述】:

在 x86 上的 winapi __stdcall 中,第二个参数存储在哪个寄存器中? (ECX?) - 另外,我知道在哪里可以找到一些关于此的文档吗?

【问题讨论】:

  • 我认为参数存储在堆栈中,而不是 stdcall 的寄存器。
  • 文档:msdn.microsoft.com/library/zxk0tw93.aspx。参数存储在堆栈中(由[ESP][EBP] 引用)。注意:Win64 的调用约定有很大不同!
  • @rkhb 哦,在堆栈上,谢谢!您可以添加它作为答案吗?个人注意,如果我想访问第二个参数,它是 DWORD PTR SS:[esp-4] ?
  • 或者-4*参数可能
  • 我知道,我在文档中看到它并且我可以使用它,但我无法证明它令我满意 - 所以让它作为评论。对参数的访问取决于“序言”和当前位置(在调用者内部或被调用者内部)。显示代码;-)

标签: assembly x86 stdcall


【解决方案1】:

对于 stdcall,参数存储在堆栈中,然后由被调用者删除它们。
第一个参数将在 [esp+4]
[esp+8]处的第二个参数
函数/被调用者的每次推送都会使这些对 ESP 的偏移量更大。

使用push ebpmov ebp,esp 的默认序言,第一个参数将位于 [ebp+8],第二个参数位于 [ebp+12]。

【讨论】:

    猜你喜欢
    • 2017-04-23
    • 2020-09-16
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    相关资源
    最近更新 更多