2011-11-11 8 views
1

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

は、私は私のレジスタではなくコードでカウンターITERATIONSを設定したいコードスニペット

#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; 
} 

です。事前

+0

何が登録されていますか?それはプログラムの何かに対応していますか? – wallyk

+0

フィボナッチ配列は*正の整数シーケンス*です。この場合、 'float'はおそらく不適切な型です。それは、6桁以上の有効桁数を持つ値を正確に表しません。 'unsigned long'または' unsigned long long'はより良い選択肢であり、FPUのないARMによってより効率的に計算されます。 – Clifford

+0

@ Clifford *大きい数字が必要な場合は、* double *を使用して、閉じた形式の解を使って計算することができます。 –

答えて

1

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

register float i; 
register int numIterations = ITERATIONS; 

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

すべての命令数を増やす必要がある場合は、アセンブリ言語を使用してマシンコードを記述する必要があります。そうすれば、あなたはあなたのレジスタの使用法を直接制御することができます。アセンブリ言語のプログラミングは、心のかすかなものではありません。アセンブリ言語の開発は、より高いレベルの言語を使用する場合よりも数倍遅くなります。バグを挿入するリスクは大きくなり、追跡するのがはるかに難しくなります。なんらかの理由で高レベルの言語が開発され、C言語はUnixの作成に役立つように開発されました。最初のUnixシステムを実行していたミニコンピュータは非常に遅いですが、アセンブリの代わりにCを使用した理由は、コード化する時間が短く、バグが少なく、デバッグしやすいコードを持つことが重要でしたアセンブラ。

これを試してみたい場合は、here are the answers to a previous question on stackoverflow about resources for ARM programmingこちらの方が役に立ちます。

パフォーマンス重視のコードをプロシージャに分離し、Cでプロシージャを記述し、生成されたアセンブリ言語表現をキャプチャする方法があります。次に、より効率的になるようにアセンブラを書き換えます。徹底的にテストし、少なくとも1つの眼球セットを取得して、結果のコードを見る。

Good Luck!

+0

シミュレータ内の実行時に繰り返し回数を変更したいと思っています。これはレジスタを必要とせず、単純に変数です。さらに、 'register'修飾子はほとんどのコンパイラによって無視され、確実に特定のレジスタを指定しません。 ARM ABIでは、関数の最初の4つの引数はR0〜R3( 'double'または' long long'を除いて)に渡され、さらに引数が積み重ねられます。 – Clifford

+0

私は、変数にレジスタを使用するようにコンパイラを指示するのではなく、_彼にcompiler__suggestと言っていました。 –

+0

ありがとうございます。しかし、フィボナッチ数は150を超える必要はありません。他のコメントでも触れたように、フィボナッチの例を使って、コード自体で宣言するのではなく、数値カウントをレジスタに渡す方法を確認しました。私は両方のアプローチのタイミング結果を検証しています。1)変数を宣言して値を代入してコードに渡します。2)コードで数値カウンタ変数を宣言し、レジスタにコンパイル時に値を代入します。 。プログラムの結果や出力はあまり重要ではありません。そのむしろタイミング。 – Mechanic

1

おかげでITERATIONS変数ではなくリテラル定数を作成し、その後、ループが実行される直前に、あなたのデバッガ/シミュレータの時計や地元ウィンドウに直接その値を設定することができます。

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

+0

私はITERATIONS変数を作ることができます。この例は、シミュレータImの動作を実証するためのものです。私は実際には、同じプログラムの2つの構成をシミュレートしています1)レジスタを介して入力を設定し、2)コードを変更して入力を設定します。私はARM7プロセッサ用のOVPシミュレータを使用しています。デバッガのウィンドウはどういう意味ですか? ImはMsys開発環境を使ってシミュレータを実行します – Mechanic

+0

私はOVPに慣れていませんが、ほとんどのシミュレータはGDBやInsightなどのソースレベルのデバッガによるデバッグをサポートしています。このようなデバッガでは、実行可能なアプリケーション変数を直接表示および変更することができます。シミュレーションと実際のハードウェアの両方でこのようなデバッグを実行する手段がない場合は、開発の欠陥がほとんどありません。まず、シミュレーションの利点について質問します。 – Clifford

+0

...私はOVPサイトを見て、EclipseとGDBを使ってOVP上で実行されているアプリケーションのビデオを見てきました。 – Clifford

関連する問題