필자는 먼 메모리 위치에서 일치가 발생한 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 개라도 현재 가지고있는 것보다 낫습니다.