

여긴 어디 나는 누구?
제어권 전달
데이터 전달 (Parameter Passing)
메모리 할당 및 반납
스택 구조
%rsp는 스택 최상단을 가리킴스택 프레임
[리턴 주소] // call 시 스택에 push
[지역 변수, 레지스터 백업] // %rsp 기준 음수 offset에 저장
[7번 이후 인자] // 스택을 통해 전달
call, retcall: 리턴 주소를 스택에 push하고, Q 함수 시작 주소로 점프ret: 리턴 주소를 pop하고, 그 위치로 점프| 순서 | 레지스터 |
|---|---|
| 1 | %rdi |
| 2 | %rsi |
| 3 | %rdx |
| 4 | %rcx |
| 5 | %r8 |
| 6 | %r9 |
%rax에 저장&) 사용 시int x = 5;
int *p = &x;
높은 주소
+-----------------------+ ← %rsp + 16
| arg2 (7번째~) |
+-----------------------+ ← %rsp + 8
| arg1 (6번째~) |
+-----------------------+ ← %rsp
| return address |
+-----------------------+
낮은 주소
long foo(long x, long y) {
long a = x + y;
return a;
}
movq $val1, %rdi
movq $val2, %rsi
call foo
foo:
pushq %rbp
movq %rsp, %rbp
subq $16, %rsp ; 지역변수 공간 확보
...
movq %rbp, %rsp
popq %rbp
ret
%rax, %rcx, %rdx, %rsi, %rdi, %r8~%r11pushq %rax
call foo
popq %rax
%rbx, %rbp, %r12~%r15foo:
pushq %rbx
...
popq %rbx
ret
int foo(int x) {
int y = x + 1;
int z = bar(y);
return z * 2;
}
foo:
pushq %rbx
movq %rdi, %rbx
addq $1, %rbx
movq %rbx, %rdi
call bar
imulq $2, %rax, %rax
popq %rbx
ret
재귀 함수 특징
예제
long rfact(long n) {
long result;
if (n <= 1)
result = 1;
else
result = n * rfact(n - 1);
return result;
}
rfact:
pushq %rbx
movq %rdi, %rbx
movl $1, %eax
cmpq $1, %rdi
jle .Ldone
leaq -1(%rdi), %rdi
call rfact
imulq %rbx, %rax
.Ldone:
popq %rbx
ret
하루종일 CSAPP만 봤는데 집중력 유지가 아무래도....힘들었다.