Computer Security

#8 x86 구조 (레지스터 구조) 본문

컴퓨터구조&어셈블리어

#8 x86 구조 (레지스터 구조)

쿠리 Kuri 2022. 5. 20. 18:30

레지스터 집합

 

 

범용 레지스터(General Purpose Register)

 -범용레지스터는 데이터를 임시로 저장하기 위해 주로 사용되며, 프로그래머가, 즉 소프트웨어적으로 임의로 접근 가능하다. 8086에는 16비트 범용 레지스터 AX, BX, CX, DX등이 있고, 상위 8비트와 하위 8비트를 각각 H(High)와 L(Low)로 접근할 수 있다.

AX(Accumulator): 주 누산기(primary accumulator)

 -입출력과 대부분의 산술 연산에서 사용된다. 예를 들어, 곱셈, 나눗셈, 변환 명령어들은 AX의 사용을 가정한다.

 

BX(Base) : 베이스 레지스터

 -인덱스로 사용될 수 있는 유일한 범용 레지스터다. 또한 베이스 레지스터로서 인덱스 레지스터 DI나 SI와 결합될 수 있다.

 -BX의 다른 일반적 용도는 계산이다.

 

CX(Counter): 루프 카운터

 -루프 횟수를 제어할 때 사용한다.

 -그 외에도 문자열 연산에 사용되거나 CL의 경우 비트 시프트나 회전 명령어에서 이동할 비트 수를 지정하기 위해 사용된다.

 

DX(Data): 데이터 레지스터

 -어떤 입출력 연산에서는 반드시 이 레지스터의 사용을 요구하고, 큰 수의 곱셈과 나눗셈 연산은 DX와 AX의 사용을 가정한다.

 

 

인덱스 레지스터(Index Register)

-인덱스 주소지정(Indexed addressing) 과 덧셈, 뺄셈에서 사용 가능

 

-SI(Source Index): 원시 인덱스 레지스터

  -문자열 조작 연산에서 필요하다. (배열같은)

  -이 경우 SI는 DS레지스터와 연관된다.

 

-DI(Destination Index): 목적지 인덱스 레지스터

  -문자열 조작 연산에서 필요하다. (배열같은)

  -이 경우 DI는 ES 레지스터와 연관된다.

 

 

 

스택 포인터(SP, Stack Pointer), 베이스 포인터(Base Pointer)

-SP와 BP는 스택 세그먼트 레지스터인 SS와 연관된다.

-SP는 스택의 꼭대기(Top)를 나타내는 오프셋 주소를 저장한다.

-BP는 스택으로 전달된 매개변수 값들을 처리하기 위한 베이스 레지스터로 사용된다.

-인덱스 레지스터인 SI나 DI와 결합될 수 있다.

 

스택은 LIFO(Last-in-First-Out)  후입선출!

 

 

명령어 포인터(IP, Instruction Pointer) = PC(Program Counter)

-다음에 실행될 명령어의 오프셋 주소를 저장한다.

-즉, 프로그램 카운터(PC,Program Counter)를 의미한다.

-명령어 코드는 코드 세그먼트에 저장되며, 코드 세그먼트의 시작 주소를 저장하는 CS레지스터와 연관되어 CS:IP와 같이 사용된다.

 

 

세그먼트 레지스터

-세그먼트 주소를 저장하는 레지스터

-20비트 주소를 16비트 레지스터로 나타내기 위해 8086은 세그먼트 단위로 메모리를 분할했으며, 각 세그먼트는 64KB의 크기를 갖는다.

-세그먼트 내부의 상대적 위치를 나타내기 위해서 오프셋(offset)값을 이용한다.

 

세그먼트 레지스터 + 오프셋 레지스터

CS X 16  + IP =20비트

DS X 16 + SI = 20비트

SS X 16 + SP = 20비트

ES X 16 + DI = 20비트

 

CS: Code  Segment 레지스터

-프로그램의 코드 세그먼트의 시작주소를 저장한다. 프로그램 카운터인 IP와 연관된다.

-IP에는 코드 세그먼트의 오프셋이 저장된다. CS와 IP의 값을 더하여 가져와야 할 다음 명령어의 주소를 구한다.

 

DS: Data Segment 레지스터

-프로그램의 데이터 세그먼트의 시작주소를 저장한다. 명령어는 이 주소를 사용하여 데이터의 위치를 알아낸다.

 

SS: Stack Segment 레지스터

-메모리 스택의 구현을 가능하게 한다.

-스택 세그먼트의 시작주소를 저장하고 스택 포인터인 SP와 연관된다.

-스택 세그먼트의 오프셋인 SP와 스택 세그먼트의 시작주소인 SS의 값을 더하면 스택의 Top주소를 얻을 수 있다.

 

ES: Extra Segment 레지스터

-문자열 연산에서 사용된다. 이 경우 ES 레지스터는 인덱스 레지스터인 DI와 연관된다. 프로그램이 ES레지스터를 사용할 경우에, 적절한 세그먼트 주소로 초기화해야 한다.

 

 

플래그 레지스터

-프로세서의 상태 플래그들을 나타내는 레지스터이다.

-컴퓨터의 상태나 연산 결과를 반영한다. 

-상태 레지스터(Status Register)라고도 부른다.

 

플래그 비트:

-OF(Overflow):산술 연산 후 오버플로우 발생 여부를 나타낸다.

-DF(Direction):문자열 데이터를 이동시키거나 비교할 때 왼쪽 또는 오른쪽의 방향을 결정한다.

-IF(interrupt):외부 인터럽트를 처리할지 무시(mask)할지 여부를 나타낸다.

-TF(Trap):싱글 스택 모드의 프로세서 연산을 허용한다. 디버깅에서 사용된다.

-SF(Sign):산술 연산 결과 값의 부호를 저장한다.

-ZF(Zero):산술 연산 결과가 0인지를 나타낸다.

-AF(Auxiliary carry):보조 캐리. 하프 캐리를 의미한다.

-PF(Parity):패리티 비트

-CF(Carry):산술 연산 후 자리올림이 발생했는지 여부를 나타낸다.

 

 

 

 

Comments