본문 바로가기
카테고리 없음

명령어 서브루틴

by by이종호기자 2022. 4. 29.
반응형

프로그램내에서 여러 번 사용되는 공통된 명령어들을 서브루틴이라고 하며 프로그램상에서 서브루틴이 사용되어질 때마다 서브루틴을 시작하는 곳으로 분기하는 명령어가 실행됩니다. 서브루틴이 실행된 후 다시 주 프로그램으로 되돌아오게 됩니다.

1. 서브루틴이란?

주 프로그램의 어떤 곳에서도 서브루턴으로 분기할 수 있는데 이를 위해서 서브루틴의 실행 후 돌아와야 할 리턴 주소를 저장할 필요가 있습니다. 기본 컴퓨터에서 주 프로그램과 서브루틴 사이의 링크는 BSA 명령어에 의하여 실행되는데 누산기의 내용을 왼쪽으로 4번 시프트하는 서브루틴을 예로 들어봅시다.

2. 서브루틴 예시

표 6-16의 프로그램은 X의 값을 AC에 로드함으로써 시작되며 101 번지에 BSA 명령어가 있습니다. 서브루틴 SH4는 작업을 마치고 주소 102로 돌아와 야 하는데 BSA 명령어가 실행될 때 제어 장치는 리턴 주소 102를 기호 주소 SH4에 의해서 지정된 영역(여기서는 109)에 저장합니다.

그 다음에 SH4 + 1의 값 을 프로그램 카운터에 넣는데 이 명령어가 실행된 후에는 메모리 영역 109는 16진수 102에 해당하는 이진수값을 갖게 되고 프로그램 카운터는 16진수 10A 에 해당되는 이진수값을 갖게 됩니다. 이러한 동작으로써 리턴 주소를 저장하게 되고 서브루틴은 현재 영역 10A 로부터 시작하게 됩니다. 서브루틴의 마지막 명령어는 컴퓨터를 주 프로그램에 리턴시키는데 이것은 간접 분기 명령어에 의해서 수행됩니다. 따라서 컴퓨터가 분기하여 되돌아오는 주소는 간접 명령어이기 때문에 SH4가 아니라 SH4에 저장된 값이 됩니다.

3. 서브루턴으로부터의 리턴 주소

피연산자가 서브루틴에 전송되어야 하며 서브루틴은 연산 결과를 리턴해야만 합니다. 누산기가 한 개의 피연산자를 전송하고, 그 결과를 받기 위해 사용될 수 있습니다. 다른 하나의 피연산자는 표 6-17과 같이 BSA 명령 다음에 오는 영역에 삽입됩니다.

영역 X에 있는 첫번째 피연산자가 AC에 로드되고 두번째 피연산자는 BSA 명령 다음의 영역 202에 저장되며 분기 후에는 서브루틴의 첫번째 영역에는 숫자 202가 들어 있게 됩니다. 이 경우 202는 리턴 주소가 아니라 두번째 피연산 자의 주소입니다.

서브루틴은 AC의 피연산자를 보수화시키고 그것을 임시 저장 영역 TMP에 저장함으로써 OR 연산을 시작한다. 두번째 피연산자는 영역 OR 에 있는 간접 주소 명령에 의해서 AC로 로드됩니다. 영역 OR은 숫자 202 를 포함하고 있습니다.

명령어가 그것을 간접적으로 참조하 게 되면 영역 202에 있는 피연산자가 AC로 로드되고 이 피연산자는 보수화된 TMP에 저장된 피연산자와 AND되어지며, 그 결과를 보수화시키면 OR 연산 을 한 결과가 됩니다. 서브루턴으로부터의 리턴 주소는 주 프로그램이 203번지로부터 시작되도록 조정되어 있어야 하는데 이러한 동작을 영역 OR을 ISZ명령어로 증가시킴으 로써 실행할 수 있습니다. 현재 영역 OR에 203이 들어 있으면 간접 BUN명령어로써 적당한 장소로 리턴할 수 있게 됩니다.

4. BSA 명령어

BSA 명령어 다음에 여러 개의 피연산자를 가질 수 있습니다. 서브루틴은 각 피연 산자를 가져오기 위해서 서브루턴의 첫번째 영역에 저장되어 있는 리턴 주소를 증가시켜야 하며 최종적으로 주 프로그램으로 리턴하기 위해서 역시 이 영역의 내용을 증가시킨 후 그 결과를 리턴 주소로 사용해서 돌아올 수 있게 됩니다.

매우 많은 양의 데이타가 전송되어질 경우는 그 데이타를 한 블럭의 저장 장소에 놓고 그 블럭 첫 항목의 주소를 링킹 파라미터로 사용할 수 있습니다. 100번지에서 시작되는 데이타 블럭을 주소 200 에서 시작되는 블럭으로 이동 시키기 위한 서브루틴은 표 6-18과 같습니다. 블럭의 길이는 16워드이며 첫번째 명 령어는 서브루틴 MVE 로의 분기입니다.

첫째로 주 프로그램으로부터 세 개의 파 라미터 100. 200. -16을 전송해서 해당되는 저장 영역에 각각 저장시킨다. 각 항목들은 두 개의 포인터를 사용함으로써 이동되며, 카운터는 16개의 항목만 을 전송하는 데 이용됩니다. 서브루틴이 끝나게 되면 주소 200 에서 시작한 블럭에 이동된 데이타가 저장되고 HLT명령에 의해서 주 프로그램으로 리턴됩니다.

반응형

댓글