jalr

jalr

RISC-V 어셈블리 참조

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

인코딩 형식

R
31–25funct7
24–20rs2
19–15rs1
14–12funct3
11–7rd
6–0opcode
I
31–20imm[11:0]
19–15rs1
14–12funct3
11–7rd
6–0opcode
S
31–25imm[11:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:0]
6–0opcode
B
31–25imm[12,10:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:1,11]
6–0opcode
U
31–12imm[31:12]
11–7rd
6–0opcode
J
31–12imm[20,10:1,11,19:12]
11–7rd
6–0opcode

설명

jalr는 jal과 같은 계열에 속하며, r은 레지스터를 의미합니다. 두 명령 모두 점프하고 반환 주소를 저장합니다. 이는 jal 페이지에 설명되어 있습니다. 차이는 점프 대상입니다. jal은 프로그램을 작성할 때 고정된 레이블로 점프하는 반면, jalr은 레지스터에 저장된 주소로 점프하므로 목적지를 실행 시에 계산할 수 있습니다.

이것이 함수가 반환할 수 있게 해줍니다. 호출자는 반환 주소를 ra 레지스터에 넣고, 함수는 jalr을 사용하여 ra의 주소로 되돌아갑니다. ret 명령은 ra로의 jalr입니다.

같은 기능은 목적지를 미리 알 수 없을 때마다 적용됩니다. 주소가 인수로 전달된 함수 호출과 주소 테이블에 나열된 루틴 중 선택, 즉 큰 switch 문이나 인터프리터가 디스패치하는 방식이 이에 해당합니다.

RISC-V 매뉴얼에 따르면, jalr은 부호 확장된 12비트 즉시값을 레지스터 rs1에 더한 다음 결과의 최하위 비트를 지웁니다. 다음 명령의 주소인 pc+4를 rd에 저장하며, 반환 주소가 필요 없을 때는 x0을 목적지로 사용할 수 있습니다. lui 뒤에 jalr을 사용하면 모든 32비트 절대 주소에 도달할 수 있고, auipc 뒤에 jalr을 사용하면 모든 32비트 pc 상대 주소에 도달할 수 있습니다. 두 점프 명령 모두 대상 주소가 4바이트 경계에 정렬되지 않으면 예외를 발생시킵니다.

jalr의 형식은 아래에 나와 있습니다. 레지스터 rs의 주소에 선택적 작은 오프셋을 더한 곳으로 점프하고, 반환 주소를 rd에 저장합니다.

jalr rd, rs, offset

jal과 마찬가지로, 쓰는 레지스터는 덮어써지므로 ra를 보존하는 데 같은 주의가 필요합니다.

예시

la t0, target
jalr ra, t0, 0   # jump to target; ra holds the return address