ISA와 어셈블리

위의 코드는 어떤 함수의 시작 부분(프롤로그)이다. 이 부분이 하고 있는 일로 올바른 것은?

addi sp, sp, -16
sw   ra, 12(sp)
sw   s0, 8(sp)
  1. A스택에 영역을 확보하고 복귀 주소(ra)와 호출 대상 저장 s0를 저장하고 있다
  2. B함수의 인자 ra·s0를 스택에서 읽어 들이고 있다
  3. C함수에서 복귀하기 위해 스택을 해제하고 있다
정답과 해설 보기

정답: A. 스택에 영역을 확보하고 복귀 주소(ra)와 호출 대상 저장 s0를 저장하고 있다

1행에서 sp를 16 줄여 스택 프레임을 확보하고, 2행에서 복귀 주소 ra를, 3행에서 호출 대상 저장 s0를 프레임에 쓰고 있습니다. 이 함수는 다른 함수를 호출하므로 ra를, s0를 사용하므로 그 원래 값을 지킬 필요가 있습니다. 함수 마지막의 에필로그에서는 'lw s0, 8(sp)', 'lw ra, 12(sp)', 'addi sp, sp, 16', 'ret'으로 반대 순서로 복귀시킵니다.

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

ISA와 어셈블리의 다른 문제

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