2012-02-26 5 views
1

私はいくつかのC宣言をAVRディレクティブのみを使用してアセンブリに変換する必要があります。アセンブリへのステートメント

これを行う方法を教えてくれる人がいれば教えてください。

たとえば、

translate 'char c;'と 'char * d;'アセンブリ文

注意してくださいに、これは、

最初の週イム学習集合体であるすべてのヘルプ/アドバイスは

+0

あなたの先生はどのようなアドバイスをしてくれましたか?あなたはそのアドバイスと自分の努力をどれだけ取得しましたか? –

+0

'char c;'は変数の定義です。それはステートメントではありません(実際には**何もしません)。 'a = b + c;'は文になります。 –

+0

申し訳ありませんが、宣言に変更しました。私の先生は本当にアドバイスをくれませんでした。私たちは一週間休暇を取っているので、私はどちらでもお尋ねすることができません。アサインメントには、アセンブリに翻訳する必要がある宣言だけが含まれています。 – Brainscrewer

答えて

2

ファーストをいただければ幸いです、char c;char* d;は宣言ではない文です。そして、あなたは、インラインアセンブラ文を作成するために、関連するアセンブリ出力部品を再利用することができ

# Dump assembly to stdout 
avr-gcc -mmcu=your_avr_mcu -S -c source.c -o - 

:あなたは何ができるか

avr-gccオプション-Sを使用してCプログラムのアセンブリ出力をダンプです。

avr-gccとともにインラインassemberの書き方にここを見て:

http://www.nongnu.org/avr-libc/user-manual/inline_asm.html

+0

私はダンプできるcプログラムを持っていません。私は紙の文章を – Brainscrewer

+2

@Brainscrewerに書いているだけです。あなたは 'source.c'にCステートメントを書いて、それらをどのように翻訳して、それらを再利用できるのか見る必要があります。 – ouah

0

あなたから分解することができ、コンパイラがなければ(AVR-gccは手に入れるのは簡単です)、しようとすることは困難です高水準の言語をコンパイルするときに何が起こるかを理解する。

あなたは、そのような宣言を使用するときに変数またはアドレスが必要であると宣言しているだけです。必ずしも即座に、何かを組み立てることはありません。多くの場合、デッドコードなどはコンパイラによってコードから削除されます。それ以外のときは、変数がどこで終わるかを知っているコンパイルプロセスの終わりまではありません。時にはcharはレジスタ内にしか存在しないので、プログラム内の短期間変数には家があります。時には、プログラムが実行されている間に変数が家に持ち帰らなければならない時間が長くなり、レジスタを永久に保持するのに十分なレジスタがないため、割り当てられたメモリ位置が得られることがあります。

同様に、ポインタは、レジスタまたはメモリの場所にも存在するアドレスです。

Cコードを追加して何が起こっているのか試してみることができるコンパイラがない場合は、さらに、必要なプロセッサフ​​ァミリ用の命令セットドキュメントを入手する必要がある場合でも、

http://www.atmel.com/Images/doc0856.pdf

例えば、追加操作を見RR、RDを追加し、それはあなたが追加R10、R23を持つことができdおよびrは0と31の間の両方であることを示します。そしてr10 = r10 + r23を意味する操作を見てください。 C言語で一緒に追加したいchar変数がある場合、これはコンパイラが使用する命令の1つです。

単一の16ビットワードバージョンと2つの16ビットワードを持つ2つのlds命令があります。 (通常、アセンブラがそれを選択します)。 rdは0〜31であり、kはメモリ空間のアドレスである。グローバル変数が宣言されている場合は、ldsまたはstsを使ってアクセスされる可能性があります。 Kはポインタ、固定ポインタです。 Cのchar *は、コード内でそのポインタを使って何をするかによって、コンパイル時に固定数に変わることがあります。それが動的なものなら、ldとstのフレーバーを見て、それらはレジスタのペアを使います。だから、char *ポインタがポインタのペアを保持するメモリまたはレジスタのペアになり、次にx、y、またはzレジスタのペアを使用するかもしれません。ldとstを参照してください。 ldまたはstを使用する前にそのポインタへのオフセット。

私はシミュレータhttp://github.com/dwelch67/avrissを持っています。しかし、それは完全にデバッグされていない(あなたがシミュレータとその有力なバグを調べることによって命令セットを習得しない限り)作業を必要とする。 simavrや他の人があなたのコードを見るのに使うことができます。 http://gitorious.org/simavr

関連する問題