Hongfluenza

8086 CPU 레지스터 구조 본문

STUDY/SYSTEM

8086 CPU 레지스터 구조

Hongfluenza 2019. 8. 11. 22:58
레지스터(Register)란?

CPU의 내부에 존재하는 고속 메모리로 요청을 처리하는 데 필요한 데이터를 일시적으로 저장하는 공간이다.

CPU 처리를 위해 데이터를 레지스터라는 기억 공간에 저장해두었다가 CPU에서 처리를 하고 해당 결과값 역시 레지스터에 저장하게 된다. 레지스터는 공간은 작지만 CPU와 직접 연결되어 연산 속도가 메모리보다 훨씬 빠르다. 

 

 

레지스터에는 목적에 따라 

  • 범용 레지스터(General-Purpose Register)
  • 세그먼트 레지스터(Segment Register)
  • 플래그 레지스터 (Program status and control Regiter)
  • 인스트럭션 레지스터 (instruction Register)

로 나눌 수 있다.

 

 

범용 레지스터(General-Purpose Register)

범용 레지스터 구조

- 논리 연산과 수리 연산에 사용되는 피연산자, 주소를 계산하는데 사용되는 피연산자, 그리고 메모리 포인터가 저장되는 레지스터

- 프로그래머가 임의로 조작할 수 있게 허용되어 있는 레지스터. 4개의 32bit 변수라고 생각하면 된다.

- 16bit 시절 : AX, BX, CX, DX   →  32bit로 전환되면서 E(Extended)가 앞에 붙어 EAX, EBX, ECX, EDX 등으로 불린다.

- AX의 상위 부분 : AH(High) , AX의 하위 부분 : AL(Low)

 

범용 레지스터의 각각의 목적
  • EAX : 피연산자와 연산 결과의 저장소
  • EBX : DS segment 안의 데이터를 가리키는 포인터
  • ECX : 문자열 처리나 루프를 위한 카운터
  • EDX : I/O 포인터
  • ESI : DS 레지스터가 가리키는 data segment 내의 어느 데이터를 가리키고 있는포인터. 문자열 처리에서 source를 가리킴
  • EDI : ES 레지스터가 가지고 있는 data segment 내의 어느 데이터를 가리키고 있는 포인터. 문자열 처리에서 destination을 가리킴.
  • ESP : SS 레지스터가 가리키는 stack segment의 맨 꼭대기를 가리키는 포인터
  • EBP : SS 레지스터가 가리키는 스텍 상의 한 데이터를 가리키는 포인터

 

 

세그먼트 레지스터(Segment Register)

세그먼트 레지스터 구조

- code segment, data segment, stack segment를 가리키는 주소가 들어가 있는 레지스터

 

 

 

세그먼트 레지스터가 가리키는 세그먼트들

- 세그먼트 레지스터는 프로세스의 특정 세그먼트를 가리키는 포인터 역할을 함.

  • CS 레지스터 → code segment
  • DS, ES, FS, GS 레지스터 → data segment
  • SS 레지스터 → stack segment

- 이렇게 세그먼트 레지스터가 가리키는 위치를 바탕으로 원하는 segment 안의 특정 데이터, 명령어들을 정확하게 끄집어 낼 수가 있게 된다.

 

 

 

플래그 레지스터(Program status and control Regiter)

플래그 레지스터 구성

- 프로그램의 현재 상태나 조건 등을 검사하는데 사용되는 플래그들이 있는 레지스터

- 컨트롤 플래그 레지스터는 상태 플래그, 컨트롤 플래그, 시스템 플래그들의 집합이다.

- 시스템이 리셋되어 초기화 되면 이 레지스터는 0x00000002의 값을 가진다.

- 1, 3, 5, 15, 22~31번 비트는 예약되어 있어 소프트웨어에 의해 조작될 수 없게 되어 있다.

 

status flags
  • CF : Carry flag. 연산을 수행하면서 carry 혹은 borrow가 발생하면 1이 된다. 
    carry와 borrow는 덧셈 연산 시 bit bound를 넘어가거나 뺄셈을 하는 데 빌려오는 경우를 말한다.
  • PF : Parity flag. 연산 결과 최하위 바이트의 값이 1이 짝수일 경우에 1이 된다. 패리티 체크를 하는데 사용된다.
  • AF : Adjust flag. 연산 결과 carry나 borrow가 3bit 이상 발생할 경우 1이 된다.
  • ZF : Zero flag. 연산 결과가 zero임을 가리킨다. if문 같은 조건문이 만족될 경우 set된다.
  • SF : Sign flag. 연산 결과 최상위 비트의 값과 같다. Signed 변수의 경우 양수이면 0, 음수이면 1이 된다.
  • OF : Overflow flag. 정수형 결과값이 너무 큰 양수이거나 너무 작은 음수여서 피연산자의 데이터 타입에 모두 들어가지 않을 경우 1이 된다.
  • DF : Direction flag. 문자열 처리에 있어서 1일 경우 문자열 처리 instruction이 자동으로 감소(문자열 처리가 high address에서 low address로 이루어진다.), 0일 경우 자동으로 증가한다.
system flags
  • IF : Interrupt enable flag. 프로세서에게 mask한 interrupt에 응답할 수 있게 하려면 1을 준다.
  • TF : Trap flag. 디버깅을 할 때 single-step을 가능하게 하려면 1을 준다.
  • IOPL : I/O privilege level field. 현재 수행 중인 프로세스 혹은 task의 권한 레벨을 가리킨다. 현재 수행 중인 프로세스의 권한을 가리키는 CPL이 I/O address 영역에 접근하기 위해서는 I/O privilege level보다 작거나 같아야 한다.
  • NT : Nested task flag. Interrupt의 chain을 제어한다. 1이 되면 이전 실행 task와 현재 task가 연결되어 있음을 나타낸다.
  • RF : Resume flag. Exception debug 하기 위해 프로세서의 응답을 제어함.
  • VM : Virtual-8086 mode flag. Virtual-8086 모드를 사용하려면 1을 준다.
  • AC : Alignment check flag. 이 비트와 CR0 레지스터의 AM 비트가 set되어 있으면 메모리 레퍼런스의 alignment checking이 가능하다.
  • VIF : Virtual interrupt flag. IF flag의 가상 이미지. VIP flag와 결합시켜 사용함.
  • VIP : Virtual interrupt pending flag. 인터럽트가 pending(경쟁 상태) 되었음을 가리킨다.
  • ID : Identification flag. CPUID instruction을 지원하는 CPU인지를 나타낸다.
Instruction Pointer

- 다음 실행할 명령어가 있는 현재 code segment의 offset 값을 가진다. → 하나의 명령어 범위에서 선형 명령 집합의 다음 위치를 가리킬 수 있다.

- JMP, Jcc, CALL, RET와 IRET instruction이 있는 주소값을 가진다.

- EIP 레지스터는 소프트웨어에 의해 바로 엑세스 할 수 없고 control-transfer instruction (JMP, Jcc, CALL, RET)이나 interrupt와 exception에 의해서 제어된다.

- EIP 레지스터를 읽을 수 있는 방법은 CALL instruction을 수행하고 나서 프로시저 스텍(procedure stack)으로부터 리턴하는 instruction의 address를 읽는 것이다. 프로시저 스텍의 return instruction pointer의 값을 수정하고 return instruction(RET, IRET)을 수행함으로 해서 EIP 레지스터의 값을 간접적으로 지정해 줄 수 있다.

 

 

인스트럭션 포인터(Instruction Pointer)

인스트럭션 포인터 구조

- 다음 수행해야 하는 명령(instruction)이 있는 메모리 상의 주소가 들어가 있는 레지스터

 

 

...더보기

출처 : (달고나) 와우해커 BOF 기초문서

'STUDY > SYSTEM' 카테고리의 다른 글

setvbuf 함수  (0) 2018.04.30
[System] Intel과 AT&T 어셈블리어 문법  (0) 2018.04.09
함수 호출 규약(Calling Convention)  (0) 2018.04.09