1

n個のフィボナッチ数を印刷するための簡単なcプログラムがあり、それをELFオブジェクトファイルにコンパイルしたいと思います。フィボナッチ数(n)をcコードで直接設定するのではなく、ARMプロセッサ用にシミュレートしているので、レジスタに設定したいと思いますが、どうすればよいですか?

これがコードスニペットです

#include <stdio.h>
#include <stdlib.h>

#define ITERATIONS 3

static float fib(float i) {
    return (i>1) ? fib(i-1) + fib(i-2) : i;
}

int main(int argc, char **argv) {

    float i;
    printf("starting...\n");

    for(i=0; i<ITERATIONS; i++) {
    printf("fib(%f) = %f\n", i, fib(i));
    }

    printf("finishing...\n");

    return 0;
}

コードではなく、レジスターにITERATIONSカウンターを設定したいと思います。

前もって感謝します

4

2 に答える 2

1

ITERATIONSをリテラル定数ではなく変数にすると、ループが実行される直前に、デバッガー/シミュレーターのウォッチウィンドウまたはローカルウィンドウでその値を直接設定できます。

あるいは、stdioをサポートしているように見えますが、コンソール入力を介して値を受け入れるのはなぜですか?

于 2011-11-11T19:59:41.460 に答える
1

registerキーワードを使用して、イテレーターと反復回数にレジスターを使用することをコンパイラーに提案できます。

register float i;
register int numIterations = ITERATIONS;

しかし、それはあまり役に立ちません。まず第一に、コンパイラはあなたの提案を使用するかもしれないし、使用しないかもしれません。次に、 fib()を呼び出すために値をスタックに配置する必要があります。最後に、ループ内で呼び出す関数に応じて、プロシージャ内のコードが呼び出すと、レジスタの内容がスタックフレームに保存されます。プロシージャエントリ、およびプロシージャリターン​​を実装するコードの一部としてそれらを復元します。

本当にすべての命令をカウントする必要がある場合は、(アセンブリ言語を使用して)マシンコードを記述する必要があります。そうすれば、レジスタの使用を直接制御できます。アセンブリ言語プログラミングは、気の弱い人向けではありません。アセンブリ言語の開発は、高級言語を使用する場合よりも数倍遅く、バグを挿入するリスクが高く、追跡がはるかに困難です。高水準言語はある理由で開発され、C言語はUnixの記述を支援するために開発されました。最初のUnixシステムを実行したミニコンピューターは非常に低速でしたが、アセンブリの代わりにCを使用した理由は、それでも、コーディングにかかる​​時間が短く、バグが少なく、デバッグが簡単なコードを使用することが重要だったためです。アセンブラ。

これを試してみたい場合は、ARMプログラミングのリソースに関するstackoverflowに関する以前の質問への回答が役立ちます。

実行する可能性のある戦術の1つは、パフォーマンスが重要なコードをプロシージャに分離し、プロシージャをCで記述して、生成されたアセンブリ言語表現をキャプチャすることです。次に、より効率的になるようにアセンブラを書き直します。徹底的にテストし、少なくとも1セットの他の眼球を取得して、結果のコードを確認します。

幸運を!

于 2011-11-11T20:01:17.217 に答える