2012-04-09 13 views
5

Co muszę zrobić, zaimplementuj bitowe przesunięcie w lewo i przesunięcie bitowe w prawo za pomocą LC-3 Assembly. Zasadniczo każdy bit musi zostać przesunięty o jedną spację w kierunku przesunięcia, a zero wypełnia pustą przestrzeń utworzoną.Zespół LC3 Bitwise Prawy Shift

Przykłady:

Prawy Shift:

01001001 
00100100→ 

Lewy Shift:

01001001 
←10010010 

Mam powodzeniem wdrożył lewy shift, biorąc ciąg binarny, i dodanie go do siebie .

Jestem zaskoczony, jak wykonać prawą zmianę. Jakiekolwiek propozycje będą mile widziane. Mam operacje AND, NIE, ADD, operacje przesuwania danych, siedem rejestrów do przechowywania wartości i całego zakresu pamięci. Potrzebuję tylko podstawowych pomysłów, w jaki sposób można go wdrożyć.

Jeśli potrzebujesz odniesienia do zestawu instrukcji LC-3, istnieje one here.

+0

linku pracujących dla odniesienia LC-3 ISA : http://www.cs.utexas.edu/users/fussell/cs310h/lectures/Lecture_10-310h.pdf –

Odpowiedz

1

Wow, to dość minimalna instrukcja.

Jeśli masz 256 bajtów dostępnej pamięci, to może być do zrobienia tabela odnośników.

Można to zrobić bez pamięci danych za pomocą pętli ponad każdą pozycją bitów, używając AND, aby wyodrębnić bit.

+0

Czy możesz rzucić okiem na to? http://stackoverflow.com/questions/30017878/where-is-32768-coming- from – committedandroider

4

Załóżmy, że skonfigurowano R2 tak, aby miał tylko jeden zestaw bitów. Następnie, jeśli wykonasz numer AND z innym rejestrem i odgałęzieniem w stanie Z, testujesz, czy ten bit jest ustawiony. Jeśli tak, to chcesz ustawić poprzedni bit w swoim rejestrze wyników.

Po przesunięciu rejestru jednobitowego w jednym miejscu i powtórzeniu w pętli, powinieneś mieć to, czego potrzebujesz.

(Przepraszam, czy to jest niejasne, ponieważ jest to prawdopodobnie zadanie domowe Staram się unikać po prostu daje odpowiedź)

Edit:

Więc załóżmy, że Twój wkład jest 01001011. zacząć z wynikiem 00000000, maską wejściową 00000010 i maską wyjściową 00000001. Wykonujesz AND i odkrywasz, że jest niezerowy, więc dodajesz maskę wyjściową do wyjścia. Następnie przesuwasz obie maski, aby uzyskać 00000100 i 00000010.

Przy następnym przejściu przez pętlę AND oznacza zero, więc nic nie dodajesz i tak dalej. Pętla kończy się, gdy przesunięcie maski powoduje jej wyzerowanie.

+0

To może zadziałać, ale wydaje mi się, że musi być prostsze w implementacji (jak dodanie go do siebie w lewej zmianie) Masz rację, że to praca domowa, a to ma być w środę (11 kwietnia), więc mam kilka dni na szukanie lepszego rozwiązania, zanim "brutalnie wymuszam" to podejściem. –

+0

To nie jest dokładnie "brutalna siła"; to tylko 9 linii kodu, w tym konfiguracja. –

0

Potrzebujesz dwóch masek. Oba są pojedynczym "1", a reszta "0". Oba są inicjowane do 0000 0000 0000 0001, ale jeden z nich jest przesunięty w lewo o wartość, która ma być przesunięta w prawo. Nazwiemy to Mask1. Niezmieniona liczba będzie Mask2.

Porównaj Mask1 z oryginalnym numerem. Jeśli (Mask1 "i" input)> lub < 0, "lub" Mask2 z wyjściem, a następnie lewy przesuń obie maski.

W obu przypadkach, lewy przesuń obie maski i spróbuj ponownie, aż nie będzie więcej bitów na wejściu do przetestowania.

LC-3 nie ma bitowego "lub". Będziesz musiał "nie" obu operandów "i" ich, a następnie "nie" wynik za bitowy "lub".

Powodem, dla którego testujesz czy Mask1 "i" wejście jest> czy < 0 jest to, że jeśli jest zero, nie chcemy nic robić. Jeśli wynik "i" tych argumentów wynosi> 0, oznacza to, że testowana pozycja znalazła "1" i musi zostać wydrukowana do wyniku. Jeśli maska ​​została przesunięta w lewo, aby stała się 1000 0000 0000 0000, jest to z technicznego punktu widzenia liczba ujemna. "I" tej i dowolnej liczby z "1" w tej pozycji będzie również liczbą ujemną.

+0

Możesz "dodać" zamiast "lub", jeśli wiesz, że nie ma przenoszenia. Tak jest w tym przypadku, ponieważ pracujesz jeden kawałek naraz. –

0

Zakładając prowadzenie 0 można po prostu podzielić przez 2, odejmując od nowa.

więc policzyć, jak często można dodać RX, RX, # -2

Jestem pewien, że to również sposób, aby obejść wiodącego 1.

+1

sposób wokół przypomnienia 1 byłby, do i rejestr z 0xFE przed podzieleniem. ale to rozwiązanie wydaje mi się bardzo powolne – Tommylee2k