如何將基於堆棧的結構傳遞給ARM程序集中的子例程?在ARM中調用基於堆棧的結構的約定?
例如:
typedef struct SomeStruct {
uint32_t one;
uint32_t two;
uint32_t three;
uint32_t four;
} SomeStruct;
void SomeFunction(uint32_t someValue, SomeStruct someStruct, uint32_t otherValue);
在這種情況下,如何將結構傳遞?我的猜測是:
r0
-someValue
r1
-someStruct.one
r2
-someStruct.two
r3
-someStruct.three
*sp
-someStruct.four
*sp,#4
-otherValue
這是正確的還是會發生其他事情?或者只是通過結構的sp
基地址?
現在我想起來了,我的猜測聽起來很愚蠢。 –
除非你的結構非常小,否則直接傳遞結構並不常見。如果你只是傳遞一個指向結構體的指針,那麼調用該函數的開銷就會減少。 – TJD
@TJD:雖然這是有問題的,因爲參數在邏輯上是一個副本。因此,如果調用者執行'SomeFunction(1,my_global_struct,1);'並且被調用者執行'if(&someStruct ==&my_global_struct)',那麼當然必須是false。所以調用約定可以傳遞一個指針,這可能會有所幫助,但可能被調用者仍然需要拷貝一個拷貝,在這種情況下,它不會少開銷。 –