jal
과 jalr
명령어의 차이점JAL
(Jump and Link)과 JALR
(Jump and Link Register) 명령어는 둘 다 RISC-V에서 점프(제어 흐름 변경)를 수행하고 반환 주소를 저장하는 역할을 하지만, 그 방식과 사용 시나리오에서 차이가 있습니다.
JAL
(Jump and Link) 명령어JAL
명령어는 PC(Program Counter)를 변경하여 특정 주소로 점프하는 동시에 현재 명령어의 다음 주소(PC + 4)를 링크 레지스터(rd
)에 저장합니다. 이때, 점프할 주소는 절대적인 오프셋으로 제공됩니다.JAL rd, offset
rd
: 점프 후 리턴 주소(즉, 현재 PC + 4)를 저장할 레지스터.offset
: 현재 PC로부터 점프할 상대적 오프셋 (12비트 크기).예시:
JAL x1, 100 ; x1은 retrun address
위 명령어는 현재 PC + 100 위치로 점프하며, PC + 4 (현재 명령어 다음 명령어의 주소)를 x1 레지스터에 저장합니다. 즉, 복귀할 주소를 저장하고 점프합니다.
JALR
(Jump and Link Register) 명령어JALR
은 레지스터 기반으로 점프할 주소를 동적으로 지정할 수 있는 명령어입니다. 점프할 목적지는 레지스터에 저장된 값으로 결정되며, 그 값에 주어진 오프셋을 더하여 계산됩니다. 마찬가지로 현재 명령어의 다음 주소(PC + 4)를 링크 레지스터(rd
)에 저장합니다.JALR rd, rs1, offset
rd
: 점프 후 리턴 주소를 저장할 레지스터.rs1
: 점프할 주소가 저장된 레지스터.offset
: 레지스터 값에 더할 상대적 오프셋.예시:
JALR x1, x2, 20
JALR x0, x1, 0 ; x0은 zero, x1은 return address
이 명령어는 x2 레지스터의 값 + 20의 주소로 점프하고, PC + 4(다음 명령어 주소)를 x1 레지스터에 저장합니다.
JAL
: 절대적 오프셋을 사용하여 현재 PC로부터 특정 거리에 있는 고정된 주소로 점프.JALR
: 레지스터(rs1
)의 값을 사용하여 동적으로 계산된 주소로 점프.JAL
**은 PC + 오프셋으로 점프할 주소를 계산.JALR
**은 레지스터의 값 + 오프셋으로 점프할 주소를 계산.