레지스터 , 메모리 영역 

초반에는 조금 지루할수도 있지만

저번 포스팅에 이어서 진행을 하도록 하겠습니다.

 

이전의 1차시에서 했던것들을 설명드리기 전에 알아햐 할것들이 있습니다

첫번재는 C언어의 컴파일 과정인데요 아래와 같습니다.

 

 

C 프로그램의 컴파일 과정인데요

간단하게 말하면 C언어로 짜여진 소스코드를 실행가능한 바이너리로 컴퓨터가

해석을 할 수 있도록 변경해주는 작업이라고 보면 될 것 같습니다.

당연히 우리가 분석해야 할 대상은 바로 program.exe가 되겠죠?

 

컴퓨터가 해석하여 실행하는 바이너리(0101101101…) 파일을

분석 도구를 사용해 사람이 읽기 수월한 어셈블리어로 변환하여 분석을 해보겠습니다.

 

범용레지스터

레지스터는 OS마다 다른데 해당 글에서는 Linux x86을 기준으로 작성하였습니다.

 

일단 어셈블리어를 하기전에 레지스터를 알아야하는데 그중에 하나인 범용레지스터를

알아보겠습니다. 표로 나타내면 아래와 같습니다.

자주 사용되거나 중요한 부분은 빨간색으로 표시를 해두었습니다.

 

EAX 산술 연산 및 함수의 return값이 담기는 레지스터 ex) return a + b
EBX 범용적으로 사용하는 레지스터
ECX 반복문 루틴에서 사용되는 레지스터
EDX EAX와 마찬가지로 산술 연산에 사용되는 레지스터
ESI 데이터를 복사할 때 메모리 원본 주소를 가리키는 레지스터
EDI 데이터를 복사할 때 목적 주소를 가리키는 레지스터
EBP 스택의 맨 바닥을 가리키는 레지스터
ESP 스택의 끝 지점을 가리키는 레지스터

 

명령어 포인터 레지스터 

EIP : 다음 실행할 명령어의 주소 저장

 

 

 

플래그 레지스터 

실행 중인 프로세스의 상태를 저장하는 용도로 사용됩니다 

표로 나타내면 아래와 같습니다.

 

CF(Carry Flag) 부호 없는 수의 연산 결과가 비트의 범위를 넘을 경우 설정
ZF(Zero Flag) 연산의 결과가 0일 경우 설정
SF(Sign Flag) 연산의 결과가 음수일 경우 설정
OF(Overflow Flag) 부호 있는 수의 연산 결과가 비트 범위를 넘을 경우 설정

 

이제까지 레지스터에 대해서 알아보았고, 리눅스 메모리 영역을 확인해보겠습니다.

하나하나 영역을 살펴볼건데 다음 포스팅에 진행하도록 하겠습니다 

그럼 20000~

 

+ Recent posts