상세 컨텐츠

본문 제목

c언어 스택 -3일차

코딩

by Davinc2 2022. 12. 7. 18:16

본문

스택은 자료구조의 한 종류

자료구조란 프로그램에서 사용할 데이터를 효율적으로 관리하기 위한 이론

 

스택에 데이터를 추가하면 push

                            제거하면 pop 이라고 한다.

어셈블리어 인가봅니다.

지역 변수 관련

 

push 자료구조 이론- 스택 포인터 주소 증가,

         실제 컴퓨터- 스택 포인터 주소 감소 로 받아들인다.

pop  자료구조 이론- 스택 포인터 주소 감소,

         실제 컴퓨터- 스택 포인터 주소 증가 로 받아들인다.

 

void Test()

{

   int a,b,c;

}

Test함수가 시작되는 시점에 a,b,c 변수를 저장할 메모리 공간을 스택 영역에 확보해야 하므로

 컴파일러는 변수를 위한 메모리 공간을 확보하기 위해 

ax레지스터를 세 번 push하는 코드를 기계어로 만듭니다.

 

int a,b,c -------> push ax

                         push ax

                         push ax

12바이트 공간 생성

 Test함수가 종료되는 시점에 pop명령을 세 번 호출하여 스택에 할당된 공간을 제거

지역 변수가 많을수록 push코드와 pop코드가 많아져 프로그램 효율이 떨어져

컴파일러는 이 방법을 사용하지 않는다.

 

 

sub,add명령을 사용하여 push와 pop을 대신한다.

sub SP, 12  //12만큼 줄여 공간 확보

add SP, 12  //12만큼 증가시켜 공간 확보

 

#include <stdio.h>
void show()
{
int n, i, j;
printf("Show Function\n");
}
void Test()
{
int y;
show();
}
int main(void)

{
int a, b, c;
Test();
}

j
i
n
 
y
 
c
b
a
 

이런식으로 되어있다.

 

스택 프레임

함수를 호출할 떄 일어나는 스택의 변화를 스택 프레임 이라고 합니다.

지역 변수를 추가하거나 배열 크기를 변경하려면 스택 프레임이

수정되어야 하기 때문에 c언어 코드를 다시 컴파일 해야합니다.

배열을 선언할떄[]안에 반드시 상수를 적어야 하는 이유도 []안에 변수가 오면

정적으로 할당할 크기를 고정할 수 없어서 스택 프레임을 구성할 수 없기 떄문입니다.

관련글 더보기