gpt4 book ai didi

embedded - ppc32和ppc64函数栈计算

转载 作者:行者123 更新时间:2023-12-05 07:15:38 28 4
gpt4 key购买 nike

我正在研究 ppc32 和 ppc64 架构来为我的编译器实现一个新的后端,但是我对一个函数的序言有疑问,我已经阅读了几个关于 PowerPC 的 IBM 文档,但是我读到的关于堆栈的信息很少.一个程序,以及它是如何工作的。因此,为了更好地理解,我使用 godbolt.org 检查函数的编译方式并注意到以下内容:

一个有4个int类型参数的函数,prolog生成如下代码:

test1(int, int, int, int):
stwu 1,-32(1)
stw 31,28(1)
mr 31,1
stw 3,8(31)
stw 4,12(31)
stw 5,16(31)
stw 6,20(31)

一个函数,有5个int类型的参数,使用代码如下:

test2(int, int, int, int, int):
stwu 1,-48(1)
stw 31,44(1)
mr 31,1
stw 3,8(31)
stw 4,12(31)
stw 5,16(31)
stw 6,20(31)
stw 7,24(31)

具有 10 个 int 类型参数的函数使用以下代码:

test4(int, int, int, int, int, int, int, int, int, int):
stwu 1,-48(1)
stw 31,44(1)
mr 31,1
stw 3,8(31)
stw 4,12(31)
stw 5,16(31)
stw 6,20(31)
stw 7,24(31)
stw 8,28(31)
stw 9,32(31)
stw 10,36(31)

我注意到对于 4 参数和 5 参数函数,堆栈偏移量的计算在以下指令中发生了变化。

    ; 4 parameters
stwu 1,-32(1)
stw 31,28(1)

; 5 parameters
stwu 1,-48(1)
stw 31,44(1)

但在 10 参数函数中,偏移量与 5 参数函数相同,仅使用 8 条“stw”指令加载参数,其余参数稍后使用“lwz”指令加载

为什么会这样?我认为它是堆栈上的东西,但是什么?

PS.: 我在这个问题中展示的汇编代码是由 GCC 4.8.5 PowerPC 生成的

最佳答案

你提到:

only 8 'stw' instructions were used to load the parameters

-但这不是加载参数的代码。根据 ELF ABI,参数已经在寄存器 r3-r10 中,因为这就是它们传递给函数的方式。

相反,那些 stw 指令将函数参数存储到堆栈中。目前尚不清楚为什么编译器在没有可用函数代码的情况下将参数复制到堆栈,但假设您的函数很简单,我猜您禁用了优化,因此它会将所有内容保存到堆栈帧。

8 参数和 10 参数版本在序言中没有区别的原因是只有前 8 个参数是通过寄存器传递的。任何进一步的参数都传递到调用者的堆栈,并通过 lwz 指令加载。

您应该阅读 ELF ABI specification对于 ppc,它定义了函数调用序列(第 3-14 节)等。虽然您没有指定要针对哪个 ABI 规范进行编译,但在这方面与 ELF 规范应该不会有太多差异。

关于embedded - ppc32和ppc64函数栈计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59557799/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com