관리 메뉴

소나기

x86 프로세서와 어셈블리 코드에 대한 이해 본문

연구/Hardware

x86 프로세서와 어셈블리 코드에 대한 이해

moyoung 2013. 2. 15. 16:50

프로그래밍 언어는 중요하다. 하지만 해킹을 배우는 데에 있어서 프로그래밍 언어는 단순히 언어, 즉 수단일 뿐이다. 우리는 여기서 프로그래밍 언어, 그중에서도 C언어가 CPU가 인식할 수 있는 기계어로 컴파일된다는 사실에 주목해야 한다.

코드는 컴파일 되어 실행 가능한 바이너리 파일이 될 때 까지는 아무것도 할 수 없다.

c코드 자체는 프로그램이 아니다.

그렇다면 x86 아키텍처에서 실행가능한 이 바이너리 파일은 어떻게 생긴놈일까?



필요한 개념부터 하나씩 알아가자. 


우선 16진법이란?

0

10 

11 

12 

13 

14 

15 



2진법이란?

0

0



10을 각각 2진법과 16진법으로 표현해보자


10진법 

2진법 

16진법 

10 

 1010

 A


간단하다. 아주


다음은?


오래된 인텔 프로세서는 32비트 주소체계를 사용하고 새로운 것은 64비트를 사용한다. 64비트는 32비트 호환모드로 동작해 32비트 코드를 빠르게 실행 할 수 있다.


하지만 16진수의 바이트 코드도 사용하기에 그리 편하지 않다 

그래서 나온것이 어셈블리 언어이다. 

어셈블리 언어는 기계어 명령에 대응하는 연상기호(Mnemonic)이다.


C언어나 기타언어와 달리 어셈블리 언어는 기계어와 1:1 대응관계에 있다.


사용하는 프로세서에 따라 각기 다른 어셈블리 언어가 존재한다.

x86 어셈블리 코드를 작성할 때, 사람들은 AT&T 문법과 인텔문법중 하나를 사용한다.


프로세서는 레지스터 라는 자신만의 특별한 변수셋을 갖고 있다. 

대부분의 명령은 데이터를 읽거나 쓰기 위해 레지스터를 사용한다. 

그래서 프로세서의 레지스터를 이해하는 것은 명령을 이해하는데 중요하다.




하나씩 읽고 이해하면서, 모르는 것은 다시 그 정의를 찾고 비교하고 이해해 나가는 것

공부란 바로 이런것이겠지














'연구 > Hardware' 카테고리의 다른 글

Ubuntu 버전 확인 명령어  (0) 2013.08.30
[目次] コンピュータの構成と設計(上)  (0) 2012.10.17
Comments