IT 블로그 !!

어셈블리어와 레지스터 본문

관련지식들

어셈블리어와 레지스터

IT_Try 2018. 8. 26. 22:53

어셈블리어란?



어셈블리어는 프로그래밍 언어의 종류 중 하나입니다.

프로그래밍 언어는 두 종류로 구분할 수 있습니다. 고급언어(High level language), 저급언어(Low level language)로 구분이 가능합니다.


고급언어는 사람들이 이해하기 쉬운 프로그래밍 언어이고 저급언어는 컴퓨터가 이해하기 쉬운 프로그래밍 언어입니다.

일반적으로 고급언어에는 C언어, JAVA, 파이썬 등이 있고 저급언어에는 어셈블리어, 기계어가 있습니다.



컴퓨터 구조에 따라 사용하는 기계어가 달라지며, 따라서 기계어에 대응되어 만들어지는 어셈블리어도 각각 다르게 된다.

레지스터의 크기와 개수, 저장된 데이터 형의 표현도 달라집니다.


모든 범용 컴퓨터는 기본적으로 동일한 기능을 수행하지만, 기능을 어떤 과정에 거쳐 수행할지는 다를 수 있고, 이런 차이가 어셈블리어에 반영되게 되는것이지요.


기계어는 CPU가 직접 해독하고 실행할 수 있는 비트 단위로 쓰인 컴퓨터 언어입니다. 이러한 기계어는 0과 1로 이루어진 이진수로 이루어져있기 때문에 사람들이 이해하기가 어렵습니다.

이러한 점을 보완하기 위해서 기계어를 사람이 이해하기 쉬운 기호와 1:1 대응시켜 기호화한 프로그래밍 언어를 어셈블리어라고 합니다.


예를들어


10110000 01100001  이라는 기계어가 있습니다. 이것을 어셈블리어로 옮겨쓰면 다음과 같습니다.


mov al, 061h. 


명령어 mov는 영어의 move를 변형한 기호입니다. al은 CPU안에 있는 변수를 저장하는 레지스터의 하나이지요. 그리고, 061h는 16진수 61입니다.


mov al, 061h의 뜻은 "16진수 61을 al레지스터에 넣어라!!" 라는 뜻입니다. 




자 이전의 10110000 01100001 이라는 기계어보다 더 이해하기가 쉽지요?

어셈블리어는 이런식으로 구성되어 있습니다.




레지스터



리버스 엔지니어링을 하기위해서는 많은 공부를 해야하지만 그중에 하나가 바로 레지스터 입니다.

리버스 엔지니어링을 한번이라도 하신 분들은 OllyDBG.exe로 디버깅 하면서 우측 상단에 EAX, EBX등으로 되어있는것을 한번쯤 보셨을 것입니다.


이것이 바로 OllyDBG.exe에서 보여주는 레지스터 정보입니다.



레지스터란 무엇일까?


레지스터란 극히 소량의 데이터나 처리중인 중간결과를 일시적으로 기억해 두는 고속의 전용영역을 레지스터라고 한다. 한 단어 또는 여러 단어,

때로는 수의 자릿수의 정보를 기억하는 장치이며 특정 목적에 사용되고,  수시로 그 내용을 이용할 수 있도록 되어있습니다.



레지스터는 범용레지스터, 세그먼트 레지스터, 상태 플래그 레지스터, 명령 포인터 레지스터로 나눌 수 있습니다.



범용 레지스터


 범용적으로 사용되는 레지스터 입니다. IA-32 에서는 레지스터들의 크기는 32Bit입니다.



범용 레지스터 종류


EAX (Extended Accumulator Register)

 

 산술(덧셈, 곱셈, 나눗셈 등등), 논리 연산을 수행할 때 사용되며 함수의 반환값이 이 레지스터에 저장된다.

 

32Bit로 구성되어있으며, EAX를 반으로 쪼개면 AX(16Bit)가 됩니다.

 또 다시 AX를 반으로 쪼개면 AH, AL로 나뉘고 각자 8Bit를 가지게 됩니다.



EBX (Extended Base Register)


EBX는 DS 세그먼트에 대한 포인터를 주로 저장하고 ESI나 EDI와 결합하여 인덱스에 사용됩니다.

EBX는 메모리 주소 지정을 확장하기 위한 인덱스로 사용될 수 있는 유일한 범용 레지스터입니다.


다른 레지스터와 마찬가지로 32Bit로 구성되어 있으며, EBX를 반으로 쪼개면 BX(16Bit)가 된다. BX를 또 반으로 쪼개면 BH, BL로 나뉘고 각자 8Bit를 가짐.



ECX (Extended Counter Register)


 반복 명령어(for, while)명령어 사용시 반복 카운터로 사용되는 레지스터입니다.

ECX레지스터에 반복할 횟수를 지정하고 반복 작업을 수행할 때 쓰입니다.



EDX (Extended Data Register)


데이터 레지스터입니다. 입, 출력 포인터 값을 저장할 때 사용됩니다.



ESI (Extended Source Index)


데이터 복사나 조작 시 Source Data의 주소가 저장됩니다. 

ESI 레지스터가 가리키는 주소의 데이터를 EDI 레지스터가 가리키는 주소로 복사하는 용도로 많이 사용된다.



EDI (Extended Destination Index)


복사 작업 시 Destination의 주소가 저장됩니다. 주로 ESI 레지스터가 가리키는 주소의 데이터가 복사됩니다.



ESP (Extended Stack Pointer)


하나의 스택 프레임의 끝 지점 주소가 저장됩니다. 



EBP (Extended Base Pointer)


하나의 스택 프레임의 시작 지점 주소가 저장됩니다. 현재 사용되는 스택 프레임이 소멸되지 않는 

동안 EBP 의 값은 변하지 않습니다. 현재의 스택 프레임이 소멸되면

이전에 사용되던 스택 프레임을 가리키게 됩니다.


이상으로 어셈블리어와 레지스터에 대한 포스팅을 마치겠습니다.

'관련지식들' 카테고리의 다른 글

스택이란? (Stack)  (0) 2018.10.01
메모리 구조  (0) 2018.10.01