Mechanisms in Procedures
- Passing control
- 프로시저를 시작하고, 끝나면 return point로 돌아온다
- Passing Data
- 프로시저의 인수에 값을 넣어주고, 값을 받아온다.
- Memory Management
x86-64(64bit) Stack
Region of memory, managed with stack discipline
- Bottom과 Top 존재
- Top의 위치 : stack pointer %rsp
- 스택은 더 낮은 주소 쪽으로 쌓인다.
- 즉 %rsp는 가장 낮은 주소이며, Top 원소의 위치인 것이다.
- instructions
- PUSH
- pushq src
%rsp를 8 감소
%rsp에 src 입력
- POP
- popq dst
%rsp의 값 읽음
%rsp 8 증가
읽은 값을 dst에 입력
Example
void multstore(long x, long y, long *dest){
long t = mult2(x,y);
*dest = t;
}
long mult2(long a, long b){
long s = a*b;
return s;
}
in Assembly:
0000000000400540 <multstore>:
//x in %rdi, y in %rsi, dest in %rdx
400540: push %rbx
400541: mov %rdx, %rbx //dest를 rbx에 저장: rdx는 아래 호출에서 또 필요!
400544: callq 400550<mult2> //아래 함수 실행
//t in %rax
400549: mov %rax, (%rbx) //계산된 a*b를 *dest에 저장
40054c: pop %rbx
40054d: retq
000000000040550 <mult2>
//a in %rdi, b in %rsi
400550: mov %rdi, %rax //rax에 a가 들어감
400553: imul %rsi, %rax //a*b를 rax에 저장
//s in %rax
400557: retq
- Passing control
- 400544: callq 400550<mult2> 호출되면
- %rsp가 한칸 내려온다
- %rsp에 함수 다음 명령, 즉 400549가 들어간다.
- 동시에 %rip에 400550이 들어간다
- %rip에 400550이 있으므로 아래의 함수를 실행한다.
- 함수가 끝나면 400557: retq가 되어 스택에서 POP 한다.
- %rsp가 한칸 올라간다
- 이때 %rsp에 있던 400549가 %rip에 들어간다.
- 함수가 끝나고 난 뒤의 코드를 실행한다.
Stack Frame
- Contents
- return information
- [local storage], [temporary space]
- call 되면 스택에 공간 할당하고 push
- ret 되면 스택에서 공간 해제하고 pop
- rbp는 스택 프레임 시작점 저장
push %rbp
mov %rsp, %rbp
…
pop %rbp
- 스택 프레임에는 각 함수 호출이 각자의 공간을 가짐을 의미한다.


- Caller, callee stack frame structure
- Caller
- return address(pushed by call instruction; 다음 명령 주소)
- 7 이상의 함수 인수들
- Callee
- [optional] frame pointer %rbp
스택프레임에 추가되기 직전의 rsp를 저장해 놓는다.
old frame pointer이라고도 한다.
- saved registers(이전에 저장된 값들)
- local variables(register에 전부 안들어간다면)
- [optional] argument build
함수 인수들