我从来没有遇到过组装本身的问题。我唯一的问题是我不明白参数如何在函数中传递以及它们如何返回。
我们来说吧
PUBLIC AddNumber
AddNumber PROC
MOV RAX, RCX
ADD RAX, RDX
RET
AddNumber ENDP
END
我知道前 2 个参数被传递给 ecx 和 edx,但是 ebx 是做什么用的? 如果我调用像 KeRaiseIrqlToDpcLevel 这样的官方 microsofz 函数,它也会将 KIRQL 返回到 RAX 吗?
调用函数的方式,包括参数传递和返回值,取决于每个系统“调用约定。
这称为约定,因为当您既是函数的作者又是函数的调用者时,您可以根据手头的指令集执行任何操作。
换句话说,如果您的函数在堆栈中查找参数,并且调用函数将它们放在那里,那么通常一切都会正常工作。
但是,如果这不是目标系统上的争用,则会导致问题。一些值得注意的是:
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
按惯例注册,是的。