ISA와 어셈블리

호출 규약(콜링 컨벤션)이 정해져 있는 주된 목적은?

  1. A함수 이름 짓는 방식을 통일하여 프로그램을 읽기 쉽게 한다
  2. B따로 컴파일한 함수나 라이브러리끼리 인자와 반환값을 올바르게 주고받을 수 있게 한다
  3. C함수를 호출할 때마다 OS의 허가를 받도록 한다
정답과 해설 보기

정답: B. 따로 컴파일한 함수나 라이브러리끼리 인자와 반환값을 올바르게 주고받을 수 있게 한다

호출 규약은 인자를 어느 레지스터에 넣는지, 반환값은 어디로 돌려주는지, 호출받은 쪽이 어느 레지스터를 망가뜨려도 되는지, 스택을 어떻게 사용하는지를 정합니다. 이 약속이 있으므로 다른 컴파일러로 만든 라이브러리나, 어셈블리로 작성한 함수와 C 언어 함수를 조합해도 올바르게 동작합니다. 호출 규약은 ABI(애플리케이션 바이너리 인터페이스)의 중요한 일부입니다.

이 분야 연습하기 분야로 돌아가기

ISA와 어셈블리의 다른 문제

  1. RISC-V의 표준 호출 규약에서 정수 인자와 반환값을 전달하는 데 사용하는 레지스터로 올바른 것은?
  2. RISC-V의 표준 호출 규약에서 정수 인자가 10개인 함수를 호출할 때 9번째와 10번째 인자는 어디로 전달되는가?
  3. RISC-V 호출 규약에서 s0~s11이 '호출 대상 저장(callee-saved)' 레지스터라는 의미로 올바른 것은?
  4. RISC-V 호출 규약에서 t0~t6은 '호출 원본 저장(caller-saved)' 레지스터이다. 어떤 함수가 t0에 넣은 값을 다른 함수를 호출한 뒤에도 사용하고 싶을 때 올바른 대응은?
  5. 다른 함수를 호출하지 않는 함수(리프 함수)에서는 ra를 스택에 저장하지 않아도 되는 경우가 많다. 그 이유로 올바른 것은?