2011-12-06 14 views
0

私は関数multiplyを定義し、引数R0とR1をとり、その結果をR3に保存しました。私は乗算を呼び出すたびにR0とR1にオペランドを入れ、R0、R1とR3にあるものを別の場所に移動しなければならないので、これはうんざりです。関数はフォームがR1、R2、R3関数を定義して、引数の1つを上書きすることは可能ですか?

ldr R0, =snakes 
ldr R1, [R0], #4 
mov R2, #15 
mov R3, #6 

私はR2を乗算する場合を追加し、R3、これは余分な作業を必要とする方法に似R4、R5、R6を掛け取るようにする方法はあります。私は何度も何度も呼びかけ、より良い方法があるのだろうかと思っていますか?

Multiply: 
    stmfd sp!,{r0-r2, lr} 
    mov R2, #1 
    mov R3, #0 
    repeat: 
     add R3, R1, R3 
     add R2, R2, #1 
     cmp R2, R0 
     ble repeat 
    mov R2, R3 
    LDMFD sp!,{r0-r1, pc} 
+0

何らかのコードを投稿するのはどうですか? ; D – Matteo

+0

問題はどういったものですか? –

+0

いくつかのコンパイラが使用している呼び出し規約を破っていますか?インラインアセンブリでそれを回避することができます。このARMですか?乗算ルーチンを見て、シフトと累積は32ループ以上のものに対してループされた加算よりも速くなければなりません... 32より小さい数を掛けるなら、ルックアップテーブルを使用してください。 –

答えて

0

あなたが使用できるマクロ:

Multiply: 
    stmfd sp!,{r0-r2, lr} 
    mov R2, #1 
    mov R3, #0 
    repeat: 
     add R3, R1, R3 
     add R2, R2, #1 
     cmp R2, R0 
     ble repeat 
    mov R2, R3 
    LDMFD sp!,{r0-r1, pc} 

は、R0は0である:体内のパラメータの

.macro multiply A B C 
{body} 
.endm 

値は、あなたのコード内の小さなミスがある\A, \B, \C

でavaliableです結果はR1の代わりに0になります。ループに入る前にチェックする必要があります。正しいコードは次のようになります。

stmfd sp!,{r0-r2, lr} 
mov R2, #0 
mov R3, #0 
repeat: 
    cmp R2, R0 
    be exit_loop 
    add R3, R1, R3 
    add R2, R2, #1 
    b repeat 
exit_loop: 
mov R2, R3 
LDMFD sp!,{r0-r1, pc} 

しかし、5つのループの体の中の命令の代わりに、4、代わりに1の2つの支店があるので、これは最適な方法ではありませんので、それらの両方を予測することは困難であろう。 、

.macro multiply C B A 
stmfd sp!,{\A, \B, \C, r2, lr} 
mov R2, #-1 
rsb \C, \B, #0 
repeat: 
    add \C, \B, \C 
    add R2, R2, #1 
    cmp R2, \A 
    bne repeat 
LDMFD sp!,{\A, \B, \C, r2, pc} 
.endm 

multiply R3 R2 R1 will save the result into R3 

しかし、あなたはあなた自身の乗算マクロを書きたい、なぜ私にはわからない:

stmfd sp!,{r0-r2, lr} 
mov R2, #-1 
rsb R3, R1, #0 
repeat: 
    add R3, R1, R3 
    add R2, R2, #1 
    cmp R2, R0 
    bne repeat 
mov R2, R3 
LDMFD sp!,{r0-r1, pc} 

そして最後に、マクロでそれは次のようになります。私たちは次のことをするつもり理由です私はあなたが知っていることを願っています、複数の命令のセットがある...

0

多くのアセンブラがマクロをサポートしています。あなたのアセンブラがそれらをサポートしているかどうかを確認して、不要なレジスタストアとロードを排除します。 r0、r1、r3、またはr4、r5、r5などのマクロパラメータを指定するだけで、アセンブリはパラメータとして与えられたレジスタをマクロ本体に置き換えます。

関連する問題