본문 바로가기
정글

TIL(13일차) re : 프로시저

by 진득한진드기 2023. 5. 4.

프로시저

 

프로시저 호출은 소프트웨어에서의 주요 추상화이다.

 

잘 설계된 소프트웨어는 무슨 값이 계산되고, 이 프로시저가 프로그램 상태에서 무슨 효과를 갖는지에 대한 맹쾌하고 간결한 인터페이스 정의를 제공한다.

 

일부 동작의 구체적인 구현은 감춰주는 방식의 프로시저를 추상화 매커니즘으로 사용한다.

 

프로시저가 호출 될때 아래 3개중 1개 이상의 메커니즘이 연관된다.

 

* 제어권 전달: 프로그램 카운터는 진입할 때 다른 프로시저에 대한 코드의 시작주소로 설정되고, 리턴할 때는 시작 프로시저에서 다른 프로시저를 호출하는 인스트럭션 다음의 인스트럭션이 설정되어야 한다.

 

* 데이터 전달 : 프로시저는 하나 이상의 매개변수를 다른 프로시저에 제공할 수 있어야 한다. 호출된 프로시저는 다시 처음 프로시저로 값을 리턴할 수 있어야 한다.

 

* 메모리 할당과 반납:  다른 프로시저를 호출하고 그 프로시저가 시작할 때 지역변수들을 위한 공간을 할당할 수도 있고, 리턴할 때 이 저장소를 반납할 수 있어야한다.

 


런타임 스택

 

하나의 프로시저(P)에서 다른 프로시저(Q)를 호출 했을때 호출을 한 프로시저는 일시적으로 정지 되는 것을 확인 할 수있다.

 

즉 다른 프로시저(Q)를 호출 했을때, 호출된 프로시저(Q)가 실행되는 동안 자신의 지역변수(P)를 위한 새로운 공간을 할당 할 수 있는 능력이나 다른 프로시저로의 호출을 설정하는 능력만을 필요로 한다.

 

후에 호출된 프로시저가(Q) 종료되면 자신이 할당 받은 저장장소를 반납될 수 있다.

 

%rsp는 스택의 최상위 원소를 가리킨다.

 

데이터는 pushq와 popq 인스트럭션을 이용해서 스택에 저장되고 읽어올 수 있다.

 

특정 값으로 초기화 되지 않은 데이터를 위한 공간은 적당한 양의 스택 포인터를 감소시켜서 간단히 할당 될 수 있다.

 

현재 실행중인 프로시저에 대한 프레임은 항상 스택의 맨 위에 위치한다.

 

호출하는 프로시저(P)가 프로시저 Q를 호출할 때 리턴주소를 스택에 푸시해서 호출된 프로시저(Q)가 리턴할 때 P에서 프로그램이 실행을 재시작해야하는 위치를 가르킨다.

 

프로시저 스택 프레임

 

흐름을 보면 Main에서 현재 실행될 명령어를 가르키는 %rip는 main의 시점을 가르키고 

 

rsp는 임의의 840이 할당된다.

 

mulstore이 실행되고나서는 rip는 mulstore의 시작지점으로 바뀐다.

 

그리고 rsp는 주소체계인 2바이트 만큼 줄어들고 그 내부에 돌아갈 주소를 스택 프레임에 삽입한다.

 

이후 실행에서 돌아왔을 때는 다음과 같이 ret되면서 다시 실행되야할(스택에 삽입 되었던) 0x400568로 돌아가 명령을 시행한다.

 


재귀 프로시저

각 프로시저 콜은 스택상에 자신만의 사적인 공간을 가지며, 따라서 다수의 별도의 호출들의 지역변수들은 서로 간섭하지 않는다.

 

실제로 우리가 재귀함수를 사용했을때처럼 스택에 쌓인다고 생각하면 좀 더 편할 것 같다.

 

아래는 assembly 코드를 C언어로 해석해서 맞추는 블록 채우기 퀴즈 이다.

 

재귀 프로시저 해답