함수(또는 프로시저나 서브루틴)는 코드를 재사용(reuse)하는 주요 수단이다.
함수는 호출(call)하여 사용한다.
함수는 호출 뒤 다시 원래 자리로 돌아가야한다.
다만, 어디서 함수로 들어갔는지를 기억해야하는데,
이때 함수가 들어간 위치가 바로 프로그램 카운터(PC) 값이다.
위의 그림과 다음의 함수 호출 과정 예제와 비교해보자
주소 | 명령어 | 피연산자 | 설명 |
---|---|---|---|
100 | pca | 프로그램 카운터 → 누산기 | |
101 | add | 5(즉시) | 함수에서 돌아올 주소(100+5=105) |
102 | store | 200(직접) | 반환 주소를 메모리(200번지)에 저장 |
103 | load | 3(즉시) | 값(함수의 파라미터값)을 누산기에 넣기 |
104 | bra | 300(직접) | 함수를 호출(함수로 분기) |
105 | 함수 반환 뒤 실행 계속 | ||
… | |||
200 | 함수에서 돌아올 주소를 저장하기 위해 미리 확보해둔 메모리 위치 | ||
… | |||
300 | cube 함수 시작 | ||
… | cube 함수의 나머지 명령어들 | ||
310 | bra | 200(간접) | 저장했던 주소로 돌아감(간접 주소 지정을 사용해 분기 |
이 과정에는 상당히 많은 작업이 필요하다. 따라서 대부분 기계는 이런 과정을 돕는 명령어들을 제공한다. 예를 들어, 링크 레지스터를 사용한 BL이라는 명령어는 함수로 호출하는 명령어와 현재 명령어의 다음 위치(PC + 4)를 저장하는 명령어를 하나로 합친 것이다.