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都没有在寄存器中保存任何值。存储它有什么意义?
答案 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/。