●Procedure

 ▷특정 값을 Return하고, 반복해서 호출가능한 block

 

 ▶메커니즘

  ▶Passing control

   ▷call: 해당 Procedure의 시작으로 control 이동 (jump)

   ▷return: call 다음의 위치로 control 이동

 

  ▶Passing data

   ▷매개변수

   ▷return 값

 

  ▶Memory management

   ▷Procedure 진행 동안 메모리 할당 (allocate)

   ▷return시 메모리 반환 (deallocate)

 

 ▶Stack구조 활용

  ▷Procedure를 사용하기 위해 Stack을 활용함.

  ▷Bottom: 최상위 주소 (높은 주소)

  ▷Top: 낮은 주소, 높은 주소에서 내려오면서 할당.

  ▷%rsp: Stack Pointer

 

  ▷pushq Src: %rsp를 8 감소시키고, 해당 위치에 Src 저장.

  ▷popq Dest: 해당 위치의 값을 읽어들여 Dest에 저장하고, %rsp를 8 증가시킴.

 

 

○Passing Control (컨트롤 이동)

 ▶Precedure call: call [label]

  ▷return address를 stack에 push함.

   ▷return address: 함수가 return된 이후에 실행해야할 코드.

  ▷label로 jump (%rip - 다음 실행할 코드의 주소)

 

 ▶Procedure return: ret

  ▷stack에서 address를 pop함.

  ▷address로 jump. (%rip - 다음 실행할 코드의 주소)

 

 

○Passing Data (데이터 전달)

 ▶Arguments (매개변수)

  ▷처음 6개의 매개변수는 정해진 register에 저장. (int, 포인터..)

   ▷%rdi, %rsi, %rdx, %rcx, %r8, %r9

  ▷나머지 매개변수는 stack에 밀어넣음.

 

 ▶Return value

  ▷%rax

 

 

○Managing local data

 ▷함수가 여러 계층에 걸쳐 실행될 경우, local 데이터들을 저장할 필요 있음 (매개변수, 지역변수, return 주소)

 ▶위의 정보들을 저장하는 Stack frame 활용

  ▷한 Procedure당 하나의 frame 사용 (크기는 Procedure마다 다름)

  ▷Return주소(필수), Local storage, Frame pointer, ArgumentBuild등 사용.

  ▷Caller frame: Caller가 전달해주는 정보들 (Return주소, 매개변수)

  ▷call에 할당(push), ret에 해제(pop)

 

 ▶Local data의 저장 (여러 함수가 Stack으로 호출될 경우)

  ▶Caller Saved: Caller가 register값들을 백업함. (call된 procedure가 return된 이후 restore)

   ▷%rax (return value) 

   ▷[%rdi, %rsi, %rdx, %rcx, %r8, %r9] (Arguments),

   ▷[%r10, %r11] (Caller-saced temporaries)

   ▷Procedure(Callee)에서 수정해도 상관없음. 

  ▶Callee Saved: Callee가 register값들을 백업함. (return전에 restore)

   ▷[%rbx, %r12, %r13, %r14] (Callee-saved Temporaries)

   ▷%rbp (frame pointer)

   ▷%rsp (stack pointer) - Procedure 입장시 - (push), 나갈시 + (pop)

   ▷Callee가 저장해야함.

'컴퓨터 지식 > 시스템' 카테고리의 다른 글

Assembly - Structure  (0) 2020.11.03
Assembly - Array  (0) 2020.10.29
Assembly-Control  (0) 2020.10.13
Assembly  (0) 2020.10.07
Architecture / Machine Code  (0) 2020.10.07

+ Recent posts