ISA와 어셈블리

RISC-V의 표준 호출 규약에서는 함수에 진입할 때의 스택 포인터 sp를 16바이트의 배수로 맞추게 되어 있다. 그 이유로 가장 적절한 것은?

  1. A스택 용량이 16바이트의 배수가 아니면 OS가 부팅하지 않기 때문
  2. Bsp의 하위 4비트에 함수 번호를 기록하기 때문
  3. C16바이트까지의 큰 데이터를 스택에 두어도 경계를 넘지 않고 효율적으로 읽고 쓸 수 있기 때문
정답과 해설 보기

정답: C. 16바이트까지의 큰 데이터를 스택에 두어도 경계를 넘지 않고 효율적으로 읽고 쓸 수 있기 때문

데이터는 크기의 배수 주소에 두면(정렬하면) 경계를 넘지 않고 한 번에 읽고 쓸 수 있습니다. sp를 항상 16의 배수로 해 두면 8바이트의 double이나 16바이트의 long double 등을 스택에 두어도 정렬이 유지됩니다. 그래서 함수는 프레임 크기를 16의 배수로 확보하며, 저장할 레지스터가 하나뿐이어도 'addi sp, sp, -16'으로 합니다.

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

ISA와 어셈블리의 다른 문제

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