ISA와 어셈블리

RISC-V 함수의 시작 부분에서 'addi sp, sp, -16'을 실행하는 목적으로 올바른 것은?

  1. A스택을 주소가 작은 쪽으로 확장하여 16바이트의 작업 영역을 확보한다
  2. B스택 상의 16바이트를 해제한다
  3. Csp에 들어 있는 값에서 16을 빼서 반환값으로 돌려준다
정답과 해설 보기

정답: A. 스택을 주소가 작은 쪽으로 확장하여 16바이트의 작업 영역을 확보한다

RISC-V를 포함한 많은 ISA의 관례상 스택은 주소가 큰 쪽에서 작은 쪽으로 확장됩니다. sp를 16 줄이면 새로운 sp부터 원래 sp까지의 16바이트가 이 함수의 스택 프레임이 되어, 복귀 주소와 저장한 레지스터, 지역 변수를 둘 수 있습니다. 함수 끝에서 'addi sp, sp, 16'으로 sp를 되돌리면 영역이 해제되어 호출 전과 같은 상태가 됩니다.

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

ISA와 어셈블리의 다른 문제

  1. RISC-V의 표준 호출 규약에서는 함수에 진입할 때의 스택 포인터 sp를 16바이트의 배수로 맞추게 되어 있다. 그 이유로 가장 적절한 것은?
  2. 위의 코드는 어떤 함수의 시작 부분(프롤로그)이다. 이 부분이 하고 있는 일로 올바른 것은?
  3. 함수 안에서 프레임 포인터(RISC-V에서는 s0/fp)를 사용하는 이점으로 올바른 것은?
  4. RISC-V에서 자기 자신을 호출하는 재귀 함수를 작성할 때 ra를 스택에 저장하는 것을 잊으면 어떻게 되는가?
  5. 리틀 엔디안 RISC-V에서 0x12345678이 들어 있는 레지스터를 'sw'로 주소 0x100에 썼다. 그 후 'lbu'로 주소 0x101의 1바이트를 읽으면 값은 얼마인가?