7

基本的な疑問がいくつかありますが、面接の質問に手を出すたびに、これらの質問と疑問が浮かび上がります。

A = 5、B=-2と言います。AとBが4バイトであるとすると、CPUはどのようにA + B加算を行いますか?

Aは正の値を示すために0として符号ビット(MSB)を持ち、Bは負の整数を表すために1として符号ビットを持つことを理解しています。

ここで、C ++プログラムで印刷したい場合A + B、ALU(算術論理演算装置)の加算モジュールは最初に符号ビットをチェックし、次に減算を実行してから減算の手順に従います。減算がどのように行われるかが私の次の質問になります。

A = 5
B = 2

やりたいA - B。コンピューターはBの2の補数を取り、BのA + 2の補数を追加して、これを返します(左側の余分なビットを破棄した後)?

A = 2
B = 5

するA - B。この場合、コンピューターはどのように動作しますか?

if-thenなどの条件付きロジックはすべてALU内のハードウェアで実行されることを理解しています。2s補数の計算など、余分なビットをすべて破棄するのは、ALU内のハードウェアで行われます。ALUのこのコンポーネントはどのように見えますか?

4

5 に答える 5

16

2の補数を使用する理由は、数値が正であろうと負であろうと加算が同じであるためです。1の補数符号付きの大きさの表現の場合のように、考慮すべき特別なケースはありません。

したがって、を見つけるA-Bには、Bを否定して追加するだけです。つまり、が見つかりA + (-B)ます。2の補数を使用している(-B)ため、加算アルゴリズムはどちらの方法でも同じように機能するため、が正であるか負であるかを心配する必要はありません。

于 2011-04-26T17:15:19.700 に答える
8

符号ビットの部分が少し間違っています。これは単なる符号ビットではありません。すべての負の数は2の補数に変換されます。あなたが書く場合:

B = -2

コンパイラがバイナリにコンパイルすると、次のようになります。

1111 1111 1111 1111 1111 1111 1111 1110

これで、5を加算する場合、ALUは2つの数値を取得して加算します。これは、単純な加算です。

ALUが減算するコマンドを取得すると、2つの数値が与えられます-2番目の数値のすべてのビットにNOTを作成し、単純な加算を行ってさらに1を加算します(2の補数はすべてのビット+1にないため)。

ここで覚えておくべき基本的なことは、2の補数は2 +3と2+(-3)に対して2つの別々の手順を作成する必要がないという正確な目的のために選択されたことです。

于 2011-04-26T17:13:31.713 に答える
8

2ビットまたは3ビットの観点から考えてから、これらが32ビットまたは64ビット、あるいは多くのビットにスケールアップすることを理解してください。

まず、10進数から始めましょう

 99
+22
===

これを行うために、いくつかの「キャリー・ザ・ワンズ」を実行します。

11
 99
+22
===
121

9プラス2は1キャリー1、1プラス9プラス2は2キャリー1 ...

ただし、2つの数値を追加するには、実際には3つの行が必要でしたが、少なくともその一部では、3つの数値を追加できる必要がある場合があります。aluの加算器の場合と同じように、各列またはビットレーン、シングルビット加算器は、2つの入力とキャリーインビットを加算できる必要があり、出力は1ビットの結果と1ビットのキャリーです。

5と2を使用したので、4ビットの2進演算を実行しましょう

 0101
+0010
=====
 0111

これを続ける必要はありませんでしたが、5 + 2=7の計算が機能したことがわかります。

そして、5と-2を追加したい場合

11
 0101
+1110
=====
 0011

そして、答えは予想通り3で、それほど驚くことではありませんが、実行しました。これは2の補数のマイナス数の加算であり、すべて機能しました。その場合、符号ビットはありませんでした。2の補数を使用すると、加算器に2つのオペランドをフィードするだけで済みます。

ここで、微妙な違いを作りたい場合、5から2を減算したい場合は、加算ではなく減算命令を選択します。2の補数で否定すると、1を反転して加算することを意味することを私たちは皆学びました。また、2入力加算器は、加算器が必要とする幅にカスケードできるように、キャリーイン用に3番目の入力が実際に必要であることを上で見ました。したがって、2つの追加操作を実行する代わりに、最初に1を追加して反転し、実際の追加を追加するだけで、反転してキャリーインを設定できます。

減算ロジックがないことを理解してください、それはあなたがそれを供給するもののネガを追加します。

    v this bit is normally zero, for a subtract we set this carry in bit
11 11
 0101 five
+1101 ones complement of 2
=====
 0011

そして、私たちが同じ答えを得るのを知っていますか...どちらのオペランドの実際の値が何であるかは関係ありません。加算演算の場合は、キャリーインビットにゼロを設定して加算器にフィードします。減算演算の場合は、2番目のオペランドを反転し、1をキャリーインに入れて、同じ加算器にフィードします。落ちるものは何でも落ちる。ロジックに結果を保持するのに十分なビットがある場合はすべて機能し、十分なスペースがない場合はオーバーフローします。

オーバーフローには、符号なしと符号付きの2種類があります。符号なしは単純で、キャリービットです。符号付きオーバーフローは、msbit列のキャリーインビットをその列のキャリーアウトビットと比較することと関係があります。上記の計算では、そのmsbit列のキャリーとキャリーは同じであり、どちらも1つであることがわかります。そして、検査によって、4ビットシステムには+ 5、-2、および+3の数値を適切に表すのに十分な余地があることがわかりました。4ビットシステムは、+7から-8までの数値を表すことができます。したがって、5と5、または-6と-3を追加すると、署名されたオーバーフローが発生します。

01 1
 0101
+0101
=====
 1010

同じ加算ロジックが符号付きおよび符号なしの計算に使用されることを理解してください。これらのビットが2の補数の符号付きまたは符号なしと見なされるかどうかを仮想的に定義するのは、ロジックではなくコード次第です。

上記の5+5の場合、msbit列のキャリーインは1ですが、キャリーアウトは0です。これは、符号付きオーバーフローフラグであるVフラグがロジックによって設定されることを意味します。同時に、キャリーフラグであるCフラグであるそのビットのキャリーアウトは設定されません。符号なしの場合、4ビットは0から15までの数値を保持できるため、5 + 5=10はオーバーフローしません。しかし、符号付き4ビットを考えると+7から-8を保持でき、5 + 5 = 10は符号付きオーバーフローであるため、Vフラグが設定されます。

キャリー命令付きの加算がある場合、それらは同じ加算回路を取り、ゼロでキャリーを供給する代わりに、キャリーフラグを与えられます。同様に、借用による減算では、キャリーインを1にフィードする代わりに、キャリーインはステータスレジスタのキャリーフラグの状態に基づいて1または0のいずれかになります。

乗算はまったく別の話です。バイナリを使用すると、10進数の数学を使用する場合よりも乗算がはるかに簡単になりますが、符号なしと符号付きの乗算命令を変える必要があります。また、除算は独自の独立した獣であるため、ほとんどの命令セットには除算がありません。多くは、それが燃やすゲートまたはクロックの数のために乗算を持っていません。

于 2011-04-27T18:20:44.860 に答える
3

ALU(Arithmetic Logic Unit)の加算モジュールは、最初に符号ビットをチェックし、次に減算を実行することを決定してから、減算の手順に従います。

いいえ、1の補数と2の補数では、正の数と負の数の加算/減算に違いはありません。ALUは、正の値と負の値の任意の組み合わせに対して同じように機能します

したがって、ALUは基本的にA + (-B)のためA - Bに実行しますが、個別の否定ステップは必要ありません。設計者は巧妙なトリックを使用してaddsub、2番目の入力を条件付きで反転するために、新しい入力BinvertとともにマルチプレクサとNOTゲートのみを追加することにより、加算器に同じサイクル長で両方実行させます。AND / OR / ADD/SUBを実行できる簡単なALUの例を次に示します。

全加算器

コンピュータアーキテクチャ-全加算器

実際の加算器は、⊞の中にプラス記号が付いたボックスで、aにbまたは〜bを加算キャリーイン合計生成して実行します。これは、2の補数-b = ~b + 1でそれを実現することによって機能しa - b = a + ~b + 1ます。つまり、キャリーインを1に設定し(またはボローインのキャリーインを無効にし)、2番目の入力(つまりb)を反転する必要があります。このタイプのALUは、次のようなさまざまなコンピュータアーキテクチャの本に記載されています。

RISC-V ALU

1の補数で、減算するときにキャリーインを-b = ~b設定しないようにします。それ以外の場合、デザインは同じです。ただし、2の補数には別の利点があります。符号付き値と符号なし値の演算も同じように機能するため、符号付きタイプと符号なしタイプを区別する必要さえありません。タイプが署名されている場合は、補数としてキャリービットを最下位ビットに戻す必要があります。

上記のALUにいくつかの簡単な変更を加えるだけで、6つの異なる操作を実行できるようになりました:ADD、SUB、SLT、AND、OR、NOR

6機能ALU

CSE 675.02:コンピュータアーキテクチャの概要

マルチビット演算は、上記の複数のシングルビットALUを連結することによって実行されます。実際には、ALUはより多くの操作を実行できますが、同様の原則でスペースを節約するように作られています

于 2019-05-23T16:32:30.993 に答える
2

2の補数表記:not B = -B -1または-B = (not B) + 1。パソコンや紙で確認できます。

したがって、A-B = A +(Bではない)+1で実行できます。

  • 1ビット単位ではありません
  • 1増分
  • 1追加

notと否定だけを使用して非効率的にインクリメントおよびデクリメントするトリックがあります。

たとえば、レジ​​スタの番号0から始めて、次のように実行する場合:

not、neg、not、neg、not、neg、...レジスタには次の値があります。

-1、1、-2、2、-3、3、..。

または別の2つの式として:

not(-A) = A - 1
-(not A) = A + 1
于 2017-03-17T13:28:26.737 に答える