코드에서 프로그램 과정 및 CPU [Reversing]
전처리기 : #include 같은 헤더 파일이나 메크로 파일을 만나게 되면 헤더파일을 삽입한다.
컴파일러 : 컴파일러는 3개의 단계로 나눠지며 'Front-end -> Middle-end -> Back-end'로 나눠진다.
- Front-end 단계에서는 코드의 문법적 오류를 점검하고 중간언어(중간언어가 있으면 각 CPU 회사마다 언어에 대한 컴파일러를 갖고있지 않아도 된다.)를 생성한다.
- Middle-end 단계에서는 변수의 정의와 선언이 잘 이루어졌는지 점검을 한다. 또한 코드에 대한 최적화를 어느정도 진행한다.
- Back-end 단계에서는 최적화 단계를 한번더 진행하고 어셈블리어 코드를 생성한다.
어셈블러 : 어셈블러어로 만들어진 코드를 기계어로 바꿔준다. 어셈블리어와 기계어는 거의 대응하기 때문에 변환하는데 시간이 얼마 안걸린다.
링커 : 필요한 라이브러리를 붙여주고 실행가능한 파일로 만들어준다.
CPU - 레지스터 메모리를 사용하는 초고속 기억장치이다.
(8086부터 설명은 새로 올리겠음)
- 어셈블리어와 기계어는 CPU가 사용하기 위해 만들어진 것이다. intel CPU는 리틀엔디안 방식을 사용하여 CPU가 읽는 속도를 올렸으며 리틀엔디안 방식은 CPU가 읽기 좋게 반대의 순서로 넣어주는 것이다. '스택' 이란것 때문에 그러한데 스택은 후입선출을 통한 데이터를 처리하기 때문에 우리가 ABC를 넣었다면 스택에서 처리될 때는 CBA 순서로 처리된다. CPU에서 우리가 원하는 연산결과를 줄려면 해당 과정 후 다시 뒤집어 줘야 하는데 intel CPU에서는 CPU가 그러한 번거러움을 줄여주기 위하여 아에 넣어줄 때 부터 반대로 넣어주는 것이다.