익명 사용자
로그인하지 않음
계정 만들기
로그인
youngwiki
검색
Procedure call 문서 원본 보기
youngwiki
이름공간
문서
토론
더 보기
더 보기
문서 행위
읽기
원본 보기
역사
←
Procedure call
문서 편집 권한이 없습니다. 다음 이유를 확인해주세요:
요청한 명령은 다음 권한을 가진 사용자에게 제한됩니다:
사용자
.
문서의 원본을 보거나 복사할 수 있습니다.
상위 문서: [[Assembly]] ==개요== 함수 f가 함수 g를 호출할 때, f는 caller에 해당하고, g는 callee에 해당한다. caller와 callee는 정상적으로 작동하기 위해 다음 정보들을 알아야 한다. * Callee는 사용할 매개변수가 어디에 저장되어 있는지 알아야 한다.(보통 스택, 레지스터에 저장) * Callee는 return address가 어디에 저장되어 있는지 알아야 한다.(보통 스택에 저장) * Caller는 return value가 어디에 저장되어 있는지 알아야 한다. 이때 caller와 caller는 같은 레지스터를 사용하고 있으므로, '''calling convention'''이 존재하여 매개변수, 반환값, return address 등을 어디에 저장할 지를 약속한다. ==Procedure Control Flow== Procedure control flow의 주축을 이루는 명령어는 ret'''와 call이다. 이때 두 명령어를 구현하는 데에는 메모리의 스택 자료구조가 사용된다. ===Function call=== 함수 호출에는 '''<code>call Dest</code>''' 명령어가 사용된다. 이는 현재에서 '''지정된 함수 주소(Dest)로 jump하며, 돌아올 주소(스택 포인터)를 스택에 저장'''한다. 이는 다음과 같은 순서로 작동한다: # 현재 명령어의 바로 다음 주솟값(return address)을 스택에 push한다. #* call 명령의 크기는 5bytes 크기이므로 %rip+5 (call 명령의 다음 주소)를 스택에 저장한다. # Dest가 가리키는 주소로 jump한다. #* 프로그램 카운터<ref>프로그램 카운터(%rip)다음에 실행될 명령어의 주소를 저장한다.</ref>로 사용되는 %rip에 지정된 함수 주소(Dest)를 저장한다. 이때 스택에 추가적으로 return address를 저장하므로 %rsp(스택 포인터)의 값은 8 감소한다. ===Function Return=== Call 명령어를 통해 호출된 함수의 실행이 끝나면, '''<code>ret</code>''' 명령어를 사용해 '''원래의 주소(return address)로 복귀'''해야 한다. 이는 다음과 같은 방식으로 작동한다: # 스택에서 값을 pop하고, return address를 얻는다. 이때 %rsp의 값은 8 증가한다. # %rip에 return address를 할당하고, 이를 통해 return address로 jump한다. 즉, <code>ret</code>는 <code>pop %rip</code>과 동일한 효과이다. ==[[Function call in Assembly]]== 자세한 내용은 [[Function call in Assembly]] 문서를 참조하십시오. ==[[Memory management]]== 자세한 내용은 [[Memory management]] 문서를 참조하십시오. ==각주== [[분류:컴퓨터 시스템]]
Procedure call
문서로 돌아갑니다.
둘러보기
둘러보기
대문
최근 바뀜
임의의 문서로
미디어위키 도움말
위키 도구
위키 도구
특수 문서 목록
문서 도구
문서 도구
사용자 문서 도구
더 보기
여기를 가리키는 문서
가리키는 글의 최근 바뀜
문서 정보
문서 기록