3

私はいくつかのアセンブリコードを見ていて、次のコードに出くわしました(読みやすくするために変換しました)。レジスタはすべて 8 ビット、ポインタは 16 ビットです。したがって、(q)8 ビットをロードします。

(q+1) = (q+1) = rr(q+1)どこで(q)逆参照さqれ、rr(q)右に回転 (q) = (q) + (q)/2 + bit((q+1), 0)し、どこbit((q+1), 0)で の 0 番目のビットを取得します。(q+1)

上記のコードは、エンディアンに関係なく 16 ビット値を 1.5 で乗算するため、これは私を本当に混乱させました (つまり、q をリトル エンディアンまたはビッグ エンディアンで解釈しても、その値はそれぞれのエンディアンで 1.5 倍されます)。

2 つの 8 ビット値を使用して 16 ビット値を 1.5 で乗算する方法について、私は混乱しています。何が起きてる?具体的には、の0ビット目を足す目的と右(q+1) to (q)回転させる目的は何ですか?(q+1)

アセンブリコードは次のとおりです。

ld a, (q)
ld b, a
ld a, (q+1)
ld c, a
srl b
rr c
add c
ld (q+1), a
ld a, (q)
adc b
ld (q), a
ret
4

1 に答える 1

1

すべてのアセンブリ コードを詳細に読む時間はありませんでしたが、@Ross Ridge が正しいと強く思います。

このトリックは、ホーナーの方法と呼ばれます。これは、乗算器のない小さな組み込み MCU で特に一般的ですが、一般的な速度の最適化に使用できます。見る

http://www.ti.com/lit/an/slaa329/slaa329.pdf

于 2015-09-01T04:12:10.153 に答える