명령어 (14) - 프로시져 / 함수 (1)

컴퓨터구조

2020. 5. 1. 09:20

1. Procedure(함수) 실행의 6단계 

  1. 메인 루틴(Caller)은 함수(Callee)가 엑세스할 수 있는 $a(0~3)레지스터에 파라미터를 저장함
  2. Caller가 Callee에게 제어권을 넘김 (jal procedure)
  3. Callee가 필요한 메모리 공간을 프로세서로부터 할당받음 (sp를 이용해 스택프레임 생성)
  4. Callee가 요구되는 작업을 수행함
  5. Callee는 Caller가 엑세스할 수 있는 $v(0~1)레지스터에 리턴값을 저장함
  6. Callee는 v레지스터에 저장된 값을 $ra(리턴 어드레스)로 넘기고 제어권이 Caller에게 넘어감 (jr ra)

(Return Address는 다음 명령어의 주소를 말함)

 

2. Procedure Call : jump and link (jal)

jal ProcedureLabel
  • jal 명령어는 두가지 작업을 한번에 진행함
  • 1) 함수 호출 이후에 실행될 명령어의 주소를 $ra에 넣음
  • 2) 해당 타겟 레이블이 있는 곳으로 점프함

 

3. Prodecure Return : jump register (jr)

jr $ra
  • jr 명령어는 레지스터 하나를 받는데, 해당 레지스터에 저장된 주소 값으로 점프함
  • 즉, jr명령어를 쓰면 ra레지스터의 값을 pc(프로그램 카운터)라는 레지스터에 복사함
  • 프로그램 카운터에는 실행중인 명령어의 메모리주소가 담겨있음 (code/text 영역)
  • jal명령어를 통해 Caller에서 Callee호출 이후 작업의 주소를 $ra에 넣어 놨기 때문에,
  • $ra로 점프하면 함수 호출 이후의 작업들로 이어나갈 수 있는 것임
  • jr 명령어는 함수 리턴 이외에도 case/switch 문 등의 조건문에서도 역시 활용될 수 있음

 

4, Leaf Procedure Example

// C Code :
int leaf_example(int g, h, i, j){   // g ~ i <= a0 ~ a3
    int f;                          // f <= s0
    f = (g + h) - (i + j);
    return f;                       // return <= v0
}


// MIPS Code :
main:
    ... 생략...
    jal leaf_example             // leaf_example로 점프하면서 다음 줄에 있는 
    ... 생략 ...                 // 명령어 주소를 ra 레지스터에 넣음
    
leaf_example:
    /* int f 할당 */
    addi $sp $sp -4              // stack을 아래로 4칸 내림 (할당한것임, 스택은 아래로 내려감)
    sw $s1 0($sp)                // 해당된 스택포인터(메모리) 주소에 있던 값을 s0에 저장함
    
    /* f = (g + h) - (i + j) 연산 */
    add $t0 $a0 $a1              // t0 = g + h
    add $t1 $a2 $a3              // t1 = i + j
    sub $s1 $t0 $t1              // f = t0 - t1
    
    /* return f */
    add $v0 $s1 $zero            // mov v0 <= s0
    
    /* int f 반환 */
    lw $s1 0($sp)                // s0의 값을 스택포인터의 주소에 있는 메모리에 저장함 (값이 바뀜)
    addi $sp $sp 4               // stack을 위로 4칸 올림 (반환한 것임, 스택은 아래로 내려감)
    
    /* end of leaf_example() */
    jr $ra                       // 다음 실행 주소로 넘어감
  • 한 함수에서 다른 함수를 호출하지 않는 함수를 leaf procedure라고 함
  • 여기에서 새로 눈여겨 볼 것은 변수를 할당하고, 반환하는 과정까지 포함되었음
  • 이전 포스팅 들에서는 그냥 "변수f가 s0에 맵핑되어있다" 이런식으로 표현했는데
  • 사실 addi로 스택포인터를 필요한 바이트만큼 내리고, 그 그 값을 저장하여 할당하고,
  • 다시 addi로 해당 바이트 만큼 올리고 그 값을 메모리에 쓰는 과정까지 매우 자세히 나와있음
  • 마지막에는 jr명령어를 통해 이전에 jal할 때 넣어둔 ra의 명령어주소로 넘어가면서 끝남

 

5. Reference

 

컴퓨터구조

이 과목에서는 컴퓨터 시스템의 구성, 동작원리와 설계를 다룬다. 특히 컴퓨터 성능, 명령집합, 제어와 마이크로프로그래밍, 파이프라인, 정수와 부동 소수점수 연산, 기억부 시스템, 입출력 부시스템, 고급 컴퓨터구조 등과 같은 내용에 중점을 둔다. 교과목을 통해 고속 Data Network 시스템에 들어가는 여러 Processors를 이해하고, 이들을 설계 또는 Programming 할 수 있는 능력을 배양한다.

www.kocw.net