저번 포스팅에 이어서 이번에는 Basic Program Excution Register (BPER) 을 조금 더 심화적으로 알아보도록 할겁니다.

 

1.  Basic Purpose Register - 범용레지스터 (32 bit, 8개)

    - 산술연산 (ADD, SUB, XOR , OR 등) 명령어에서 상수 / 변수의 값을 저장하는 용도로 사용

 

1-2. 종류     

    - EAX : Accumulator for operands and result datas -> 일반적으로 함수의 리턴값에 사용
    - EBX : Pointer to data in the DS segment
    - ECX : Counter for String and Loop operations -> 반복문 명령어에서 반복 카운터로 사용
    - EDX : I/O Pointer

 

지금현재 8개의 레지스터중 4개를 살펴보았습니다. (그럼 나머지 4개는?)

4개는 아래와 같으며 4개씩 따로 살펴보는 이유는 주로 연산과 관련된 레지스터와 메모리의 주소를 저장하는

포인터로 사용되는 레지스터이기 때문에 기능적인 부분에서 차이가 있습니다.

 

1-3. 종류

    - EBP : Pointer to data on the stack (in the SS segment)

      함수가 호출되었을때 ESP를 저장하고 있다가 함수가 리턴하기 직전에 ESP에 값을 되돌려줌

    - ESI : Source Pointer for String operands

    - EDI : Destination Pointer for String operands

    - ESP : Stack Pointer (in the SS segment) 

     스택 메모리의 주소

 

2. Segment Register - 세그먼트 레지스터 (16 bit, 6개) 

- 세그먼트라는 메모리의 한 영역의 주소를 지정하는 레지스터

- 세그먼트 : 프로그램에 정의된 코드나 데이터 및 특정 영역을 저장하는 곳

 

2-2. 종류

보시면 여러가지의 세그먼트 들이 존재합니다만, 처음에 중요하게 살펴봐야 할 세그먼트 레지스터는  DS 입니다. 

먼저 종류들을 살펴보겠습니다. 

 

CS - Code Segment 실행될 기계 명령어를 포함하는 영역   

      - EIP가 있기때문에 직접적으로 볼 일이 많이 없음 

DS - Data Segment 프로그램의 정의된 데이터나 상수, 작업영역을 포함

      - 레지스터에서 프로그램에 저장된 데이터나, 상수, 변수 등을 읽어올때 접근

SS - Stack Segment 스택 세그먼트

     - 컴파일 과정에서 데이터가 스택에 쌓이게 되는데 EBP / ESP가 있기때문에 볼 일이 많지 않음

ES - Extra Segment 메모리의 주소를 다루는 스트링(문자열 연산)에 사용

 

자세한건 여기를 참고하시면 좋을 것 같습니다.

 

https://ko.wikipedia.org/wiki/X86_%EB%A9%94%EB%AA%A8%EB%A6%AC_%EB%B6%84%ED%95%A0

 

x86 메모리 분할 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. x86 메모리 분할(x86 memory segmentation)은 인텔 x86 명령어 구조를 사용하는 컴퓨터에서 구현된 메모리 분할기법을 말한다. 메모리 분할은 1978년 발표된 인텔 8086에서

ko.wikipedia.org

 

3. Program Status and Control Registers - 프로그램의 제어/ 상태 (플래그 레지스터, 32bit, 1개)

산술 연산 결과의 상태를 보여주는 flag bit들이 모인 레지스터
산술 연산시 CPU에 의해 자동적으로 세팅되며 , 프로세서의 현재 상태를 결정

 

지금 보이는 그림은 Flag 레지스터에서 확장된 버전인 EFlag 레지스터 입니다.

여기에서 발생하는 플래그들의 내부적인 부분을 알아보겠습니다.

 

중요하게 봐야할 부분은 3가지 입니다. 

 

ZF - Zero Flag

- 연산결과가 0이면 1로 설정 -> ZF = 1

OF - Overflow Flag

- 부호가 있는 수(Signed integer)의 오버플로우가 발생하면 1로 설정

- MSB(최상위 비트)가 변경이되면 1로 설정

CF - Carry Flag

- 부호가 없는 수 (Unsigned integer)의 오버플로우가 발생하면 1로 설정 

 

4. Instruction Pointer - 명령어 포인터 레지스터

CPU가 처리할 명령어의 주소를 나타내는 레지스터

CPU는 EIP/IP에 저장되어있는 주소의 명령을 수행한 후, 명령어의 길이만큼 값을 증가

사용자가 직접 수정할 수 없음 

-> 다른 명령어를 사용하여 간접적으로 변경 (JMP, CALL, RET...etc) 

 

이번에는 레지스터에 대해서 알아보았습니다. 

이번 포스팅에 언급한 레지스터 말고도 FS, GS, PF. TF 등등 아직 봐야할 레지스터들이 있지만 

종류가 많고, 봐야할것도 많기 때문에 한번에 전부다 알지는 못할 것입니다. 따라서 이것들을 이해하기 위해서는

직접 예제들을 분석해보는 시간을 가지면서 익숙해지다 보면 알게 될 거라고 생각합니다.

이번에는 레지스터에 대해서 알아보았습니다. 

다음 포스팅에서는 스택에 대해서 알아보도록 하겠습니다.

 

+ Recent posts