これは非常に単純な関数なので、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];
}
(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
@ user786653:答えとして投稿してみませんか?あなたが 'bx lr'部分について説明することができれば、あなたはすべてをカバーしています。 –