这在PowerPC中意味着什么?

时间:2015-11-06 14:02:04

标签: powerpc

stwu      r1, -32(r1) // 32 bytes of space for this function

mflr      r0     

stw       r0, 36(r1)   //stores link register

stw       r30, 24(r1)   // ??

stw       r31, 28(r1)   // Probably makes space for r31?

mr        r31, r1       // r31 = stack pointer

这是这个函数的开始,在上面的代码中它将r30存储在内存中的某个地方,并且每个函数都以这种方式开始。但是r31和r30都没有在寄存器中保存任何值。存储它有什么意义?

1 个答案:

答案 0 :(得分:3)

在PowerPC ELF ABI中,寄存器r14-r31被定义为非易失性 - 它们必须在函数调用中预先设置。因此,如果函数可以覆盖任何这些寄存器的内容,它必须将它们的值保存在函数序言中,并在返回调用者之前恢复它们。

因此,即使您的反汇编函数尚未使用r30和r31,它也需要将它们保存在堆栈中,因此它不会破坏调用函数的非易失性状态。您可能会在函数返回后看到r30和r31的使用情况,以及在函数返回之前还原(从堆栈上的相同位置)。

我假设您的程序符合Power ELF ABI,因为这是定义寄存器使用方式的原因。

有关更多信息,32位版本的Power ELF ABI为http://openpowerfoundation.org/technical/technical-resources/technical-specifications/https://www.power.org/technology-introduction/standards-specifications/