6

gcc にスタック上の関数のパラメーターを強制的に渡す方法はありますか?

パラメータの受け渡しにレジスタを使用したくありません。

更新: CodeSourceryの arm-gcc を使用しています

4

3 に答える 3

2

パラメータを構造体でラップしてみることができます。たとえば、関数が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;
}
于 2011-01-09T18:02:22.773 に答える
0

によると: http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042d/IHI0042D_aapcs.pdf

最初の 4 つのレジスタ r0 ~ r3 (a1 ~ a4) は、引数値をサブルーチンに渡し、関数から結果値を返すために使用されます。これらは、ルーチン内で中間値を保持するためにも使用できます (ただし、一般に、サブルーチン呼び出し間のみ)。

ARMには、私が知っているデフォルト以外の呼び出し規約はありません。その理由は次のとおりです。

  1. なぜあなたはしたいですか?あなたの関数は、他の関数によってコンパイルされた形式で呼び出すことができず、互換性が混乱します。
  2. コンパイラが呼び出し規則を区別できない限り、ABI に準拠するシステム関数への呼び出しは機能しません。さて、過去にx86-32にはさまざまな呼び出し規約があることを知っていましたが、x64 の方が単純であることに注意してください (AMD64 と Microsoft が行ったもの)。ARM 呼び出し規則を設計するときに、なぜこれほど多くの異なる呼び出し規則を許可するのでしょうか? 互換性の混乱を引き起こします。
于 2011-01-09T17:46:37.603 に答える
0

ローカル変数を格納する場所は、それをどのように使用するかによって異なります。ローカル変数のアドレスを取得する必要がある場合、ローカル変数はスタックにのみ格納できます。したがって、サブルーチンにポインターを渡すと、このパラメーターはスタックを介して渡されます。

于 2012-03-25T07:59:53.623 に答える