일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 시스템프로그래밍
- px4
- 리눅스커널
- 알고리즘
- 시스템
- pwn.college
- 취약점
- 어셈블리어
- C++
- Pwnable.kr
- kernel
- write up
- 드론
- C언어
- 시그널
- 컴퓨터구조
- Bandit
- Leviathan
- 워게임
- wargame
- 리버싱
- radare2
- css
- 리눅스 커널
- 리눅스
- 프로그래밍
- pwncollege
- 커널
- 시스템 프로그래밍
- 시스템해킹
- Today
- Total
Computer Security
#8 x86 구조 (레지스터 구조) 본문
레지스터 집합
범용 레지스터(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):산술 연산 후 자리올림이 발생했는지 여부를 나타낸다.
'컴퓨터구조&어셈블리어' 카테고리의 다른 글
#10 x86 구조 (어셈블리 프로그램의 구성) (0) | 2022.05.22 |
---|---|
#9 x86구조 (주소지정방식) (0) | 2022.05.21 |
#7 x86의 구조 (역사) (0) | 2022.05.19 |
#6 컴퓨터구조와 명령어 (0) | 2022.05.16 |
#5 컴퓨터 구조2 (0) | 2022.05.15 |