[04.05/week04]TIL

CHO WanGi·2025년 4월 5일

KRAFTON JUNGLE 8th

목록 보기
22/89

오늘 한줄 요약

여긴 어디 나는 누구?

새로 배우게 된 것

  • CSAPP 3.5 ~ 3.7

CSAPP 3.5 ~ 3.7

3.7 프로시저


고려할 3가지 사항

  1. 제어권 전달

    • 리턴 주소를 스택에 저장
    • P가 Q 함수 호출
    • PC 값이 Q의 시작 주소로 이동
    • Q 종료 후 스택에서 주소를 꺼내 P의 다음 명령어로 복귀
  2. 데이터 전달 (Parameter Passing)

    • P가 값을 Q에 전달
    • Q가 값을 리턴하여 P에 전달
  3. 메모리 할당 및 반납

    • Q 함수는 지역변수를 위해 메모리를 사용
    • 스택에 저장소 확보
    • 리턴 시 스택 포인터 복구로 자동 반납

3.7.1 런타임 스택

  • 스택 구조

    • x86-64에서 작은 주소 방향으로 성장
    • %rsp는 스택 최상단을 가리킴
  • 스택 프레임

    • 함수의 지역변수, 레지스터 백업용 공간
    • 함수 리턴 시 자동으로 반납되는 블록
[리턴 주소]               // call 시 스택에 push
[지역 변수, 레지스터 백업] // %rsp 기준 음수 offset에 저장
[7번 이후 인자]           // 스택을 통해 전달

3.7.2 제어의 이동

  • 함수 호출의 핵심: call, ret
    • call: 리턴 주소를 스택에 push하고, Q 함수 시작 주소로 점프
    • ret: 리턴 주소를 pop하고, 그 위치로 점프

3.7.3 데이터 전송

  • 최대 6개의 정수형 인자 → 레지스터 사용
순서레지스터
1%rdi
2%rsi
3%rdx
4%rcx
5%r8
6%r9
  • 7번째 이후 인자: 스택에 8Byte 단위로 저장
  • 리턴 값: 항상 %rax에 저장

3.7.4 스택에서의 지역 저장 공간

  • 왜 스택에 저장?
    1. 레지스터 부족
    2. 주소 연산자(&) 사용 시
    3. 배열, 구조체는 레지스터에 담기 어려움
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

3.7.5 레지스터를 이용하는 지역 저장소

  • 호출자 저장 (Caller-Saved)
    • %rax, %rcx, %rdx, %rsi, %rdi, %r8~%r11
    • 함수 호출 전 push, 호출 후 pop 필요
pushq %rax
call foo
popq %rax
  • 피호출자 저장 (Callee-Saved)
    • %rbx, %rbp, %r12~%r15
    • 함수 진입 시 push, 리턴 전 pop
foo:
    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

3.7.6 재귀 프로시저

  • 재귀 함수 특징

    • 함수가 자기 자신을 호출
    • 호출될 때마다 독립적인 스택 프레임 생성
  • 예제

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만 봤는데 집중력 유지가 아무래도....힘들었다.

profile
제 Velog에 오신 모든 분들이 작더라도 인사이트를 얻어가셨으면 좋겠습니다 :)

0개의 댓글