Passing control : 함수호출-> 수행 -> 돌아옴. 수행할 위치, return point 필요
Passing data : 전달인자, return value 등이 포함
Memory management : 함수 호출시 메모리 할당, 리턴 시 메모리 반환
x86-64 Stack
- 높은 주소에서 낮은 주소로 확장됨
- register %rsp는 stack pointer저장(stack의 top을 가리킴)
x86-64 Stack : Push
- pushq Src:
1. 소스 읽음
2. %rsp 스택 포인터를 8만큼 미리 감소시킴
3. operand를 %rsp에 저장
x86-64 Stack : Pop
- pop Dest:
1. %rsp 스택포인터 에서 value 읽음
2. %rsp 스택 포인터를 8만큼 증가시킴
3. 읽은 value를 Dest에 저장함(이때 Dest는 register이다.)
- x86-64는 memory to memory transfer가 불가능하다. 따라서 stack은 memory에 있는 공간이므로, value를 메모리가 아닌 레지스터에 저장해야한다.
Procedure Control Flow : Passing control
- call과 return을 위해 stack사용
- call : call label
1. stack에 return address를 push
2. label로 jump
- return : ret
1. stack에서 return address를 pop (pop 후에 instruction register에 저장한다)
2. address로 jump
#1. %rsp는 현재 stack의 top을 가리키고있다. %rip는 다음 실행할 instruction 주소.
cpu는 한 cycle마다 %rip의 주소를 읽어와 수행한다.
#2. stack을 8byte만큼 감소시키고, return address를 저장한다.
다음에 실행할 주소는 mult2함수의 시작주소가 된다.
#3. %rip에 0x400557이 들어있다. 다음에 실행할 instruction은 return이다.
#4. %rsp 스택포인터가 가리키고 있는 return address를 %rip에 넣는다.
mult2함수가 종료 후 다시 돌아와 다음 instruction을 수행한다.
Procedure Data Flow : Passing data
가장 일반적으로 인자 넘겨주는 방법 : register사용
총 6개의 reg를 사용함 : %rdi, %rsi, %rdx, %rcx, %8, %r9
return value는 : %rax 사용
인자가 6개가 넘으면 stack을 사용한다.
Stack Frames
- stack frame pointer: %rbp(Optional) : 스택 프레임의 시작주소. 현재는 주로 일반적인 산술용도로 많이 쓰인다.
- stack pointer: %rsp : 스택의 가장 낮은 주소. (stack의 top을 가리킴)
- stack 공간 할당은 call instruction("Set-up" code) 에 의해서 push된다.
- stack 공간 반환은 ret instruction("Finish" code) 에 의해서 pop된다.
Register Saving Conventions
- yoo가 who를 호출할때, yoo는 caller, who는 callee가 된다.
- caller saved : 호출하는 함수가 register값을 안전히 저장하고 필요할 때 가져올 수 있어야함
- callee saved : 호출 되는 함수가 register값에 책임이 있다.
x86-64 Linux Register Usage
1. Caller saved
- %rax : return value, caller saved
- %rdi, %rsi, %idx, %rcx, %r8, %r9 : arguments, caller saved
- %r10, %r11 : caller saved, temporaries
2. Callee saved
- %rbx, %r12, %r13, %r14 : callee saved, callee must save & restore
- %rbp : callee saved, callee must save & restore, stack frame pointer로 사용가능
- %rsp : special form of callee saved, stack pointer