2015-11-06 124 views
1
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都不在寄存器中保存任何值。存儲它有什麼意義?這在PowerPC中意味着什麼?

+0

也許堆棧幀設置。 r30和r31可能是返回參數。 – Chet

+0

@Chet r30和r31不是返回參數。通常使用r31來安裝堆棧幀。我不知道爲什麼r31收到堆棧指針。關於r30,它在函數的後面肯定會用作局部變量。 @ user3287975您應該查找與'prolog'關鍵字相關的信息。 – amigadev

回答

3

在PowerPC ELF ABI中,寄存器r14-r31被定義爲非易失性 - 它們必須跨函數調用預先保存。所以,如果一個函數可以覆蓋任何這些寄存器的內容,它必須將它們的值保存在函數序言中,並在返回給調用者之前恢復它們。

因此,即使您的反彙編函數尚未使用r30和r31,它仍然需要將它們保存在堆棧中,所以它不會破壞調用函數的非易失性狀態。稍後您可能會在函數中看到r30和r31的用法,以及函數返回之前的還原(從堆棧中的相同位置)。

我假設你的程序符合Power ELF ABI,因爲這是什麼定義你的寄存器是如何使用的。

欲瞭解更多信息,Power ELF ABI爲http://openpowerfoundation.org/technical/technical-resources/technical-specifications/https://www.power.org/technology-introduction/standards-specifications/爲32位版本。