2016-10-05 5 views
1

LC3 시뮬레이터 용 프로그램을 작성하려고합니다. 메모리의 다른 곳에 저장된 이진수의 1을 계산할 수 있습니다.LC3 시뮬레이터를 사용하여 이진수로 1의 수를 계산하십시오.

0011 0001 0000 0000 ; Start the data at memory location x3100 
0110 1010 1111 0001 ; Hex number stored at x3000 

0011 0000 0000 0000 ; Start the program at x3000 
0101 001 001 1 00000 ; Clear R1 (Contain address of number) 
0101 010 010 1 00000 ; Clear R2 (Counter for amount of 1's) 
0001 011 011 1 00001 ; Load R3 with 1 (Number for 'and-ing' with number getting checked) 
;^cant do this line since that is a decimal 1 not binary one therefore it wouldnt left shift 
; and cant store and get a binary number in memory 

0001 100 100 1 01111 ; Load R4 with 16 (Loop loops til 0) 
1110 001 011111100 ; Load R1 with address of number 
0110 101 001 000000 ; Load R5 with the number stored at x3100 
0101 110 101 000 011 ; And R3 with R5 store result in R6 
         ; If number is not zero, increment R2 by 1 
0001 011 011 000 011 ; Add R3 with itself to make a left shift 
0001 100 100 1 11111 ; Decrement R4 by 1 
         ; Loop to x3006 (When R3 is 'And-ed' with R5) if R4 isnt 0 
0011 010 011111101 ; Store value from R2 in x3101 
1111 0000 00100101 ; Halt (Is this correct?) set breakpoint here 

내가 만드는 방법과 같은 혼란 스러워요에 "문이"조건이 충족되지 않을 경우 어떻게 다시 특정 시점에 루프뿐만 아니라 특정 값을 확인하려면 여기에 지금까지 가지고있는 것입니다. 실제로 1의 수를 계산하는 방법에 대한 내 생각 과정은 결과 값이 0이 아니면 "1의 카운터"에 1을 더한 다음 1 값을 왼쪽으로 시프트 한 다음 원래의 이진수를 "0000000000000001"로 확인하는 것입니다. 원래 번호의 다음 값을 확인하십시오. 나는 내가 3 진수 1보다는 2 진수 1에 10 진수 1을 저장하고 그것을 왼쪽으로 옮길 수 없다고 믿었 기 때문에 나는 어떤 행을 할 수 없다고 언급했다. 내 제한 사항 중 하나는 x3100 및 x3101보다 메모리에서 다른 위치를 사용하여 원래의 번호를 저장하고 1의 양을 각각 저장한다는 것입니다.

비트 마스크가 매우 유용 할 것이라고 들었지만 높고 낮음을 검색하여이를 사용하는 방법을 찾을 수 없습니다. 어떤 도움을 주시면 감사하겠습니다. 감사합니다!

답변

0

여기에 R6에 저장된 1을 계산하는 코드가 있습니다. 기본적으로 x7562로 채워집니다. 분기 및 레이블을 사용하여 서브 루틴을 처리하십시오. ##

.ORIG x3000 ;start point 

;R6 is the the register of number stored 
;R1 is the register for manipulation of the number stored 
;R2 is the counter for number of 1s 
;R3 is the bitmask 
;R4 is the loopcounter 
;R5 is the storage for AND operation 

AND R1,R1,#0; Clean R1 
AND R2,R2,#0; Clean R2 
AND R3,R3,#0; Clean R3 
AND R4,R4,#0; Clean R4 
AND R5,R5,#0; Clean R5 

ADD R3,R3,#1; Set the value of R3 to 1 
ADD R4,R4,#15; Set the loop counter to 15 

LD R6,FILL_R6 
ADD R1,R6,#0; 

CHECK AND R5,R3,R1; 
     BRz #1; 
     ADD R2,R2,#1; 
     ADD R3,R3,R3; Left shift bitmask 
     ADD R4,R4,#-1 
     BRzp CHECK 

STI R2,STORE_x5000 

FILL_R6  .FILL X756 
STORE_x5000 .FILL x5000 

.END