Procedure Call & Return
Last updated
Last updated
procedure caller는 callee가 접근 가능한 argument register들에 함수의 파라미터들을 저장한다.
callee 주소로 jump and link
하여 callee 명령어를 수행하고 수행이 완료되면 돌아올 주소값을 $ra에 저장한다. 이 때 jal 명령은 $ra에 관련된 값을 덮어쓰므로, jal 명령어를 호출하기 전 $ra의 값을 메모리 등 다른 곳에 저장해야 한다.
이 때 callee는 stack frame을 할당받아 로컬 변수를 저장한다.
argument register, return address register의 경우 프로시저 내에서 또다른 프로시저, 함수를 콜 할 때마다 덮어쓰이기 때문에 stack에 저장해두고 하위 작업이 완료되면 다시 register에 불러와서 사용한다.
stack은 높은 주소값에서부터 낮은 주소값으로 자라난다.
stack pointer: 가장 최근에 스택으로 할당된 주소값에 대한 포인터
frame pointer: top stack frame의 맨 아래(가장 높은) 주소값에 대한 포인터
MIPS에서는 각 Register의 역할을 정의해두고 있다.
factorial을 구하는 간단한 c 코드를 어셈블리어를 사용하여 직접 구현할 수 있다.