호출 규약

위키백과, 우리 모두의 백과사전.

호출 규약(영어: calling convention)은 컴퓨터 과학에서 어떻게 서브루틴이 그들의 호출자(caller)로부터 변수를 받고, 어떻게 결과를 반환하는지에 대한 규약이다.

프로그래밍 언어마다 각기 다른 호출 규약을 사용하며 각기 다른 플랫폼에서도 마찬가지이다. (CPU 아키텍처 + 운영 체제) 이는 여러 언어에서 작성한 모듈을 병합할 때, 또는 작성 장소가 다른 언어의 운영 체제 및 라이브러리 API를 호출할 때 문제를 일으킬 수도 있다. 이러한 경우 호출자(caller)와 피호출자(callee)가 사용하는 호출 규약을 조율하는데 특별한 관심을 가져야 한다. 단일 프로그래밍 언어를 사용하는 프로그램일지라도 여러 개의 호출 규약을 사용할 수도 있고, 코드 최적화를 위해 컴파일러가 선택하거나 프로그래머가 지정하는 경우도 있다.

플랫폼 별 호출 규약[편집]

x86[편집]

파워PC[편집]

파워PC 아키텍처는 수많은 레지스터를 갖추고 있으므로 대부분의 명령들은 싱글 레벨 셀을 위한 레지스터의 모든 인수들을 통과시킬 수 있다.

MIPS[편집]

32비트 MIPS를 위한 가장 흔히 쓰이는 호출 규약은 O32 ABI이며, 레지스터 내 함수에 처음 네 개의 인수 $a0-$a3를 통과시킨다. 그 뒤의 인수들은 스택 위로 통과된다. 스택 위의 공백은 피호출자가 인수를 저장하고 레지스터가 호출자에 의해 그곳에 저장되지 않는 경우 $a0-$a3을 위해 보유한다. 반환값은 레지스터 $v0에 저장된다. 두 번째 반환값은 $v1에 저장된다. 64비트 ABI는 4개 이상의 매개변수가 있을 때 더 효율적인 함수 호출을 위해 레지스터 내의 더 많은 인수를 허용한다.

SPARC[편집]

SPARC 아키텍처는 RISC 아키텍처와 달리 레지스터 윈도 위에 빌드된다. 24개의 접근 가능한 레지스터가 개별 레지스터 윈도에 있고, 이들 가운데 8개가 내부 레지스터에, 8개가 지역 변수를 위한 레지스터에, 8개가 레지스터 외부에 위치한다.

ARM[편집]

표준 ARM 호출 규약은 16개의 ARM 레지스터를 다음과 같이 할당한다:

  • r15는 프로그램 카운터이다.
  • r14는 링크 레지스터이다.
  • r13는 스택 포인터이다.
  • r12는 프로시저 내 호출 스크래치 레지스터이다.
  • r4 ~ r11: 지역 변수 보유를 위해 사용된다.
  • r0 ~ r3: 함수로 통과되는 인수값을 보유하고 함수로부터 반환되는 결과값을 보유한다.

SuperH[편집]

  • R0
  • R1
  • R2
  • R3
  • R4
  • R5
  • R6
  • R7
  • R8
  • R9
  • R10
  • R11
  • R12
  • R13
  • R14
  • R15

스레디드 코드[편집]

같이 보기[편집]

외부 링크[편집]