call의사

call

의사
RISC-V 어셈블리 참조

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

설명

call은 함수를 실행하고 반환값을 처리합니다. 함수로 점프하고 반환 주소를 ra에 저장하여 함수가 돌아올 수 있게 합니다. 이는 보통 아래 명령어로 확장되는 의사 명령어입니다.

jal ra, label

함수가 단일 점프로 도달할 수 없을 만큼 멀리 있을 때, 어셈블러는 그 거리를 커버하는 더 긴 시퀀스로 대체합니다. 함수 이름과 함께 call을 작성하면 의도를 명시하고 형식 선택을 어셈블러에 맡깁니다. jal 항목은 점프와 반환 주소 저장을 설명합니다. 아래 줄은 square 함수를 호출합니다.

call square

함수를 호출하려면 호출자와 피호출자 사이에 정보가 전달되는 방식에 대한 합의도 필요합니다. 그 합의가 호출 규약입니다. 호출자는 함수의 입력을 a0, a1 등으로 명명된 인수 레지스터에 넣고, 함수가 반환되면 a0에서 결과를 읽습니다. 양쪽이 같은 규칙을 따르므로 따로 작성된 코드도 함께 작동합니다.

모든 call은 ra를 덮어씁니다. 자체적으로 호출을 하는 함수는 호출하기 전에 받은 ra를 저장하고, 자신이 반환하기 전에 그 값을 복원합니다. 그렇지 않으면 내부 호출의 반환 주소가 외부의 것을 대체하여 함수가 돌아올 수 없습니다. 다른 것을 호출하지 않는 함수는 ra를 저장할 필요가 없습니다.

RISC-V 매뉴얼에 따르면 표준 소프트웨어 호출 규약은 x1을 반환 주소 레지스터로 사용합니다. jal은 ±1 MiB 이내의 대상에 도달하며, 여기서 1 MiB는 1,048,576바이트입니다. 더 멀리 있는 대상은 auipc 다음에 jalr이 필요하며, 이는 32비트 pc 상대 주소 범위 내 어디든 도달합니다.

예제는 a0에 6을 넣고 square를 호출하여 이후 a0에서 36을 얻습니다. 인수는 규약을 통해 들어가고 결과는 나옵니다.

확장 대상

jal ra, label

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

예시

call square      # jumps to square; ra holds the return address