[C언어] 스택(POP, PUSH, PEEK 구현), 레지스터, 스택프레임

2024. 2. 12. 21:26시스템 해킹

C언어는 써본 적이 없어서 환경설정부터 해주었다.

https://blog.naver.com/nms200299/222129689157

 

VSCode(비주얼스튜디오 코드) C언어 개발환경 구축

1. MinGW 설치 MinGW는 윈도우용 GCC 컴파일러로, VSCode(비주얼스튜디오 코드)에서 C언어 개...

blog.naver.com

 

1. 스택(POP, PUSH, PEEK 구현)

우선 C언어에는 리스트라는게 없고 배열?이라는 것만 있다고 한다..

그래서 구조체로 스택처럼 보이는 배열을 만들어 준 후 스택처럼 사용해주면 된다.

#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 100

// 스택 구조체 정의
typedef struct {
    int items[MAX_SIZE];
    int top;
} Stack;

class 같은 느낌으로 Stack 클래스를 만들어준 느낌. 안에는 item이라는 배열과 top이라는 정수형변수가 있음.

// 스택 초기화 함수
void initialize(Stack *s) {
    s->top = -1;
}

void는 반환하는 값이 없는 함수를 의미. top을 -1로 만들어줌.

배열안에 값이 여전히 있더라도 포인터(top)이 -1에 있으면 그 값들 안씀.

Stack *s는 Stack의 주소를 s로 저장한 매개변수.

// 스택이 비어있는지 확인하는 함수
int isEmpty(Stack *s) {
    return (s->top == -1);
}

// 스택이 가득 찼는지 확인하는 함수
int isFull(Stack *s) {
    return (s->top == MAX_SIZE - 1);
}

isEmpty이거나 isFull이면 True(1)을 반환해주는 함수.

// 스택에 요소를 추가하는 PUSH 함수
void push(Stack *s, int value) {
    if (isFull(s)) {
        printf("Stack overflow\n");
        return;
    }
    s->items[++(s->top)] = value;
}

요소를 추가하기전 이미 isFull이면 "Stack overflow" 출력 후 함수 나옴.

아닐 경우 top+=1 해주고 item[top]=value해주기. (파이썬으로 설명하기...파이썬 보고싶다)

// 스택에서 요소를 삭제하고 반환하는 POP 함수
int pop(Stack *s) {
    if (isEmpty(s)) {
        printf("Stack underflow\n");
        exit(1);
    }
    return s->items[(s->top)--];

요소를 삭제하기전 이미 isEmpty이면 "Stack underflow" 출력 후 함수 나옴.

아닐 경우 print(item[top])해주고 top-=1 해주기. 

// 스택의 맨 위 요소를 반환하는 PEEK 함수
int peek(Stack *s) {
    if (isEmpty(s)) {
        printf("Stack is empty\n");
        exit(1);
    }
    return s->items[s->top];
}

스택이 이미 비었다면 "Stack is empty" 출력후 exit.

아니라면 print(item[top])해주기.

int main() {
    Stack s;
    initialize(&s);

    // 스택에 요소 추가
    push(&s, 3);
    push(&s, 5);
    push(&s, 10);

    // 스택에서 요소 삭제 및 출력
    printf("Popped element: %d\n", pop(&s));

    // 스택의 맨 위 요소 확인
    printf("Top element: %d\n", peek(&s));

    return 0;
}

출력값

Popped element: 10
Top element: 5

2. Stack

: 후입선출(LIFO) 데이터 구조

3. Stack Frame

: 프로그램 중 함수가 호출될 때 일어나는 스택의 변화. 각 함수 호출은 새로운 스택 프레임을 생성, 이전 스택 프레임 위에 쌓임.

함수가 이렇게 실행 될 때,

https://blog.naver.com/higeon_/223235041023

스택프레임은 이렇게 변화함.

4. Stack Register

: CPU 내부의 레지스터 중 하나.  현재 스택 프레임의 맨 위에 위치한 메모리 주소. ==Stack Pointer