Stack

 

프로그램 실행 시 사용되는 메모리 영역 중 하나이다.

런타임 시 생성.

Virtual memory(가상 메모리) 영역 중 하나이다.

MMU -> 주소를 관리해주는데 이러한 공간을 가상 메모리라 한다.

Thread 단위로 생성

시작 위치는 Vista 이상 랜덤  Xp는 고정이다.

 

용도

 

임시 데이터 백업

지역변수 저장

함수 매개변수 전달

함수 호출 관련 정보

OS에서 필요할 때 사용

 

 

Virtual memory(가상 메모리)의 구조

STACK
HEAP
DATA
TEXT/CODE

스레드 특징

하나의 프로그램 내에서 다수의 실행 흐름

완벽한 독립이 아닌 일정 부분 공유

공유로 인해 콘텍스트 스위칭(문맥 교환)이 줄어듬.

 

HEAP , DATA, TEXT는 공유로 사용되고 , STACK은 독립적으로 사용된다.

 

 

스택은 크게 Full Stack과 Descending Stack으로 나뉜다.

 

esp의 값은 현재주소에 최신 데이터 값이다.
값이 들어올 수록 주소가 낮아진다.

즉, ADD는 아래로 내려가고, SUB는 올라간다.

 

 

PUSH       

 

스택의 data를 저장

 

ESP를 감소시키고 16비트나 32비트 Source operand를 스택에 복사함.

 

POP       

ESP가 가리키는 곳의 저장된 내용을 Destination operand에 저장 후 ESP 값 증가.

 

EIP값을 변경하는 명령어

 

프로그램의 흐름을 변경할 수 있는 명령어

JMP

JMP 주소

주소를 EIP에 저장. -> MOV EIP, 주소 

 

바로 주소에 있는 코드가 실행된다.

 

CALL

함수의 처음 부분에 나온다.

CALL 주소 

 

PUSH Return Address  //EIP 백업

주소를 EIP에 저장. -> MOV EIP, 주소

 

RET

Linux : RET (Windows: RETN) 둘 다 같은 의미

함수의 끝부분에 나온다.

 

RETN

  POP EIP

 

RETN n

  POP EIP

  ADD ESP, n

 

 

LEAVE

Stack Frame을 릴리즈 하는 데 사용하는 명령어

ESP와 EBP를 프로시저가 호출될 때 할당된 값으로 복구

 

아래 코드와 동일

MOV ESP, EBP

POP EBP 

리눅스 컴파일용 gcc에서 사용

 

 

Application Binary Interface

컴파일 코드와 컴파일된 코드, 컴파일된 코드와 OS 간의 인터페이스를 정의 

호환성 유지가 목적

 

char -> 1byte   c 같은 아스키코드에서는 1byte

      -> 2byte   java같은 유니코드에서는 2byte

Alignment 단위

4byte를 단위로 스택에 저장되기 때문에 9 ,10 ,11 ,12 전부 스택에 3개의 공간을 차지한다.

 

Calling Convention 

함수 호출 목적

Object File Format

.c ,. cpp 컴파일 시 나오는. obj를 의미

 

linker 

.dll .lib //winodws

.so //linux

.obj를 .dll .lib와 같이 함수가 저장되어있는 라이브러리에 연결시켜줘서 .exe를 생성하게 해 준다.

 

Name Decoration

실제 변수의 이름은 알 수 없다.

함수의 이름은 존재한다.

 

 

Endianness

Multi Bytes를 저장하는 순서를 정의하고 있음

최대 4byte 단위로 적용함

 

intel -> Little Endian

 

 

계산

1234 + 5678       

기본적으로 계산할 때 뒤에서부터 계산하는 식을 사용하는데, 그렇기 때문에 little endian의 속도가 더 빠르다.

 

문자열은 Big Endian으로 저장된다.

 

 

 

 

 

+ Recent posts