jal
lyszt.net은 jal 및 기타 RISC-V 명령어를 더 자세히 다룹니다.
인코딩 형식
설명
jal은 함수를 호출합니다. 함수는 여러 위치에서 실행된 후 반환될 수 있는 이름이 붙은 명령 블록으로, 로직을 한 번 작성하고 어디서든 사용할 수 있게 해줍니다. 함수를 호출하려면 두 가지가 필요합니다. 프로그램은 함수가 있는 곳으로 점프하고, 이후 되돌아올 수 있도록 어디서 왔는지 기억합니다. jal은 이 두 가지를 모두 수행하며, 그 이름은 jump and link입니다.
점프는 함수를 표시하는 레이블로 이동합니다. 링크 부분은 점프 전에 일어납니다. jal은 다음 명령, 즉 호출 바로 다음에 오는 명령의 주소를 레지스터에 저장합니다. 함수는 그 저장된 주소를 사용해 반환합니다.
관례상 저장된 주소는 반환 주소를 뜻하는 ra라는 이름의 레지스터에 들어갑니다. 아래 줄은 square 함수로 점프하고 반환할 주소를 ra에 남깁니다.
jal ra, square
함수가 끝나면 ra에 있는 주소로 점프하여 반환하며, 이것이 ret 명령이 하는 일입니다. 같은 호출에 대한 일반적인 축약형은 아래와 같습니다.
call square
RISC-V 매뉴얼에 따르면 점프 오프셋은 2바이트의 배수로 계산되고, 부호 확장되어 점프 명령의 주소에 더해집니다. 이는 플러스 마이너스 1 MiB의 범위를 제공하며, 여기서 1 MiB는 1,048,576바이트입니다. jal은 다음 명령의 주소, 즉 pc 더하기 4를 rd에 저장합니다. 표준 소프트웨어 호출 규약은 x1을 반환 주소 레지스터로, x5를 대체 링크 레지스터로 사용합니다. 무조건 점프 명령은 pc 상대 주소 지정을 사용하며, 이는 위치 독립 코드, 즉 메모리 어디에 로드되든 동작하는 코드를 지원합니다.
jal은 ra를 새로운 반환 주소로 덮어씁니다. 어떤 함수가 다른 함수를 호출하면, 내부 호출이 외부 호출의 저장된 주소를 대체합니다. 자체적으로 호출을 수행하는 함수는 먼저 ra를 저장하고 반환 전에 복원해야 합니다. 이 예제는 square를 호출하고 반환 주소를 ra에 남깁니다.
예시
jal ra, square # call square; ra holds the return address
