2012-04-09 10 views
5

Điều tôi cần thực hiện nó là thực hiện cả dịch chuyển trái bitwise và dịch chuyển phải bitwise sử dụng LC-3 Assembly. Về cơ bản, mỗi bit phải được di chuyển qua một không gian theo hướng dịch chuyển, và một số không lấp đầy không gian trống được tạo ra.Lắp ráp LC3 Bitwise Right Shift

Ví dụ:

phím Shift bên phải:

01001001 
00100100→ 

Left Shift:

01001001 
←10010010 

Tôi đã thực hiện thành công một sự thay đổi trái, bằng cách lấy chuỗi nhị phân, và thêm nó vào bản thân .

Tôi đang bối rối về cách thực hiện ca làm việc đúng. Bất kỳ suy nghĩ sẽ được đánh giá rất cao. Tôi có AND, NOT, ADD hoạt động, các hoạt động di chuyển dữ liệu, bảy thanh ghi để lưu trữ các giá trị và toàn bộ phạm vi bộ nhớ. Tôi chỉ cần một số ý tưởng cơ bản như thế nào nó có thể được thực hiện.

Nếu bạn cần tham chiếu Bộ chỉ dẫn LC-3, có one here.

+0

cho một tham chiếu LC-3 ISA : http://www.cs.utexas.edu/users/fussell/cs310h/lectures/Lecture_10-310h.pdf –

Trả lời

1

Ồ, đó là một tập lệnh khá tối thiểu.

Nếu bạn có 256 byte bộ nhớ khả dụng, thì bảng tra cứu có thể là cách để đi.

Bạn có thể làm điều đó mà không cần bộ nhớ dữ liệu bằng cách sử dụng vòng lặp trên mỗi vị trí bit, sử dụng AND để trích xuất bit.

+0

Bạn có thể xem cái này không? http://stackoverflow.com/questions/30017878/where-is-32768-coming-from – committedandroider

4

Giả sử bạn thiết lập R2 để nó chỉ có một bộ bit. Sau đó, nếu bạn thực hiện một số AND với một thanh ghi và chi nhánh khác trên điều kiện Z, bạn đang kiểm tra xem bit đó có được đặt hay không. Nếu có, bạn muốn đặt bit trước đó trong thanh ghi "kết quả" của bạn.

Nếu sau đó bạn thay đổi đăng ký một bit của bạn trên một địa điểm và lặp lại trong một vòng lặp, bạn sẽ có những gì bạn cần.

(Xin lỗi nếu điều này là không rõ ràng; vì đây là bài tập về nhà có lẽ tôi đang cố gắng để tránh chỉ đem lại cho bạn câu trả lời)

Edit:

Vì vậy, giả sử đầu vào của bạn là 01001011. Bạn bắt đầu với một đầu ra của 00000000, một mặt nạ đầu vào của 00000010, và một mặt nạ đầu ra của 00000001. Bạn làm AND và thấy rằng nó là nonzero, vì vậy bạn thêm mặt nạ đầu ra của bạn để đầu ra. Sau đó, bạn chuyển cả hai mặt nạ lên để nhận 00000100 và 00000010.

Vào lần sau thông qua vòng lặp, AND bằng 0, vì vậy bạn không thêm gì, v.v. Vòng lặp kết thúc khi chuyển mặt nạ làm cho nó không.

+0

Điều này có thể hoạt động, nhưng có vẻ như với tôi rằng phải có một đơn giản hơn để thực hiện nó (như thêm nó vào chính nó trong sự dịch chuyển trái) Bạn chính xác rằng đây là bài tập về nhà, và nó là do thứ tư này (tháng 11), vì vậy tôi có một vài ngày để tìm một giải pháp tốt hơn trước khi tôi "sức mạnh vũ phu" nó với cách tiếp cận này. –

+0

Đây không phải là chính xác "lực lượng vũ phu"; nó chỉ là 9 dòng mã bao gồm thiết lập. –

0

Bạn cần hai mặt nạ. Cả hai người trong số họ là một "1" duy nhất với phần còn lại của họ "0" s. Cả hai được khởi tạo đến 0000 0000 0000 0001, nhưng một trong số chúng được dịch chuyển trái bởi số tiền bạn muốn số gốc được dịch chuyển sang phải. Chúng ta sẽ gọi đó là Mask1. Số không thay đổi sẽ là Mask2.

So sánh Mask1 với số gốc. Nếu (Mask1 "và" đầu vào)> hoặc < 0, "hoặc" Mask2 với đầu ra và sau đó chuyển sang trái cả hai Mặt nạ.

Trong cả hai trường hợp, hãy di chuyển trái cả Mặt nạ và thử lại cho đến khi không có thêm bit nào trong đầu vào để kiểm tra.

LC-3 không có bit "hoặc". Bạn sẽ phải "không" cả hai toán hạng, "và" chúng, sau đó "không" kết quả cho một bitwise "hoặc".

Lý do bạn đang kiểm tra xem Mask1 "và" đầu vào là> hay < 0 là vì nếu nó bằng 0, chúng tôi không muốn làm gì cả. Nếu kết quả của "và" ing các toán hạng này là> 0, thì điều đó có nghĩa là vị trí được kiểm tra tìm thấy "1" và nó cần được in ra kết quả. Nếu mặt nạ đã bị dịch chuyển sang trái để trở thành 1000 0000 0000 0000, đó là về mặt kỹ thuật số âm. "Và" của số đó và bất kỳ số nào có dấu "1" ở vị trí đó cũng sẽ là số âm.

+0

Bạn có thể 'thêm' thay vì' hoặc' nếu bạn biết không có carry. Đây là trường hợp ở đây bởi vì bạn làm việc một chút tại một thời điểm. –

0

Giả sử một số 0 hàng đầu bạn chỉ có thể chia cho 2, bằng cách trừ đi một lần nữa và một lần nữa.

Vì vậy, đếm mức độ thường xuyên bạn có thể ADD RX, RX, # -2

tôi chắc chắn rằng đó cũng là một cách để làm việc xung quanh một lãnh đạo liên kết làm việc 1.

+1

một cách xung quanh lời nhắc 1 sẽ là, đến và thanh ghi với 0xFE trước khi chia. nhưng giải pháp này trông giống như một giải pháp rất chậm đối với tôi – Tommylee2k