ret의사

ret

의사
RISC-V 어셈블리 참조

lyszt.net은 ret 및 기타 RISC-V 명령어를 더 자세히 다룹니다.

설명

ret는 함수에서 반환하여 제어를 호출자에게 되돌려줍니다. call은 이를 기대합니다. 함수가 호출되면 호출자는 반환 주소를 ra 레지스터에 넣고(call 및 jal 참조), ret는 그 주소로 점프하여 원래 호출 직후부터 계속 실행됩니다. 이는 ra로 점프하는 의사 명령어입니다.

ret는 ra가 여전히 올바른 주소를 보유하고 있을 때만 작동합니다. 다른 것을 호출하지 않는 함수에서는 진입과 종료 사이에 ra를 변경하는 것이 없습니다. 함수 내부의 call은 ra를 새로운 반환 주소로 덮어쓰고 함수에 필요한 주소를 지웁니다. 다른 함수를 호출하는 함수는 진입 시 ra를 저장하고 ret 전에 복원합니다. 복원하지 않으면 함수는 잘못된 위치로 반환되고 프로그램은 관련 없는 코드로 점프하거나 영원히 반복됩니다.

관례적으로 함수는 반환 전에 결과를 a0 레지스터에 넣고 호출자는 거기서 그것을 읽습니다.

RISC-V 매뉴얼에 따르면 표준 호출 규약에서 프로시저 반환은 rd=x0, rs1=x1, 즉시값 0인 jalr로 인코딩됩니다. 이는 x1의 주소로 점프하고 x0가 이를 버리므로 링크 주소를 쓰지 않습니다. 매뉴얼은 또한 프로세서가 jal과 jalr의 레지스터 번호를 함수 반환 예측의 힌트로 사용한다고 덧붙이며, 이것이 표준 규약이 반환 주소를 x1에 유지하는 이유 중 하나입니다.

예제는 가장 단순한 완전한 함수입니다. square는 인수에 자기 자신을 곱하고 ret는 결과를 반환합니다. 다른 것을 호출하지 않으므로 아무것도 저장하거나 복원하지 않습니다. 시뮬레이터에서 실행하면 제어가 호출자에게 다시 점프하는 것을 볼 수 있습니다.

확장 대상

jalr zero, ra, 0

어셈블러는 이 의사 명령을 위에 나열된 실제 명령 또는 명령들로 대체합니다.

예시

square:
  mul a0, a0, a0
  ret              # return to the caller