2012-04-09 10 views
5

これは、ビット単位の左シフトとビット単位の右シフトの両方を実装するために必要なものです。LC-3 Assemblyを使用します。基本的には、すべてのビットをシフトの方向に1つのスペースに移動させなければならず、ゼロが作成された空のスペースを埋めます。LC3アセンブリビット単位の右シフト

例:

右シフト:

01001001 
00100100→ 

左Shift:

​​

私は成功したバイナリ文字列を取って、そして自分自身にそれを追加することにより、左シフトを実装しました。

右シフトを実行する方法がわかりません。どんな考えでも大変感謝しています。私はAND、NOT、ADD演算、データ移動演算、値を格納する7つのレジスタ、およびメモリの全範囲を持っています。私は、それがどのように実装できるかという基本的なアイデアが必要なだけです。

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

+0

の作業のリンクを回避する方法もあると確信している#-2

、あなたはRX、RXを追加することができますどのくらいの頻度カウント:http://www.cs.utexas.edu/users/fussell/cs310h/lectures/Lecture_10-310h.pdf –

答えて

1

うわー、それはかなりの最小限の命令セットです。

256バイトのメモリが利用可能な場合は、ルックアップテーブルが使用できます。

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

+0

あなたはこれを見ることができますか? http://stackoverflow.com/questions/30017878/where-is-32768-coming-from – committedandroider

4

R2を設定して、1つのビットが設定されているとします。次に、別のレジスタでANDを実行し、Z条件で分岐する場合は、そのビットが設定されているかどうかをテストしています。そうであれば、 "result"レジスタの前のビットをセットします。

シングルビットレジスタを1か所にシフトしてループを繰り返す場合は、必要なものを用意する必要があります。

(謝罪これは曖昧であるならば、これはおそらく宿題ですので、私はちょうどあなたに答えを与えることを避けるためにしようとしている)

編集:

だから、あなたの入力はあなたが開始01001011.であると仮定00000000の出力、00000010の入力マスク、00000001の出力マスクを持ちます。ANDを実行して、0ではないことがわかるので、出力マスクを出力に追加します。次に、両方のマスクを00000100と00000010に移動します。

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

+0

これはうまくいくかもしれませんが、それを実装するのが簡単であるように思えます(左側のシフト) これは宿題であり、今週の水曜日(4月11日)に間に合うはずです。だから、このアプローチでは、私が「ブルートフォース」する前に、もっと良い解決策を探すのに2,3日あります。 –

+0

これは厳密に "ブルートフォース"ではありません。それは設定を含むコードのちょうど9行です。 –

0

2つのマスクが必要です。どちらも "1"で残りは "0"です。どちらも0000 0000 0000 0001に初期化されますが、そのうちの1つは、元の数値を右シフトする量だけ左シフトされます。私たちはそのMask1と呼ぶでしょう。シフトされていない番号はMask2になります。

元の番号とMask1を比較してください。 (Mask1 "と" input ")または<が0の場合、"または "Mask2を出力してから、両方のマスクを左にシフトします。

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

LC-3にはビット単位の "または"がありません。両方のオペランドではなく ""と "それから"、 "ビット単位の結果"または "

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

+0

キャリーがないことがわかっている場合は、「または」の代わりに「追加」できます。これは、一度に1ビットずつ作業するため、ここに当てはまります。 –

0

先頭に0を付けると、2を2で割って、何度も何度も減算することができます。

だから私はLC-3 ISAの参考のために有力1.

+1

リマインダー1の周りのウェイは、分割する前に、0xFEで登録されます。このソリューションは私のために非常に遅いもののように見えます – Tommylee2k

関連する問題