2017-11-18 17 views
0

필자는 먼 메모리 위치에서 일치가 발생한 16 진수 주소 목록을 저장하기 위해 파일에서 char의 발생 횟수를 계산하는 프로그램을 적용하려고합니다. 코드 :프로그램 카운터를 먼 메모리 주소로 즉시 이동시킬 수 있습니까?

011 0000 0000 0000 ;Codes x3000 as Load-address of program 
0101 010 010 1 00000 ;R2 <- 0 
0010 011 000010000 ;R3 <- M[x3012] 
1111 0000 0010 0011 ;TRAP x23 (Loads INPUT into R0) 
0110 001 011 000000 ;R1 <- M[R3] 
;LOOP BEGINS HERE 
0001 100 001 1 11100 ;R4 <- R1 - EOT 
0000 010 000001000 ;If above = 0, exit loop 
1001 001 001 111111 ;R1 <- NOT R1 
0001 001 001 1 00001 ;R1 <- R1 + 1 
0001 001 001 0 00 000 ;R1 <- R1 + R0 
0000 101 000000001 ;If above != 0, do NOT increment counter 
0001 010 010 1 00001 ;R2 <- R2 + 1 (increment counter) 
0001 011 011 1 00001 ;R3 <- R3 + 1 (increments pointer to next char in file) 
0110 001 011 000000 ;R1 <- M[R3] (loads next char into R1) 
0000 111 111110110 ;BRnzp x3004 (unconditionally RETURN to loop start) 
;LOOP ENDS HERE 
0010 000 000000100 ;R0 <- M[x3013] 
0001 000 000 0 00 010 ;R0 <- R0 + R2 
1111 0000 0010 0001 ;TRAP x21 (OUTPUT) 
1111 0000 0010 0101 ;TRAP x25 (HALT) 
0011 0001 0000 0000 ;Codes x3100 for the starting address of the file 
0000 000 000110000 ;ASCII template 

내 프로그램이 메모리 주소 x3000에서 시작됩니다. x300B ("증가 R2"명령어 아래)에서 목록을 처리 할 지침 세트를 시작하겠습니다. 문제는 x3500에서 목록을 시작하고 싶습니다. "효율적인"방법을 알지 못합니다.

내 원래 계획은 LDI (Load Indirect) 명령을 사용하는 것이었지만 부호 확장으로 인해 9 비트 오프셋은 최대 x00FF = 0000 0000 1111 1111의 오프셋 만 허용하고 x300C (프로그램 카운터가 증가한 x300B)에서 x310B.

"실용적인 해결 방법"은 레지스터 (예 : R5)에 x310B 주소를 저장하고 R00에 값 x00FF를 저장하고 반복적으로로드 유효 주소 (LEA) 명령어를 사용하는 것입니다. R6에 값 x0092를 저장하고, R5에 추가하고, R5에 x3500을 넣을 시점에 x3408에 도달 할 때까지 R6에 R6을 추가합니다 (즉, 3 개의 ADD 명령어가 필요함). 그 시점에서

가, 나머지는

실제로하지 않은 사소한 (목록의 "자리"적절한으로 현재 경기의 주소를 넣어 것에 저장 R3 (R5 + 카운터))입니다 위에 설명 된 x3500에 도달하는 전체적인 방법이 실제로 성 가시고 서투른 것처럼 보이기 때문에이 작업을 아직 완료하지 않았습니다. 동시에 많은 메모리 주소를 이동하는 더 빠르고 더 빠른 방법이 있어야한다는 느낌을 떨칠 수 없습니다.

x300C에서 x3500까지 단일 명령으로 이동할 수 있습니까? 심지어 2 개라도 현재 가지고있는 것보다 낫습니다.

답변

1

그렇게하고 싶지는 않을 수도 있지만 더 간단한 방법은 LD (opcode 0010)와 LDR (opcode 0110)을 사용하여이를 수행하는 것입니다. PC를 x3500으로 옮길 필요가 없습니다. (배열의 데이터를 잘못 실행하기 시작합니다)

주소에 비트가 포함되어 있습니다. 0011 0101 0000 0000 opcode 0010을 사용하면 x3500을 레지스터로 가져올 수 있습니다 . 그러면 Opcode 0110에서 배열의 값을로드 할 수 있습니다.