명령 실행기는 pc가 가리키는 명령을 가져와 명시적인 레지스터 파일을 바꾸고 숫자 분기 대상을 따라 halt까지 진행할 수 있습니다.
생각해 볼 질문
숫자 프로그램 카운터 하나가 대입과 검사와 제어 이동을 어떻게 조정할까요?
해결된 명령을 직접 인덱싱되는 컨트롤러 벡터에 저장하기
명시적인 레지스터 파일에 n, product, flag, pc 유지하기
assign, test, branch, goto, halt 명령 해석하기
실행을 제한하고 눈에 보이는 상태 이력 유지하기
컨트롤러는 이전 조립기 수업에서 생성된 숫자 대상을 사용합니다. 상태 벡터는 n, product, flag, pc 순서의 레지스터 파일입니다. 주기마다 controller[pc]를 가져옵니다. assign이나 test는 pc를 진행시키고, branch는 7을 선택하거나 앞으로 나아가며, goto는 2를 쓰고, halt는 레지스터를 반환합니다.
첫 번째 프로그램은 n이 2인 상태에서 전체 컨트롤러를 실행하여 product를 2로 남깁니다. 두 번째 프로그램은 n이 1인 상태에서 시작하여 halt가 아닌 모든 명령 뒤에 pc, n, product, flag를 기록합니다. 두 실행 모두 40단계 보호 장치를 둡니다. 명령 실행기는 해결된 컨트롤러 벡터 위에서 assign, test, branch, goto, halt를 처리합니다.
첫 번째 프로그램은 (0 2 #t 7)을 반환합니다. 두 번째 프로그램은 ((1 1 0 #f) (2 1 1 #f) (3 1 1 #f) (4 1 1 #f) (5 1 1 #f) (6 0 1 #f) (2 0 1 #f) (3 0 1 #t) (7 0 1 #t))를 반환합니다.
실행 추적에서 볼 점
각 명령 전에 현재 pc 위치의 vector-ref를 따라가세요. product와 n 대입, pc 2에서 flag가 참이 되는 순간, 거짓 분기가 pc 4로 진행하는 과정, goto가 pc 2로 복원하는 과정, 참 분기가 pc 7에서 halt를 선택하는 과정을 찾으세요. 실행 흐름은 40단계 보호 장치 아래에서 이 컨트롤러를 기록합니다.
직접 해보기
프로그램을 수정하고 결과를 비교해 보세요.
첫 번째 컨트롤러의 초기 n 상수를 0으로 바꾸세요. 최종 레지스터를 예측하고 참 분기가 어떤 대입을 건너뛰는지 식별하세요.
힌트 보기
product가 1이 된 뒤 test는 flag를 참으로 만들고 branch는 pc에 직접 7을 씁니다.