ISA와 어셈블리

함수 안에서 프레임 포인터(RISC-V에서는 s0/fp)를 사용하는 이점으로 올바른 것은?

  1. A레지스터를 1개 추가로 쓰지 않아도 되므로 성능이 반드시 올라간다
  2. B함수 도중에 sp가 움직여도 지역 변수나 인자를 고정된 거리로 지정할 수 있고, 디버거도 호출 연쇄를 따라가기 쉽다
  3. C스택 영역이 자동으로 커져 넘치지 않게 된다
정답과 해설 보기

정답: B. 함수 도중에 sp가 움직여도 지역 변수나 인자를 고정된 거리로 지정할 수 있고, 디버거도 호출 연쇄를 따라가기 쉽다

프레임 포인터는 함수에 진입한 시점의 스택 위치를 가리킨 채 움직이지 않는 레지스터입니다. 가변 길이 배열 등으로 sp가 도중에 바뀌어도 지역 변수를 'fp에서 몇 바이트'로 지정할 수 있습니다. 또한 각 프레임에 이전 fp를 저장해 두면, 이를 따라가서 호출 연쇄(백트레이스)를 얻을 수 있습니다. 다만 레지스터를 1개 차지하므로 최적화에서는 생략되는 경우도 많습니다.

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

ISA와 어셈블리의 다른 문제

  1. RISC-V에서 자기 자신을 호출하는 재귀 함수를 작성할 때 ra를 스택에 저장하는 것을 잊으면 어떻게 되는가?
  2. 리틀 엔디안 RISC-V에서 0x12345678이 들어 있는 레지스터를 'sw'로 주소 0x100에 썼다. 그 후 'lbu'로 주소 0x101의 1바이트를 읽으면 값은 얼마인가?
  3. RISC-V에서 4바이트를 읽는 lw 명령어의 주소가 4의 배수가 아닐 때(경계가 맞지 않을 때) 일어날 수 있는 일로 올바른 것은?
  4. RISC-V 명령어 'slli t0, a0, 3'의 결과 t0는 a0 값의 몇 배가 되는가? (오버플로는 고려하지 않음)
  5. a0에 int형(4바이트) 배열 a의 시작 주소, a1에 첨자 i가 들어 있다. 위의 코드가 a2에 읽어 들이는 것으로 올바른 것은?