私は関数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}
何らかのコードを投稿するのはどうですか? ; D – Matteo
問題はどういったものですか? –
いくつかのコンパイラが使用している呼び出し規約を破っていますか?インラインアセンブリでそれを回避することができます。このARMですか?乗算ルーチンを見て、シフトと累積は32ループ以上のものに対してループされた加算よりも速くなければなりません... 32より小さい数を掛けるなら、ルックアップテーブルを使用してください。 –