jr
의사lyszt.net은 jr 및 기타 RISC-V 명령어를 더 자세히 다룹니다.
설명
jr은 레지스터에 저장된 주소로 점프합니다. 이름은 jump register를 뜻합니다. j는 코드에 적힌 고정 레이블로 점프합니다. jr은 레지스터가 보유한 임의의 주소로 점프하며, 그 주소는 프로그램이 실행 중에 계산합니다. 반환 주소는 저장하지 않습니다.
jr은 아래 줄에 대한 의사 명령어로, 반환 주소를 버리는 레지스터 점프입니다(jalr 참조).
jalr zero, rs, 0
점프 테이블은 여러 루틴의 주소를 담고 있는 메모리 내 배열이며, jr은 이것과 함께 사용됩니다. 루틴 번호 i를 선택하려면 프로그램이 테이블에서 해당 슬롯을 계산하고, 그곳에 저장된 주소를 레지스터에 로드한 뒤 jr로 그리로 점프합니다. 한 번의 조회와 한 번의 점프가 긴 일련의 비교(케이스 0인가, 케이스 1인가, 케이스 2인가 등)를 대체하며, 케이스 수가 얼마든 마찬가지입니다. 밀집한 switch 문과 인터프리터 내부 루프의 디스패치가 이 방식으로 이루어집니다.
RISC-V 매뉴얼은 단순한 무조건 간접 점프를 rd를 x0로 설정한 jalr로 인코딩합니다. 이 매뉴얼은 jalr이 조건 분기와 달리 즉시값을 2바이트의 배수로 취급하지 않는다는 점, 그리고 jalr의 대부분 사용은 즉시값이 0이거나 lui 또는 auipc 뒤에 온다는 점을 언급합니다.
함수에서 반환하는 것은 ra에 있는 주소로의 점프이므로, ret은 다른 이름의 jr ra입니다. 점프 명령어 그룹은 주소가 어디에서 오는지와 반환 주소를 저장하는지 여부에서 차이가 납니다.
확장 대상
jalr zero, rs, 0
어셈블러는 이 의사 명령을 위에 나열된 실제 명령 또는 명령들로 대체합니다.
예시
la t0, target jr t0 # jump to the address held in t0
