2012-04-09 190 views
5

我需要做的事情是使用LC-3 Assembly實現按位左移和按位右移。基本上,每一個位都必須在移位方向上移動一個空間,並且零填充所創建的空白空間。LC3組件按位右移

例子:

右移:

01001001 
00100100→ 

左Shift:

​​

我已經成功地實現了一個左移,通過採取二進制字符串,並將其添加到自身。

我很難說如何執行右移。任何想法將不勝感激。我有AND,NOT,ADD操作,數據移動操作,七個寄存器來存儲值和整個內存範圍。我只需要一些基本的想法如何實施。

如果您需要LC-3指令集參考,則有one here

+0

工作環節爲LC-3 ISA參考:http://www.cs.utexas.edu/users/fussell/cs310h/lectures/Lecture_10-310h.pdf – 2017-11-01 02:20:15

回答

1

哇,這是一個相當小的指令集。

如果您有256個字節的可用內存,則可能需要查找表。

使用AND來提取該位,您可以使用循環遍歷每個位的位置來完成無數據存儲的操作。

+0

你可以看看這個嗎? http://stackoverflow.com/questions/30017878/where-is-32768-coming-from – committedandroider 2015-05-03 18:42:44

4

假設您設置了R2,以便它只設置一個位。然後,如果您使用Z條件中的另一個寄存器和分支執行AND,則您正在測試是否設置了該位。如果是這樣,您想要在「結果」寄存器中設置前一位。

如果您然後將您的單一位寄存器轉移到一個位置並在一個循環中重複,您應該有你需要的。

(道歉,如果這是含糊不清,因爲這大概是功課我試圖避免只是給你答案)

編輯:

因此,假設您的輸入是01001011.你開始輸出爲00000000,輸入掩碼爲00000010,輸出掩碼爲00000001.您執行AND並發現它不爲零,因此您將輸出掩碼添加到輸出中。然後你將兩個蒙版轉移到00000100和00000010.

在下次通過循環時,AND爲零,所以你什麼都不加,等等。當移動掩碼使其歸零時,循環終止。

+0

這可以工作,但在我看來,必須有一個更簡單的實現它(如將其添加到自身的左移) 你是對的,這是家庭作業,並且是在星期三(11月11日)發佈的,所以我有幾天的時間尋找更好的解決方案,然後用這種方法「強行」。 – 2012-04-10 00:26:44

+0

這並不完全是「蠻力」。它只是包括設置在內的9行代碼。 – 2012-04-10 13:29:56

0

你需要兩個面具。它們都是單個「1」,其餘都是「0」。兩者都被初始化爲0000 0000 0000 0001,但其中一個左移的數量要使原始數字右移。我們將調用Mask1。未轉移的號碼將是Mask2。

將Mask1與原始號碼進行比較。如果(Mask1「和」input「>或< 0,」或「Mask2帶輸出,然後左移兩個掩碼。

在任何一種情況下,左移兩個掩碼並重試,直到輸入中沒有更多位用於測試。

LC-3沒有按位「或」。你將不得不「操作」兩個操作數,「和」他們,然後「不」,結果是按位「或」。

您測試Mask1「和」輸入是否>或< 0的原因是因爲如果它爲零,我們不想做任何事情。如果「和」這些操作數的結果大於0,那意味着測試的位置找到了「1」,並且需要將結果打印出來。如果掩碼已經左移到1000 0000 0000 0000,這在技術上是一個負數。該位置的「和」以及該位置中具有「1」的任何數字也將是負數。

+0

如果你知道沒有進位,你可以用'add'來代替'或'。這裏就是這種情況,因爲你一次只能工作一次。 – 2017-11-01 02:02:07

0

假設一個前導0,你可以通過減2再除以2。

所以算你如何能經常補充RX,RX,#-2

我敢肯定,也有一個方法可以解決領先1

+1

一種方式提醒1將分割前,並與0xFE註冊。但是這個解決方案對我來說看起來很慢 – Tommylee2k 2016-03-10 07:18:00