热门问题
时间线
聊天
视角
调用约定
来自维基百科,自由的百科全书
Remove ads
在计算机科学中,调用约定是一种定义子过程从调用处接受参数以及返回结果的方法的约定。不同调用约定的区别在于:
- 参数和返回值放置的位置(在寄存器中;在调用栈中;两者混合)
- 参数传递的顺序(或者单个参数不同部分的顺序)
- 调用前设置和调用后清理的工作,在调用者和被调用者之间如何分配
- 被调用者可以直接使用哪一个寄存器有时也包括在内。(否则的话被当成ABI的细节)
- 哪一个寄存器被当作volatile的或者非volatile的,并且如果是volatile的,不需要被调用者恢复
架构举例
64-位版本的x86架构,叫做x86-64、x64、AMD64或Intel 64,有两个公用的调用序列。一个调用序列是Microsoft定义的x64调用约定,用于Windows;另一个调用序列规定于System V AMD64 ABI,用于类Unix系统,并在改动后用于OpenVMS。由于x86-64比32-位x86有更多的通用寄存器,两个约定都传递一些实际参数于寄存器之中。
64-位ARM(AArch64)调用约定分配31个通用寄存器为[1]:
- x31 (SP):栈指针或零寄存器,依赖上下文。
- x30 (LR):过程链接寄存器,用于从子例程返回。
- x29 (FP):帧指针。
- x19 至 x28:被调用者保存。
- x18 (PR):平台寄存器。用于某些操作系统特定的特殊功能,或一个额外的调用者保存寄存器。
- x16 (IP0) 和 x17 (IP1):过程调用内(Intra-Procedure-call)暂存(scratch)寄存器。
- x9 至 x15:局部变量,调用者保存。
- x8 (XR):间接返回值地址。
- x0 至 x7:传入的实际参数值和从子例程返回的结果值。
所有以x开始的寄存器都由一个对应的前缀着w的32-位寄存器,比如32-位x0叫做w0。
类似的,32个浮点寄存器被分配为[2]:
- v0 至 v7:传入的实际参数值和从子例程返回的结果值。
- v8 至 v15:被调用者保存,但只有底部64位需要被保持。
- v16 至 v31:局部变量,调用者保存。
参见
参考文献
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads