-
[문제해설] 그림과 같은 어느 프로그램 중 0123번지에 CALL A 명령이 있다. 이 CALL A를 수행한 후 PC에 기억된 값은?(단, 모든 명령문은 1바이트라 하자.)전자계산기조직응용기사/필기 기출문제 해설 2022. 5. 31. 05:19반응형
전자계산기조직응용기사 필기 기출문제 해설(5과목 마이크로 전자계산기-서브루틴과 스택) - 2003년1회
그림과 같은 어느 프로그램 중 0123번지에 CALL A 명령이 있다. 이 CALL A를 수행한 후 PC에 기억된 값은?(단, 모든 명령문은 1바이트라 하자.)
① 0124 ② 1234
③ 1285 ④ 2345
- 문제 해설 -
본 문제에서의 call 명령어는 서브루틴을 호출하는 명령어입니다.
이러한 프로그램의 수행을 서브루틴으로 넘어가게 하는 명령어는 call subroutine, jump to subroutine, branch to subroutine, branch and save address 등으로 불립니다.
이러한 서브루틴을 부르는 명령어는 다음 두 동작에 의해 수행됩니다.
- 현재 프로그램 카운터의 값(return address)을 어떤 위치에 기억시켜 놓는다.
- 프로그램 수행이 서브루틴의 시작으로 가게 한다.
그리고 모든 서브루틴은 특정한 작업을 수행 후, 마지막 명령어는 반드시 return from subsoutine, 즉 서브루틴을 호출했던 위치로 복귀합니다.
이러한 알고리즘을 이해하고, call명령어의 마이크로 연산을 RTL(Register Transfer Language)로 살펴보면 다음과 같습니다.
SP ← SP + 1 ;스택 포인터를 하나 증가시킨다.
M[SP] ← PC ;PC의 내용을 스택에 놓는다.
PC ← 유효 주소 ;서브루틴으로 프로그램이 수행되게 한다.위 RTL에서 주목해야 될 부분은 사용되는 레지스터들입니다. 서브루틴을 호출하는 명령어들은 SP(스택 포인터)을 사용하여 스택에 PC의 값을 저장시킨 후, call 명령어의 오퍼랜드인 유효 주소를 PC에 놓게 됩니다. 그 유효 주소는 당연히 서브루틴의 시작 주소입니다. PC는 수행할 명령어의 위치를 가리키는 레지스터이므로 call 명령어 수행 후 CPU는 서브루틴의 시작주소의 명령어를 Fetch하여 수행하게 되는 것입니다. 정리하자면, call 명령어 수행후 스택에는 나중에 복귀해야 할 주소인 PC의 값을 저장한 후, PC에는 서브루틴의 시작 주소가 저장됩니다.
참고로, 서브루틴에서의 작업이 모두 끝난 후에 복귀를 위한 return from subrutine 명령어의 RTL은 다음과 같습니다.
PC ← M[SP] ;스택의 top의 값을 PC에 넣는다.
SP ← SP - 1 ;SP를 하나 감소시킨다.서브루틴 작업이 끝난 후 복귀를 할 때는 위의 RTL과 같이 스택에 저장해놓은 복귀 주소를 PC에 놓는 것으로 구현됩니다. 두 번째 코드는 스택의 POP(출력) 이후의 top의 값을 감소시키는 스택의 출력 동작입니다.
그럼 본문제를 살펴보겠습니다.
문제에서 제시하고 있는 그림은 CFG(Control Flow Graph)의 일종으로 프로그램의 흐름을 edge(선)로 표현하였습니다.
우선 'CALL A'라는 명령어는 앞서 설명했듯이 서브루틴을 호출하는 명령어이고, 오퍼랜드인 A는 호출할 서브루틴의 위치를 뜻하는 유효 주소입니다.
그리고 결정적으로 묻고 있는 것은 'CALL A' 명령어 수행 후의 PC에 기억된 값을 묻고 있습니다.
간단한 문제이지만, 쓸데없는 정보를 중요한 것처럼 제시하고 있습니다. 그래서 응시생은 물론이고 인터넷과 수험서 등에 수많은 엉터리 풀이가 생산되게 한 유형의 문제입니다.
우선 쓸모없는 단서를 살펴보겠습니다.
'(단, 모든 명령문은 1바이트라 하자.)'라는 단서는 함정입니다. 명령문의 크기는 메모리의 word의 크기를 짐작할 수 있는 단서이지만, 명령어의 크기는 메모리 주소와 프로그램 흐름에는 아무런 관계가 없습니다. 다음 명령어의 위치를 나타내는 PC의 값이 명령어 Fetch 후 항상 1씩 증가하듯이, 메모리 주소는 연속적이며 word의 크기와는 아무런 상관이 없습니다. 다음 그림에서 직관적으로 이해하실 수 있습니다.
그리고 문제에서 주서진 그림인 CFG에서는 서브루틴이 A와 B 두 개를 표현하고 있습니다. 서브루틴 A가 실행 중에 서브루틴 B를 호출하는 알고리즘을 표현하고 있습니다. 하지만, 문제에서 묻는 것은 'CALL A' 명령을 실행 후를 묻고 있으므로 서브루틴 B에 대해서는 신경 쓸 필요 없는 정보입니다.
그럼 주소 0123에 있는 'CALL A' 명령어를 수행하면 PC와 스택의 값은 어떻게 변하는지 살펴보면,
앞서 본 call 명령어의 RTL에 따라 스택에는 PC의 값인 0124가 저장됩니다. 'CALL A'를 CPU가 FECTH 하면서 PC의 값은 1 증가되기 때문입니다. 그 후 PC에는 명령어의 오퍼랜드이자 유효 주소인 A가 저장됩니다. A는 CFG에서 '1234'라는 것을 확인할 수 있습니다. 그리서 정답은 2번입니다.
아래는 본문제와 같은 유형의 문제해설입니다. 반드시 같이 확인하시며 학습하길 권합니다.
https://fishbone-s-present.tistory.com/129
https://fishbone-s-present.tistory.com/131?category=1003569
https://youtube.com/playlist?list=PLboXycXmAIDuukQ2A6EvMZI-x1IMy3Xc-
반응형'전자계산기조직응용기사 > 필기 기출문제 해설' 카테고리의 다른 글