컴시] 3.7~3.8 프로시저와 배열
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
개발 툴
대상자
- 소프트웨어 개발자, 시스템 프로그래머, 어셈블리 언어 학습자
- 난이도: 중급~고급 (스택/레지스터 동작, 메모리 관리, 어셈블리 명령어 이해 필요)
핵심 요약
- 스택 연산:
push
로 데이터 추가,pop
으로 제거 (LIFO 구조), 스택 포인터%rsp
로 주소 관리 - 프로시저 호출:
call
명령어로 리턴 주소 푸시,ret
으로 복귀, 인수 전달은 레지스터(%rdi
~%r9
) 및 스택 사용 - 배열 접근:
A[i]
는(%rdx, %rcx, 4)
로 계산, 다중 배열은 행 우선(ROW-MAJOR) 방식으로 저장
섹션별 세부 요약
1. 스택과 스택 연산
push
명령어: 스택 포인터%rsp
감소 후 데이터 저장 (예:subq $8, %rsp
후movq %rbp, (%rsp)
)pop
명령어: 스택 포인터 증가 후 데이터 복구 (예:addq $8, %rsp
후movq (%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
)를 통해 메모리/레지스터 동작 직접 제어 가능