어셈블리어4 [C언어]함수 호출을 통한 스택 메모리 이해[1](by 어셈블리어) 이번 글에서는 간단한 함수 호출을 하는 코드를 어셈블리어로 보면서 스택메모리가 실제로 어떻게 변수를 쌓아가는지를 배우겠습니다. 이번글에 들어가기 전에 먼저 알아야 될 용어들은 EBP (Extended Base Pointer), ESP (Extened Stack Pointer) 스택프레임입니다. EBP, ESP, 스택프레임이란? EBP (Extended Base Pointer)는 현재 스택프레임의 첫 주소입니다. EBP (Extended Stack Pointer)는 영어를 보시다시피 현재 스택이 어디까지 채워져 있는지 보여주는 포인터입니다. 스택프레임 (Stack Frame)은 각 함수가 사용하는 스택 메모리 범위입니다. 스택 프레임은 보통 ebp, esp사이의 범위입니다.(하지만 esp는 움직이는 포인터.. 2023. 2. 21. [C언어]스택(Stack) 메모리 스택 메모리 (LIFO, Last In Firtst Out) 스택 메모리는 각 함수(main함수도 함수다)에서 사용하는 지역 변수등을 임시적으로 저장하는 공간이다. 스택 메모리의 크기는 프로그램 빌드시 결정이 된다(함수를 다 호출할 때 필요한 메모리를 컴파일할 때 결정) 스택 메모리 위치는 프로그램 실행시에 운영체제가 알아서 붙여준다.(가상 페이징, 가상 메모리 개념) 운영체제가 알아서 붙여주기에 반드시 그림처럼 '코드, 데이터, 힙, 스택'순으로 주소가 생기지는 않지만, 전통적으로 그래왔기 때문에 그림을 이렇게 표현하였다. 함수가 호출이 될 때마다 함수에서 필요한 공간만큼 스택에서 떼어 줬다가 함수가 반환을 하면 지워버린 다는 개념 즉, 함수 메모리 영역으로 스택 메모리라고 불린다. 함수 호출 될 때 .. 2023. 2. 17. [C언어]컴파일(Compilation) 단계 전처리 단계에 이어서 컴파일 단계에 대해서 알아보자. 컴파일은 컴파일러가 담당을 하고 확장된 소스코드 하나를 입력받아서 어셈블리어로 출력을 하게 된다. 어셈블리어란? 어셈블리어는 기계어와 1:1로 대응하는 언어로 하드웨어에 가깝다. 출력되는 파일이 아직까지도 텍스트 파일이기 때문에 사람들이 읽을 수 있다. 기계는 아직까지도 읽지 못한다. 어셈블리어는 바이러니(이진) 코드가 아니기 때문이다. 그리고 어셈블리코드는 정의를 모르는 심볼을 사용할 수 있다. 심볼의 예를 들면 함수나 변수의 이름을 뜻한다. 그래서 이전에 배운 헤더파일을 통한 선언 만으로 컴파일이 가능하게 된다!! 컴파일러가 심볼의 선언만 보고 판단하는 과정을 설명하겠다. 함수나 변수가 선언이 되어 있네? 근데 정의를 찾지 못하겠다. 일단 프로그래.. 2023. 2. 16. [C언어]C프로그램 빌드 과정(컴파일,링크,빌드의 차이) 빌드(build)란? 빌드의 뜻은 소스코드를 기계가 이해할 수 있는 기계어로 변환해 주는 과정으로 명령어를 모두 모아서 실행 가능한 실행파일로 만드는 과정으로 세부적으로 나누면 4가지로 나뉘어진다. 전처리(Preprocessing) 컴파일(Compilation) 어셈블(Assembling) 링크(Linking) 빌드안에 컴파일이랑 링크가 속해있는 것으로 보면 된다. 사람마다 전처리,컴파일,어셈블전체를 컴파일로 불러서 빌드 단계를 두 단계로 보는 경우도 있다. 컴파일 링크 컴파일(Compile)이란? 컴파일러가 전처리기가 처리해준 소스 코드를 이용해서 어셈블리어로 바꿔주는 과정을 말한다. 어셈블리어는 기계어와 1:1로 대응이 되는 언어로 하드웨어에 가까운 언어이다. 어셈블리어를 기계어라고 부르기에는 조금 .. 2023. 2. 15. 이전 1 다음