Embedded ppc32和ppc64函数堆栈计算

Embedded ppc32和ppc64函数堆栈计算,embedded,powerpc,Embedded,Powerpc,我正在研究ppc32和ppc64体系结构,以便为我的编译器实现一个新的后端,但是我对函数的序言有疑问,我已经阅读了一些关于PowerPC的IBM文档,但是我很少阅读有关堆栈的信息。以及它是如何工作的。 为了更好地理解,我使用godbolt.org检查函数是如何编译的,并注意到以下几点: 一个具有4个int类型参数的函数,为prolog生成以下代码: test1(int, int, int, int): stwu 1,-32(1) stw 31,28(1)

我正在研究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”指令加载

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

注:我在这个问题中展示的汇编代码是由GCC 4.8.5 PowerPC生成的,您提到:

只有8条“stw”指令用于加载参数

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

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

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

您应该阅读for ppc,其中定义了函数调用顺序(第3-14节),以及其他内容。虽然您没有指定编译所针对的ABI规范,但在这方面与ELF规范不应该有太多的差异