6

LC-3 Assemblyを使用して、ビット単位の左シフトとビット単位の右シフトの両方を実装する必要があります。基本的に、すべてのビットはシフトの方向に 1 つのスペースを移動する必要があり、作成された空のスペースはゼロで埋められます。

例:

右シフト:

 01001001
 00100100→

左方移動:

 01001001
←10010010

バイナリ文字列を取得してそれ自体に追加することにより、左シフトを正常に実装しました。

右シフトを実行する方法に困惑しています。どんな考えでも大歓迎です。AND、NOT、ADD 操作、データ移動操作、値を格納するための 7 つのレジスタ、およびメモリの全範囲があります。それをどのように実装できるか、いくつかの基本的なアイデアが必要です。

LC-3 命令セットのリファレンスが必要な場合は、ここにあります。

4

4 に答える 4

6

R21ビットだけが設定されるように設定したとします。次に、AND別のレジスタでを実行し、条件で分岐するZ場合、そのビットが設定されているかどうかをテストしています。そうである場合は、「結果」レジスタの前のビットを設定します。

次に、シングルビットレジスタを1つの場所にシフトしてループで繰り返すと、必要なものが得られるはずです。

(これが曖昧な場合はお詫びします。これはおそらく宿題なので、私はあなたに答えを与えることを避けようとしています)

編集:

したがって、入力が01001011であるとします。出力00000000、入力マスク00000010、出力マスク00000001から始めます。ANDを実行し、それがゼロ以外であることがわかったので、出力マスクを出力に追加します。次に、両方のマスクをシフトして、00000100と00000010を取得します。

次回ループを通過するとき、ANDはゼロなので、何も追加しません。マスクをシフトしてゼロにすると、ループは終了します。

于 2012-04-09T18:54:39.677 に答える
1

うわー、それは非常に最小限の命令セットです。

256バイトのメモリを使用できる場合は、ルックアップテーブルを使用することをお勧めします。

ANDデータメモリなしで、ビットを抽出するために使用して、各ビット位置のループを使用してそれを行うことができます。

于 2012-04-09T18:53:43.873 に答える
0

マスクは2枚必要です。どちらも単一の「1」で、残りは「0」です。両方とも 0000 0000 0000 0001 に初期化されますが、一方は元の数値を右にシフトする量だけ左にシフトされます。これを Mask1 と呼びます。シフトされていない番号は Mask2 になります。

Mask1 を元の番号と比較します。(Mask1 "and" input) > or < 0 の場合、Mask2 と出力を "or" し、両方の Mask を左シフトします。

いずれの場合も、両方のマスクを左にシフトし、テストする入力のビットがなくなるまで再試行します。

LC-3 にはビットごとの「or」がありません。両方のオペランドを「否定」し、それらを「AND」し、ビットごとの「OR」の結果を「否定」する必要があります。

Mask1 "and" 入力が > または < 0 であるかどうかをテストする理由は、ゼロの場合は何もしたくないためです。これらのオペランドを「and」した結果が > 0 の場合、テストされた位置で「1」が見つかり、それを結果に出力する必要があることを意味します。マスクが 1000 0000 0000 0000 になるように左シフトされた場合、それは技術的には負の数です。それとその位置に「1」がある数字の「and」も負の数になります。

于 2013-12-01T16:25:28.037 に答える