c언어 stack 예제

스택 의 맨 위에서 대상 피연산자와 함께 지정된 위치로 값을 로드한 다음 스택 포인터를 증분합니다. __cdecl 규칙에서 호출자는 스택에 푸시된 매개 변수를 정리해야 하며, 이 작업은 함수의 매개 변수에 대한 don`t care 레지스터에 스택을 터지거나 스택 포인터에 매개 변수 블록 크기를 직접 추가하여 수행됩니다. 함수 중에 생성된 스택 프레임은 메모리 할당을 암시적으로 호출합니다. 명시적으로, 메모리 할당을 요청 하 고 malloc(), calloc(), realloc(), 새, free() 및 삭제를 사용 하 여 힙 영역에 해제 될 수 있습니다. 스택 프레임의 일반적인 레이아웃은 서로 다른 운영 체제에서 다르게 구성될 수 있지만 아래에 표시됩니다: EBP 레지스터는 스택 바닥을 가리키는 정적 레지스터입니다. 스택의 맨 아래는 고정된 주소에 있습니다. 보다 정확하게는 EBP 레지스터에 스택 맨 아래의 주소가 실행된 함수를 기준으로 오프셋으로 포함되어 있습니다. 함수의 작업에 따라 스택 크기는 런타임에 커널에 의해 동적으로 조정됩니다. 새 함수가 호출될 때마다 EBP의 이전 값이 스택에 가장 먼저 푸시된 다음 ESP의 새 값이 EBP로 이동됩니다. EBP가 보유한 이 새 ESP 값은 새 함수 호출에 할당된 스택 섹션을 검색하는 데 필요한 로컬 변수에 대한 참조 기반이 됩니다. 앞에서 언급했듯이 스택은 아래쪽으로 증가하여 메모리 주소를 낮춥니다. 이것은 스택 인텔을 포함 하 여 많은 컴퓨터에서 성장 하는 방법, 모토로라, SPARC 및 MIPS 프로세서. 스택의 ESP(스택 포인터) 마지막 주소는 스택 맨 위에 있는 다음 사용 가능한 주소가 아닙니다.

이 함수가 프로세서 레지스터를 사용하는 경우 호출자 나 다른 프로그램에서 사용하는 데이터를 삭제하지 않으려면 먼저 이전 값을 저장해야합니다. 사용할 각 레지스터는 한 번에 하나씩 스택에 푸시되며 컴파일러는 나중에 해제할 수 있도록 해당 레지스터가 사용한 내용을 기억해야 합니다. 및 스택 내의 배열은 아래와 같이 예시될 수 있다. 스택 프레임의 슬롯 크기, 즉 스택 너비입니다. /*함수는 스택*/void 디스플레이(){int i;if(s.top == -1){printf(“스택이 비어 있음”);반환;} else{printf (“n스택의 상태는n”);에 대한 (i = s.top; i >= 0; i–){printf (“%dn”, s.stk[i]);}} 인쇄물(“n”);} 장점: 스택의 연결된 목록 구현은 런타임시 필요에 따라 증가하고 축소될 수 있습니다. 단점: 포인터의 참여로 인해 추가 메모리가 필요합니다. 다음은 스택 및 큐에 대한 C 프로그래밍 예제 목록입니다. 위의 이미지는 컵 스택을 나타냅니다. 스택 맨 위에서만 추가하거나 제거할 수 있습니다. 이 시점에서 스택 프레임이 올바르게 설정되고 그림 8에 나와 있습니다.