汇编中的返回值和参数

问题描述 投票:0回答:1

我从来没有遇到过组装本身的问题。我唯一的问题是我不明白参数如何在函数中传递以及它们如何返回。

我们来说吧

PUBLIC AddNumber
AddNumber PROC
   MOV RAX, RCX
   ADD RAX, RDX
   RET
AddNumber ENDP
END

我知道前 2 个参数被传递给 ecx 和 edx,但是 ebx 是做什么用的? 如果我调用像 KeRaiseIrqlToDpcLevel 这样的官方 microsofz 函数,它也会将 KIRQL 返回到 RAX 吗?

windows assembly kernel masm calling-convention
1个回答
0
投票

调用函数的方式,包括参数传递和返回值,取决于每个系统“调用约定

这称为约定,因为当您既是函数的作者又是函数的调用者时,您可以根据手头的指令集执行任何操作。

换句话说,如果您的函数在堆栈中查找参数,并且调用函数将它们放在那里,那么通常一切都会正常工作。

但是,如果这不是目标系统上的争用,则会导致问题。一些值得注意的是:

  • 当询问“此函数的参数 X 的值是多少?”时,调试器等工具会给出不正确的结果
  • 使用你的代码的人可能会认为你正在使用约定,并且对为什么它不起作用感到困惑。
  • 如果你混淆了调用者/调用者清理,你最终会遇到内存泄漏等错误。
  • 如果您不是该函数的作者,就像
    KeRaiseIrqlToDpcLevel
    一样,您需要了解他们的约定才能使用它。

这是人们经常坚持特定系统的调用约定的原因之一。

鉴于您正在谈论

RAX
并且您正在谈论 Windows 功能,我假设您正在为 x86_64 Windows 系统构建。这将使该页面与您相关:

通过 RAX 返回可容纳 64 位的标量返回值,包括 __m64 类型。非标量类型(包括浮点型、双精度型)和向量类型(例如 __m128、__m128i、__m128d)在 XMM0 中返回。 RAX 或 XMM0 返回值中未使用位的状态未定义。

我猜测

KIRQL
是某种整数类型 <= 8 bytes in size, so I would expect it to be in the
RAX
按惯例注册,是的。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.