프로시저와 배열: 스택, 호출, 인수, 배열 접근 방법
AI Store에서 AI코딩으로 만들어진 앱을 만나보세요!
지금 바로 방문하기

컴시] 3.7~3.8 프로시저와 배열

카테고리

프로그래밍/소프트웨어 개발

서브카테고리

개발 툴

대상자

  • 소프트웨어 개발자, 시스템 프로그래머, 어셈블리 언어 학습자
  • 난이도: 중급~고급 (스택/레지스터 동작, 메모리 관리, 어셈블리 명령어 이해 필요)

핵심 요약

  • 스택 연산: push로 데이터 추가, pop으로 제거 (LIFO 구조), 스택 포인터 %rsp로 주소 관리
  • 프로시저 호출: call 명령어로 리턴 주소 푸시, ret으로 복귀, 인수 전달은 레지스터(%rdi~%r9) 및 스택 사용
  • 배열 접근: A[i](%rdx, %rcx, 4)로 계산, 다중 배열은 행 우선(ROW-MAJOR) 방식으로 저장

섹션별 세부 요약

1. 스택과 스택 연산

  • push 명령어: 스택 포인터 %rsp 감소 후 데이터 저장 (예: subq $8, %rspmovq %rbp, (%rsp))
  • pop 명령어: 스택 포인터 증가 후 데이터 복구 (예: addq $8, %rspmovq (%rsp), %rax)
  • 스택 주소: 낮은 주소가 상단, 높은 주소가 하단 (푸시/팝되는 쪽)

2. 프로시저와 런타임 스택

  • 프로시저 호출 시 리턴 주소 푸시 (call Q), 종료 시 ret 명령어로 복귀
  • 스택 프레임: 지역 변수, 인수, 피호출자 저장 레지스터(%rbp, %rbx, %r12~%r15) 저장 공간
  • 인수 전달: 6개 이내 정수형 인수는 레지스터(%rdi~%r9), 나머지는 스택 사용

3. 배열의 할당과 접근

  • 배열 T A[N]L × N 바이트 할당 (L: 자료형 크기)
  • A[i] 접근: (%rdx, %rcx, 4) (예: movl (%rdx, %rcx, 4), %eax)
  • 이중 배열 int A[5][3]: 행 우선 저장, A[i][j] 주소는 xD + 4 × (3i + j)

결론

  • 프로시저 호출 시 리턴 주소와 인수 관리를 위해 스택 포인터 %rsp와 피호출자 저장 레지스터(%rbp, %rbx) 활용
  • 배열 접근 최적화를 위해 포인터 연산((%rdx, %rcx, 4)) 사용, 이중 배열은 행 우선 저장 방식 고려
  • 어셈블리 명령어(pushq, popq, leaq, movl)를 통해 메모리/레지스터 동작 직접 제어 가능