gcc にスタック上の関数のパラメーターを強制的に渡す方法はありますか?
パラメータの受け渡しにレジスタを使用したくありません。
更新: CodeSourceryの arm-gcc を使用しています
パラメータを構造体でラップしてみることができます。たとえば、関数がint calc_my_sum(int x, int y) {return x+y;}
次のように変更できる場合(醜い):
struct my_x_y {
int x, y;
my_x_y(): x(0), y(0) {} // a non-trivial constructor to make the type non-POD
};
int calc_my_sum(my_x_y x_and_y) {
// passing non-POD object by value forces to use the stack
return x_and_y.x + x_and_y.y;
}
または、4つのダミーパラメータを追加してレジスタを使い切ることができるため、他のパラメータはスタックを使用します。
struct force_stack_usage {
int dummy0, dummy1, dummy2, dummy3;
}
int calc_my_sum(force_stack_usage, int x, int y) {
return x + y;
}
によると: http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042d/IHI0042D_aapcs.pdf
最初の 4 つのレジスタ r0 ~ r3 (a1 ~ a4) は、引数値をサブルーチンに渡し、関数から結果値を返すために使用されます。これらは、ルーチン内で中間値を保持するためにも使用できます (ただし、一般に、サブルーチン呼び出し間のみ)。
ARMには、私が知っているデフォルト以外の呼び出し規約はありません。その理由は次のとおりです。
ローカル変数を格納する場所は、それをどのように使用するかによって異なります。ローカル変数のアドレスを取得する必要がある場合、ローカル変数はスタックにのみ格納できます。したがって、サブルーチンにポインターを渡すと、このパラメーターはスタックを介して渡されます。