Computer Science/컴퓨터 구조

[컴퓨터 구조] Procedure call, jal, jalr (프로시저 콜을 위한 명령어들)

바보1 2022. 10. 21. 00:44

 

 


앞의 글을 읽으시면 이해에 도움이 됩니다.

 

 

2022.10.01 - [Computer Science/컴퓨터 구조] - [컴퓨터 구조] Type of Instruction (명령어의 타입)

 

[컴퓨터 구조] Type of Instruction (명령어의 타입)

앞의 글을 읽으시면 이해에 도움이 됩니다. 2022.10.01 - [Computer Science/컴퓨터 구조] - [컴퓨터 구조] RISC-V 명령어 작동 과정 (RISC-V Instruction Operation Process) [컴퓨터 구조] RISC-V 명령어 작동..

hi-guten-tag.tistory.com

2022.10.21 - [Computer Science/컴퓨터 구조] - [컴퓨터 구조] Decision Instruciton

 

[컴퓨터 구조] Decision Instruciton

앞의 글을 읽으시면 이해에 도움이 됩니다. 2022.10.01 - [Computer Science/컴퓨터 구조] - [컴퓨터 구조] RISC-V 명령어 작동 과정 (RISC-V Instruction Operation Process) [컴퓨터 구조] RISC-V 명령어 작동..

hi-guten-tag.tistory.com


1. Procedure Calls

 

 

실제로 c언어를 작성하다 보면, main 함수에서 다른 함수를 호출해야 하는 경우가 빈번합니다.

 

이때 우리는 argument를 function call을 하며, 해당 함수의 작업이 끝나면 return을 통해서 값을 돌려받습니다.

 

이러한 과정을 어셈블리어 시점과 좀 더 low level한 시점에서 보도록 합시다.

 

프로그램은 procedure을 위해서 반드시 아래의 여섯 가지 실행을 따라야 합니다.

  1. procedure이 볼 수 있는 곳에 파라미터를 넣는다.
  2. procedure에 control 권한을 부여한다.
  3. procedure을 위한 저장 공간을 확보한다.
  4. 해당된 작업을 수행한다.
  5. program을 calling한 함수가 볼 수 있는 곳에 result 값을 넣는다.
  6. contorl 권한을 나를 호출한 함수에게 반납한다.

해당 여섯 가지를 간략하게 그림으로 나타내면 아래와 같습니다.

이때 g, h, a를 메모리에 넣는다면 어떻게 될까요?

 

메모리에 만약 파라미터와 return 값을 넣는다면 아마 함수가 호출될 때마다 메모리를 참조해야 하므로, 

overhead가 커질 것입니다.

 

따라서 해당 값들은 register에 넣어야 합니다.

 

이때 procedure calling을 위한 9개의 register이 있습니다.


2. Procedure Calling Register

 

 

우선 Procedure을 부르는 함수를 Caller라고 하고, 부름에 응답하는 함수를 Callee라고 합니다.

(통상적으로 main함수가 Caller, 다른 function이 Callee)

 

procedure calling을 위해서는 우선 파라미터가 들어갈 공간과 리턴을 위한 공간,

그리고 마지막으로 다시 권한을 반납할 때 돌아가야 할 장소를 저장하는 공간 이 세 가지가 필요합니다.

 

아래의 표를 보시면 자세히 나와있습니다.

x10 ~ x17 파라미터 혹은 return value를 위한 8개의 파라미터 레지스터를 저장
(통상적으로 x10과 x11은 return value를 위해 사용된다.)
x1 origin으로 돌아가기 위한 하나의 return 주소를 저장

이해되시나요?

 

Caller는 8개의 파라미터를 x10~x17에 저장하고 Callee는 자신이 수행한 작업에 대한 return value를 x10 혹은 x11에 저장한 후, 

x1에 저장되어 있는 주소로 권한을 반납합니다.

 

근데 만약에 Callee에게 넘겨줘야 할 파라미터가 8개가 넘어가면 어떻게 될까요?

 

이때는 register spilling을 통하여 메모리에 초과된 파라미터를 저장합니다.|

 

따라서 overhead를 줄이기 위해서는 파라미터를 8개 이하로 주는 게 현명하겠죠?

 

제가 강의자료에서 캡쳐한거라 퀄리티가 좀 떨어지네요 . . ㅎ. ㅎ. ...

 

아무튼 procedure을 호출해서 g, h를 x10과 x11에 넣는 모습입니다.

 

callee는 a를 x10에 넣어서 반환을 하고 있습니다.

 

그렇다면 이때 x1은 무엇을 가리킬까요?

 

x1는 r = procedure(g, h); 다음 명령어를 가리킵니다.

 

즉 x1에 값을 넣을 때, pc + 4를 해서 x1에 집어넣습니다.

 

그렇다면 이때 caller와 callee의 명령어가 순차적으로 있는 게 아닐 텐데, 이것은 어떻게 명령어 위치를 변경할까요?

또한 conditional branch 또한 조건문이 없기 때문에 이동이 불가한데, 이를 위한 새로운 명령어가 필요해 보입니다.


3. jal

 

 

jal(jump and link)은 Caller가 Callee에게 권한을 넘길 때 사용하는 명령어입니다.

 

Callee 명령어의 주소로 점프함(pc를 변경)과 동시에 x1에 다음에 돌아올 pc 값을 넣습니다.

 

jal 명령어

실제로 jal 명령어는 매우 단순하게 이루어져 있습니다.

 

Procedure Address로 점프와 동시에 x1에는 return address를 입력합니다.

 

Jump한다는 것은 procedure에게 control을 넘긴다는 것을 의미하고,

Link는 control이 porint of origin으로 복귀하기 위한 Line를 만들어 놓는다는 것을 의미합니다.

 

이를 그림을 표현하면 다음과 같습니다.

쉽죠?


4. jalr

 

 

jalr(jump and link register)은 Callee가 Caller에게 권한을 반납할 때 사용하는 명령어입니다.

 

명령어가 간단하죠?

 

실제로 x1에는 base address가 들어가 있고, 0은 offset, 그리고 x0는 destination register입니다.

 

근데 x0는 이미 hardwired register이기 때문에 값을 넣어도 무시됩니다.

(hardwired register는 참조 글에서 설명해놓았음)

 

따라서 해당 명령어는 x1에 저장되어 있는 값으로 점프합니다.

 

이를 그림으로 그리면,

와 같습니다.

 

간단하죠?

 

근데 여기서 드는 의문점이 있습니다.

 

jalr 대신에 jal x0, x1을 쓰면 안 되는 걸까요?

 

이유는 스스로 생각해보시기 바라겠습니다. ㅎ.ㅎ


5. UJ-Type

 

 

jal은 UJ-type이고, jarl은 I-type입니다.

 

이때 UJ-type도 SB-type과 마찬가지로 짝수로만 이동이 가능하며 이유는 참조 글에서 확인하실 수 있습니다.

 

UJ-type의 format은 아래와 같습니다.

이것도 보시면 신기하게 imm이 1~20까지 있죠?

 

이것도 참조 글에서 확인하실 수 있습니다.

 

따라서 이동할 수 있는 범위는 \(2(-2^{19}\sim2^{19}-1)\)이 됩니다.

 

하지만 실질적으로 PC-relative addressing에서는

(4Byte 명령어만 지원한다고 가정) \(\pm2^{18}\)이 됩니다.

 

 

 

하지만 만약에 그렇다면 저 범위를 넘어가는 곳으로는 점프할 수 없을까요?

 

혹은 addi를 했을 때는 imm이 12비트기 때문에 32 bit 숫자를 계산하기 위해서는 addi를 여러 번 계산해야 할까요?

 

이를 위한 명령어가 있습니다.

 

해당 명령어는 다음 글에서 적도록 하겠습니다.

 

2022.10.21 - [Computer Science/컴퓨터 구조] - [컴퓨터 구조] for Wide Immediate Operands : lui

 

[컴퓨터 구조] for Wide Immediate Operands : lui

앞의 글을 읽으시면 이해에 도움이 됩니다. 2022.10.01 - [Computer Science/컴퓨터 구조] - [컴퓨터 구조] Type of Instruction (명령어의 타입) [컴퓨터 구조] Type of Instruction (명령어의 타입) 앞의 글을..

hi-guten-tag.tistory.com

 

감사합니다.

 

지적 환영합니다.