2017-03-02 33 views
0

在Raspberry Pi上的ARM彙編代碼中,我們可以使用寄存器r1(而不是寄存器r0)來接收第一個函數參數,而只保留函數返回值的寄存器r0?或者必須將前4個功能參數按順序嚴格地存儲在寄存器r0,r1,r2和r3中?ARM彙編中的Raspberry Pi寄存器r0-r4中是否存在嚴格的函數參數存儲序列?

+5

如果是你自己的代碼,你可以做任何你想做的事情。如果您想與第三方代碼進行互操作,您必須明確遵守慣例。來電者如何知道你期望在不同的地方有爭議? – Jester

+0

你*可以*只需要一個未使用的第一個參數(僞參數)。不優雅,但它不會打破平臺ABI。 – EOF

+0

如果在編寫輸出「r0」時需要輸入參數,被調用的例程必須保存「r0」。通常情況並非如此。另一種方法是使用'callee saved'寄存器(R4-R10)來保存返回值,然後在返回之前將其放入'r0'中。即使它是你自己的代碼,出於理智的原因,堅持一個標準是很好的,尤其是如果例程可以外部調用。如果它是一個彙編程序幫助函數,那麼出於效率原因,您可以忽略ABI。如果您不使用ABI,您需要很好地記錄界面。 ABI mix可以創建難以發現的錯誤。 –

回答

0

取決於您的代碼是否必須從其他代碼中使用/調用。關於如何使用寄存器有一些「規則」,參數應該如何在調用之間傳遞等等。這些規則被稱爲ABI(應用程序二進制接口),對於ARM可以在這裏找到:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.subset.swdev.abi/index.html

這允許將用「C」編寫的代碼調用編寫(例如)彙編程序或其他語言編寫的代碼,這是共享庫背後的魔力的一部分。

如果您將您的Raspberry作爲裸機硬件編程,也就是說,您沒有在做與操作系統或其他應用程序交互的SW,您可以在自己的路上編寫代碼,但總的來說,您應該在彙編程序中編程時遵循這些規則。即使您不打算與其他SW組件或操作系統一起工作。這將使您的代碼更簡單。

相關問題