A64指令集架构之PCS过程调用标准

Arm架构对通用寄存器的使用几乎没有限制。简而言之,整数寄存器和浮点寄存器都是通用寄存器。然而,如果你希望你的代码与他人编写的代码互动,或者与编译器生成的代码互动,那么你需要就寄存器的使用达成一致的规则。对于Arm架构,这些规则被称为过程调用标准(Procedure Call Standard),或者PCS。

PCS规定了:

  1. 用于将参数传递给函数的寄存器。
  2. 用于将值返回给调用函数(称为调用者caller)的寄存器。
  3. 被调用的函数(称为被调用者callee)可以破坏哪些寄存器。
  4. 被调用者不能破坏哪些寄存器。

考虑一个从main()调用的函数foo():

A64指令集架构之PCS过程调用标准_第1张图片

PCS规定第一个参数传递给X0,第二个参数传递给X1,以此类推,直到X7。任何额外的参数都传递到栈stack上。我们的函数foo()接受两个参数:b和c。因此,b将位于W0,c将位于W1。

为什么是W而不是X?因为这些参数是32位类型,因此我们只需要一个W寄存器。

【注意】:在C++中,X0用于传递指向被调用函数的隐式this指针。

接下来,PCS定义了哪些寄存器可以被破坏,哪些寄存器不能被破

你可能感兴趣的:(ARM架构,ARM安全架构,BTI,分支目标识别,PCS,过程调用标准,caller,callee)