
정답
① AC로 적재될 데이터의 유효 주소: \(1000 + 1200 = 2200\) 번지
② sub() 호출 시 (나)의 동작 순서: ② → ① → ③
출제 의도
이 문제는 베이스 레지스터 주소지정 방식에서 유효 주소를 계산하는 법을 확인하고, 서브루틴 호출 시 PC, SP, BR, AR 사이의 마이크로 동작 순서를 이해하고 있는지를 평가하기 위한 것이다. 베이스 레지스터에 기준 주소를 두고 명령어의 변위와 더해 실제 데이터가 있는 주소를 구하는 것, 그리고 호출 직전에 복귀 주소를 스택에 저장한 뒤 서브루틴 시작 주소를 PC에 적재하는 순서를 파악해야 한다.
풀이 과정
조건에서 컴파일된 기계어 코드는 메모리 주소 1000번지부터 적재되며, 이 주소가 코드 내 변수 위치의 기준 주소라고 하였다. 또한 베이스 레지스터 주소지정 방식에서는 유효 주소가 “기준 주소(베이스 레지스터의 내용) + 변위(B)”라고 주어져 있다.
따라서 베이스 레지스터 \(R\) 에는 기준 주소인 1000이 들어 있고, 명령어 LOAD의 주소 필드에는 변위 \(B = 1200\) 이 들어 있다.
$$ \text{유효 주소} = R + B = 1000 + 1200 = 2200 $$
따라서 LOAD B가 실행될 때 AC로 적재될 데이터는 메모리 주소 2200번지의 내용이다.
이제 서브루틴 sub() 호출 시의 (나)의 동작 순서를 살펴보자. 서브루틴 호출 시 해야 할 일은 다음과 같다.
첫째, 되돌아올 주소(복귀 주소)를 잃지 않도록 현재 PC 값을 어딘가에 보관해야 한다. 이것이 버퍼 레지스터 BR에 PC의 내용을 저장하는 동작이며, (나)의 ②번 “PC를 BR에 저장한다.”에 해당한다. 복귀 주소는 현재 PC에 들어 있으므로, 서브루틴 주소를 PC에 적재하기 전에 이 동작이 먼저 수행되어야 한다.
둘째, 스택에 복귀 주소를 저장하고 서브루틴의 시작 주소를 PC에 적재해야 한다. 스택에 저장하려면 스택 포인터 SP의 값을 주소 레지스터 AR로 옮겨야 하고, 동시에 호출할 서브루틴의 주소를 PC에 적재해야 한다. 이것이 ①번 “SP는 AR에, 서브루틴 주소는 PC에 저장한다.”에 해당한다. 이 동작은 스택에 쓸 주소를 준비하는 의미에서 ③번보다 먼저 수행되어야 한다.
셋째, BR에 임시로 저장된 복귀 주소를 스택에 실제로 저장하고, 스택 포인터를 하나 감소시켜 스택이 한 칸 사용되었음을 나타낸다. 이것이 ③번 “BR의 내용을 스택에 저장하고, SP를 하나 감소시킨다.”에 해당한다.
종합하면, 의존 관계는 다음과 같다. 복귀 주소를 잃지 않기 위해 ②(PC→BR)가 ①보다 먼저, 그리고 스택에 기록하기 위해서는 ①에서 AR에 SP를 옮겨놓은 뒤 ③에서 스택에 쓰기를 해야 한다. 따라서 올바른 순서는
$$ ② \;\rightarrow\; ① \;\rightarrow\; ③ $$
이다.
<풀이가 부정확할 수 있으니 반드시 교차검증 확인 바랍니다.>