●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 |