2016-10-23 39 views
-3

ARMアセンブリでは、各レジスタに32ビット/ 1ワードの情報を格納できます。そのため、255を超える値を格納しようとするとエラーが発生しますARMアセンブラのMULの32ビット制限

ただし、MUL命令にはこの制限がないようです。 2つのレジスタを掛け合わせることができます。それぞれのレジスタには例えば255の値があり、結果はエラーなしで3番目のレジスタに格納されます。これはどうやって起こるのですか?デスティネーションレジスタは255を超える値を格納できませんか?

+3

255は、符号なし*バイト*、8ビットです。おそらく、あなたが持っているエラーと共にいくつかのコードを表示しているので、何が起こっているのか説明し、実際にあなたを助けることができます。 –

+0

32ビットARMアーチを指していると仮定します。ただし、そこに64ビットのARMv8ユニットがあります。例えば、Cortex-A53、A57。それにもかかわらず、32ビットの汎用レジスタを想定すると、mov r1、#0xfffffffffのようなことをしようとすると、コンパイル時に無効な定数エラーが発生します。さもなければ、0xffffffffのような数の加算または多重を行うことは確かにオーバーフローをもたらし、あなたのコードでそれを説明しなければ、結果は他の人によって数学的に言えば「エラー」と解釈されます。 @dwelchが示すように、2^32 * 2^32 = 2^64。そのような場合にはもっと多くのレジスタが必要になる – InfinitelyManic

+0

http://suffixing.stackexchange.com – Seki

答えて

1

32ビットは0xFFFFFFFF(約40億)の最大サイズを持ち、0xFF(255)倍0xFFは0xFE01(65025)であり、40億を大幅に下回っています。

0xFFFFFFFF x 0xFFFFFFFFをオーバーフローさせることができないという興味深いトピックを作成します。私は "それはあなたにエラーを与える"と信じていない、それはちょうど結果を切り捨てる。

+1

ARM mul命令は明示的に降伏として定義されています結果の最下位32ビットは(結果として、符号付き/符号なしの区別について心配する必要はありません)、おそらく問題を多少面白くします。 – Notlikethat

+0

gradeschoolから私たちは(x^2)*(x^3)= x ^(2 + 3)を覚えています。だから、xを2の2進数と考える。もしあなたが2^31 * 2^31を掛け合わせるならば、すぐに2^62で終わります。これはオーバーフローであり、それを超えて持ち越すことが可能であると考える必要があります。そして、0xFF * 0xFFとその他のすべてのものは、1 * 1やそれ以外の小さな数字を除いて、あなたの電卓との符号なし乗算のためのすべてのものを1倍します。もう1ビットオーバーフローします。だから0xFF * 0xFFの場合、私たちのmsbitsは2^7であり、2^14は2^14のキャリーをもう1つは2^15の16ビットはその結果を格納する。 –

+0

32ビットオペランドの組み合わせのほとんどは、符号なし乗算の32ビット結果に適合しません。アセンブリやアームとはまったく関係ありません。これをC言語や他の言語から知っており、同じサイズの結果を乗算した他の命令セットにも当てはまります。また、符号付き乗算でも同様の状況が予想されます。少なくとも1つのARM ARMは影響を受けるフラグがNとZであることを示しているため、オーバーフローの兆候はなく、高水準言語で扱うのと同様に対処する必要があります。 –

関連する問題