ASM调用约定

ale*_*nst 11 c x86 assembly x86-64 linux-kernel

我一直在阅读有关在ASM中调用约定的内容,这是我到目前为止的内容:

          x86(userland)    x86(kernel)    x64(userland)    x64(kernel)

1st arg           Stack           EBX               RDI            RDI
2nd arg           Stack           ECX               RSI            RSI
3rd arg           Stack           EDX               RDX            RDX
4th arg           Stack           ESI               RCX            R10
5th arg           Stack           EDI               R8             R8
6th arg           Stack           EBP               R9             R9

result            EAX             EAX               RAX            RAX
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 到目前为止我学到的是正确的吗?

  2. 如何在x86(内核)和x64(两者)中传递6个以上的参数?使用堆栈?介意给我一个小例子?

  3. 我有一个内核模块,我愿意从ASM调用该模块中的函数.我应该使用什么惯例?内核还是用户空间?

gno*_*ule 2

我只针对 x86 编写代码,并且可以为您提供有关该架构的一些反馈(前两列)。

至于 3.,如果它是一个内核函数(而不是一个 libc 函数),您将使用内核约定(您的第 2 列)。

至于 1.,正确,除了您不会使用 ebx 作为第六个参数。传统的函数序言会假设它是实际的 ebp 来推动这个论点。所以截止实际上是 5 个参数。

至于2.,如果你有超过5个参数,你将把它们连续存储在内存中,并在ebx中传递一个指向该内存区域开头的指针。