2.2 - (4) Calling Convention

이태곤·2022년 11월 29일
0

Computer Architecture

목록 보기
8/13

Procedure By Calling Convention

  • Function : 독립된 기능을 수행하며 return 값이 1개이다.
  • Procedure : 독립된 기능의 집합인 일련의 과정이며 return 값이 여러개 또는 없을 수도 있다.

1. Transfer control

  • pc값 control를 통하여 순서에 맞게 function이 문제없이 수행될 수 있도록 약속이 되어있어야 한다.
    • Caller <-> Callee
    • Jump and link instruction
    • Necessary memory space
  • Jump : only for a single procedure call

  • Jump and Link / Jump register : for multiple procedure calls
    -> Jump and Link saves a next instruction (PC+4) in register, x1

  • In recursive call

    1. x1 : after1
    2. x1 : after2
    3. x1 : after2 -> infinite loop

      -> Must save and restore register contents in Stack!
  • Stack : function이 수행되는 동안 필요한 local variable, return address 등이 저장되는 Dynamic space

    • Stack Point (sp) : keep track of the top of the stack
      • In register, x2
    • Push : store, move sp down
    • Pop : load, move sp up
      pop은 해당 메모리영역을 시스템에 반환하는 동작
      -> 해당 영역의 데이터가 삭제 되는것이 아닌, 포인터의 위치만 옮겨지므로 사용 흔적이 남아있다.
  • Example

    1. push(공간 확보) -> x1(after1) store
    2. push(공간 확보) -> x1(after2) store -> 반복
    3. load x1 <- after2
    4. pop -> jump register (x1, after2) -> 반복
    5. 마지막 : load x1 <- after1
      pop -> jump register(x1, after1)

2. Pass parameters to callee & Store return value to registers

  • Caller provide the maximum 8 registers with callee because callee should have their own registers.

    • The parameters of callee is passed in registers, x10 ~ x17 (a0 ~ a7).

    • The original values of caller in registers should be stored in caller's stack frame.

    • Return value from callee is passed through registers x10 and x11 (a0, a1) to caller (mostly x10).

    • If more than 8 parameters should be passed, the rest of parameters is stored in the stack and can be used in callee.

      • Child's stack frame : callee가 caller가 되어서 function을 또다시 호출할 때 할당되는 공간 -> cahin형태
    • Frame Pointer (fp) : 새로운 Stack Frame이 할당되기 이전 위치 가리킴 -> (x8 레지스터에 저장)

    • Call Chain

      • stack layout frame 상태 그리기!
      • stack depth : 6
      • stack frames : 7
        -> amI4, amI1 같은 위치 : 메모리가 덮어 씌어짐
      • 시스템에 반환 되어진 영역의 값들을 이전 값 또는 쓰레기값들이 들어있음
        -> Pop 수행시 Stack Pointer의 위치가 옮겨지는 것, 해당 데이터가 삭제되는 연산이 아니다!

3. Manage registers

  • Allow (caller & callee) to use its registers

  • Prevent (caller & callee) from clobbering each others’ data

    -> Register, x5 will be overwritten by function, who().

  • Caller should save temporary values in its stack frame before give its registers to callee.

  • Callee should save temporary values in its stack frame before using registers which are from caller.


4. Example

  • Leaf Example

    1. caller 입장에서 callee에게 넘겨 줄 register 갯수 만큼 stack을 늘려 값을 임시로 저장해둔다.
    2. 연산을 진행하고 return 값을 x10 레지스터에 저장한다.
    3. 스택으로부터 원래의 값들을 받아 사용한 레지스터 값들을 돌려놓은 후에 스택 사이즈를 감소시킨다.
      return 주소가 들어있는 x1 레지스터를 참조한다.
  • Non-Leaf Example
    -> 교재 참고


5. Memory Layout

  • Stack

    • Is dynamically allocated or deallocated (a.k.a "Activation records")
    • Grows downward as push / Go upward as pop
    • Local variables
  • Heap

    • Is dynamically allocated memory
    • can accessible by using pointer
    • Free() should be declared, if not, dangling pointer problem happen
    • Malloc()
  • Data Segment

    • Exist for all time
    • can accessible by using global pointer
      • Global pointer : points middle of data section
    • Global variables
  • Example

    -> Operators are stored in Instructions

    -> The name of function is a code : stored in Instructions

0개의 댓글