2011-08-12 15 views
2

私はC++で腕分解の以下の部分を再作成しようとしている:浮動小数点アーム解体命令

00003188 ed910a06 flds s0, [r1, #24] 
0000318c edd10a07 flds s1, [r1, #28] 
00003190 ec800a02 fstmias r0, {s0-s1} 
00003194  4770 bx lr 
00003196  bf00 nop 

を第一に、単一の歳差運動が登録S0のですか?そして、flslとfstmiasは何をしますか?次のコードを試しましたが、同じ結果は得られません。

float s0 = r1[6]; 
float s1 = r1[7]; 

何を試してみましたか?

+0

(http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc:彼らはCに翻訳配列であると仮定すると

は自明です。 dui0068b/Bcfchhif.html)は、 'r0'(IA =インクリメントアドレス)で指定されたアドレスに単精度の数値を格納します。ですから、あなたは 'r0 [0] = s0;もしそれがあなたがそれをどのように翻訳したいのであれば...(あるいは 'mem [r0] = s0; mem [r0 + 4] = s1;'私は周囲のコードがどのように見えるのか分からない)。 – user786653

+0

@ user786653:答えとして投稿してみませんか?あなたが 'bx lr'部分について説明することができれば、あなたはすべてをカバーしています。 –

答えて

4

これは非常に単純な関数なので、1行ずつ取り上げましょう。私はあなたがの機能を投稿したと仮定しようとしています。

00003188 ed910a06 flds s0, [r1, #24] 

FLDSこのフォーム上にある:Sなどの精度で "FLD <精度> {COND} FD、[Rnの{#offset}]"、(=単精度)。ドキュメントでは、r1 + 24にある単精度浮動小数点値をs0にロードしていることを示しています。

0000318c edd10a07 flds s1, [r1, #28] 

、別の負荷、r1 + 28からこの時間(これはあなたがr1[7]で書いたものに相当)。

00003190 ec800a02 fstmias r0, {s0-s1} 

FSTMIASリスト "FSTM <addressmode> <精度> {指揮} Rnに、{!} VFPregisters"。ここでは、addressmode = IAとなります。これは、「各転送後にアドレスをインクリメントする」とprecision = singleを意味します。この命令は、指定されたレジスタをr0で指定されたアドレスに格納します。各ストアの後にアドレスをインクリメントします。つまり、[r0]s0[r0+4]s1を格納します。

00003194  4770 bx lr 

BX分岐であり(および必要に応じてバックARMモードに変更)の値を登録する - (セクション5.1 here参照)関数からの復帰の好適な方法を。この場合、レジスタはリターンアドレスを保持するリンクレジスタです。

00003196  bf00 nop 

オペレーションなし。何もしません。通常、メモリ内の関数を整列するために挿入されます。

ARM-THUMB(セクション4.1)用のcalling conventionは、最初の4つの引数がr0-r3(== a1-a4)に渡され、r0とr1が使用されているので、 2パラメータ。関数が値を返すか(最初の入力と同じか)、値を返さないかは不明です。これを理解するには、コールサイトを参照する必要があります。

C言語では、2つのポインタ値を入力とし、2番目のパラメータからオフセット24と28から2つをロードし、最初のオフセット0と4に格納します。プログラムの詳細な知識がなければ、パラメータが配列、構造その他のものになっているかどうかを判断することは不可能です。【fstmias]

void mystery_function(float* dst, const float* src) { 
    dst[0] = src[6]; 
    dst[1] = src[7]; 
} 
+0

優れた答え。 –

関連する問題