프로그래밍 언어 공부/어셈블리어

간단한 레지스터 기초 / SASM을 활용해 레지스터 사용해보기

설탕중독 2022. 5. 11. 20:57

레지스터란? 

CPU(Central Processing Unit)가 요청을 처리하는 데이터의 임시저장 공간이다. CPU 내부에 존재하며 

자체적으로 데이터를 저장할 수 없는 CPU 대신 연산 제어, 디버깅 등 다목적으로 활용된다.

저장공간이 매우 작고 비싸지만 메모리나 하드디스크에 비해 굉장히 빠른 처리속도를 가지고 있다.

 

레지스터는 64, 32비트 머신을 구분하는 기준으로, 한 번에 처리할 수 있는 비트 수이다.

 

비트(bit)는 컴퓨터에서 처리하는 정보의 최소 표현 단위이다. 0과 1의 조합으로 수 계산이나 논리 등을 표현한다.

바이트(byte)는 8개의 비트를 모은 것을 1바이트라고 표현한다. 8 bit = 1 byte

 

8 bit = 1 byte

16 bit = 2 byte = 1 word

32 bit = 4 byte = 2 word = 1 dword (double-word)

64 bit = 8 byte = 4 word = 1 qword (quad-word)


레지스터 내부는 다양한 역할을 하는 기능들로 세분화되어 있다.

그중에서 가장 기본적인 범용 레지스터 부분을 짚고 넘어가겠다.

 

범용 레지스터 (General Purpose Register)

레지스터에서 가장 많이, 가장 자주 쓰이는 중요한 부분이다.

산술 연산이나 산수, 정수, 주소 등을 저장할 때 쓰이거나 특수한 목적으로 사용되기도 한다.

 

출처 - https://plummmm.tistory.com/113

범용 레지스터를 그림으로 표현했다.

 

산술 연산 레지스터

AX : 산술 논리 연산에 사용되고 함수의 리턴 값이 저장된다.

BX : 간접 번지 지정 시에 사용된다.

CX : 반복문의 반복 횟수 지정 시에 사용되고 문자열 처리에도 사용된다.

DX : AX의 보조적인 역할을 한다. I/O 어드레스를 지정할 때 사용되거나 AX와 합쳐져서

확장된 메모리로 사용된다.

 

인덱스 레지스터

SI (Source index) : 복사나 비교를 할 때 사용되는 소스 문자.

DI (Destination index) : 마찬가지로 복사나 비교를 할 때 사용되는 목적지 문자이다. stos, movs를 사용할 때 

1씩 증가한다.

 

포인터 레지스터

SP (Stack Pointer) : 스택의 가장 윗부분을 가리킨다. 스택에 값이 쌓이면 ESP도 증가

BP (Base Pointer) : 스택의 가장 밑바닥의 주소를 가리킨다. EBP 밑에는 Return 값이 있다.

 

64비트일 때 각 범용 레지스터에는 R 접두사가 붙고 

32비트일 때 각 범용 레지스터에는 E 접두사가 붙는다.

 

이외에도 다양한 레지스터 내부 구조가 있지만 지금은 깊게 들어가지는 않겠다.


SASM 프로그램을 실행 시켜서 간단한 코드를 작성했다.

내가 추가한 코드는 mov 명령어를 이용해 eax, rbx, cl 레지스터에 16진수 정수값을 넣었다.

그리고 Debug(이미지의 붉은 동그라미)를 통해 코드를 하나씩 살펴보며 실제로 레지스터에

값이 입력되는지 확인했다.

 

 

보는바와 같이 rax, rbx, rcx 레지스터에 실제로 값이 입력됐다.