2012-04-09 2 views
5

내가 수행해야하는 작업은 비트 왼쪽 시프트와 LC-3 Assembly을 사용한 비트 오른쪽 시프트를 모두 구현해야합니다. 기본적으로 모든 비트는 시프트 방향으로 한 공간 위로 이동해야하며 0은 생성 된 빈 공간을 채 웁니다.LC3 어셈블리 비트 단위 오른쪽 시프트

예 :

오른쪽 Shift :

01001001 
00100100→ 

왼쪽 Shift :

01001001 
←10010010 

I 성공적 이진 문자열을 가지고, 그 자체에 추가하여, 왼쪽 변화를 구현했습니다 .

나는 오른쪽 교대를 수행하는 방법에 난처한 편이다. 어떤 생각이라도 대단히 감사하겠습니다. AND, NOT, ADD 연산, 데이터 이동 연산, 값을 저장하는 7 개의 레지스터 및 전체 메모리 범위가 있습니다. 나는 그것이 구현 될 수있는 기본적인 아이디어가 필요하다.

LC-3 명령어 세트 참조가 필요한 경우 one here입니다.

+0

근무 링크를 해결하는 방법도있다 RX, RX, # -2 확실 해요

을 추가 할 수 있습니다 빈도를 계산 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을 설정하여 단일 비트 세트 만 갖도록한다고 가정합니다. 그런 다음 다른 레지스터로 AND을 실행하고 Z 조건에서 분기를 수행하는 경우 해당 비트의 설정 여부를 테스트하고 있습니다. 그럴 경우 "결과"레지스터에 이전 비트를 설정해야합니다.

그런 다음 단일 비트 레지스터를 한 곳으로 이동하고 루프를 반복하면 필요한 것이 있어야합니다.

(사과이 모호한 경우,이 내가 당신에게 답변을 제공하는 단지 피하기 위해 노력하고있어 아마도 숙제 때문에)

편집 :

따라서, 귀하의 의견을 생각하는 당신은 시작 01001011.입니다은 00000000의 출력, 00000010의 입력 마스크 및 00000001의 출력 마스크를 사용합니다. AND를 수행하고 0이 아닌 것을 확인하면 출력 마스크를 출력에 추가합니다. 그런 다음 두 마스크를 모두 00000100 및 00000010으로 이동합니다.

다음에 루프를 통과하면 AND는 0이므로 아무 것도 추가하지 않습니다. 루프를 종료하면 마스크가 이동하여 0이됩니다.

+0

이것은 작동 할 수 있지만, 나에게있어 그것을 구현하는 것이 더 간단해야합니다 (왼쪽 시프트에서) 이것이 숙제 인 것이 맞습니다. 이번 수요일 (11 월 4 일)에 만기가되었으므로이 접근법으로 "무차별 대입"하기 전에 더 좋은 해결책을 모색하는 데 며칠이 걸릴 것입니다. –

+0

이것은 정확히 "무력"이 아닙니다. 설정을 포함하여 9 줄의 코드 만 있습니다. –

0

두 개의 마스크가 필요합니다. 둘 다 단일 "1"이며 나머지는 "0"입니다. 둘 다 0000 0000 0000 0001으로 초기화되지만, 그 중 하나는 원래 숫자를 오른쪽으로 이동시키기를 원하는 양만큼 왼쪽으로 시프트됩니다. 우리는 Mask1이라고 부를 것입니다. un-shifted 숫자는 Mask2가됩니다.

마스크 번호를 원래 번호와 비교하십시오. (Mask1 "및"input)> 또는 <이 0이면 "또는"출력이있는 Mask2와 두 마스크를 왼쪽으로 시프트합니다.

두 경우 모두 마스크를 왼쪽으로 이동하고 테스트 할 입력에 비트가 없을 때까지 다시 시도하십시오.

LC-3에는 비트 "또는"이 없습니다. "피연산자"가 아닌 "및"그 다음에 ","비트 식 결과 "또는"결과가 아닙니다. "

Mask1 "및"input is> 또는 <이 0인지 여부를 테스트하는 이유는 0 일 경우 아무 것도하지 않기 때문입니다. 이 피연산자 "and"의 결과가> 0이면 테스트 된 위치가 "1"을 찾았으며 결과에 인쇄해야 함을 의미합니다. 마스크가 1000 0000 0000 0000이되도록 왼쪽으로 이동하면 이것은 기술적으로 음수입니다. 해당 위치의 "1"이 포함 된 숫자 및 "and"는 음수가됩니다.

+0

캐리가 없다는 것을 안다면'또는'대신'추가 '할 수 있습니다. 이것은 한 번에 한 비트 씩 작업하기 때문에 여기에 해당됩니다. –

0

앞에 0을 붙이면 2로 나누고 다시 뺄 수 있습니다.

그래서 당신은 LC-3 ISA의 참조를 위해 선도적 인 1.

+1

리마인더 1 주위의 길은 나누기 전에 0xFE로 등록해야합니다. 하지만이 솔루션은 나를 위해 매우 느린 것 같습니다 – Tommylee2k