> For the complete documentation index, see [llms.txt](https://krjaeh0.gitbook.io/j-log/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://krjaeh0.gitbook.io/j-log/programming/cs_basics/architecture/x8664architecture.md).

# x8664Architecture

1999년, AMD는 인텔의 32비트 CPU 아키텍처인 IA-32를 64비트로 확장한 AMD64 아키텍처를 발표했습니다. 이후 인텔을 비롯한 다양한 회사가 이를 기반으로 다양한 이름의 아키텍처를 발표했고, 보다 범용적이고 중립적으로 지칭되는 x86-64라는 명칭이 탄생했습니다. 현재 대다수의 개인용 PC는 x86-64 아키텍처를 기반으로 한 CPU를 탑재합니다.

## x86-64 아키텍처: 레지스터

{% hint style="info" %}
레지스터란? CPU 내부의 저장장치로, CPU가 빠르게 접근해서 사용할 수 있습니다. 산술 연산에 필요한 데이터를 저장하거나 주소를 저장하고 참조하는 등 다양한 용도로 사용됩니다.
{% endhint %}

**범용 레지스터**

* 주용도 외 임의의 용도로 사용될 수 있는 레지스터
* x86-64에서 각각의 범용 레지스터는 8바이트를 저장할 수 있다.
* 부호 없는 정수를 기준으로 2^64-1까지 표현할 수 있다.
* 자주 쓰이는 범용 레지스터들의 용도는 다음과 같다.

| 이름                         | 주용도                      |
| -------------------------- | ------------------------ |
| rax (accumulator register) | 함수의 반환 값                 |
| rbx (base register)        | x64에서는 주된 용도 없음          |
| rcx (counter register)     | 반복문의 반복 횟수, 각종 연산의 시행 횟수 |
| rdx (data register)        | x64에서는 주된 용도 없음          |
| rsi (source index)         | 데이터를 옮길 때 원본을 가리키는 포인터   |
| rdi (destination index)    | 데이터를 옮길 때 목적지를 가리키는 포인터  |
| rsp (stack pointer)        | 사용중인 스택의 위치를 가리키는 포인터    |
| rbp (stack base pointer)   | 스택의 바닥을 가리키는 포인터         |

* 외에도 x64에는 r8, r9, ... , r15까지 범용 레지스터가 존재한다.

**세그먼트 레지스터**

* x64 아키텍처에는 cs, ss, ds, es, fs, gs 총 6가지 세그먼트 레지스터가 존재
* 각 레지스터의 크기는 16비트다.
* x64 아키텍처로 확장되며 용도의 큰 변화가 생겼다.
* 과거에는 사용 가능한 물리 메모리의 크기를 키우는 용도로 사용되었다.
* 현대에는 cs, ds, ss 레지스터는 코드 영역과 데이터, 스택 메모리 영역을 가리킬 때 사용하고, 나머지 레지스터는 운영체제 별로 용도를 결정할 수 있도록 범용적인 용도로 제작된 세그먼트 레지스터다.
* 주로 메모리 보호를 위해 사용되는 레지스터

**명령어 포인터 레지스터**

* 프로그램의 코드는 기계어로 작성되어 있다.
* 이 중에서 CPU가 어느 부분의 코드를 실행할지 가리키는 것이 명령어 포인터 레지스터의 역할이다.
* x64 아키텍처의 명령어 레지스터는 rip이며, 크기는 8바이트다.

**플래그 레지스터**

* 프로세서의 현재 상태를 저장하고 있는 레지스터
* x64 아키텍처에는 RFLAGS라고 불리는 64비트 크기의 플래그 레지스터가 존재
* 과거 16비트 플래그 레지스터가 확장된 것
* 깃발을 올리고, 내리는 행위로 신호를 전달하듯, 자신을 구성하는 여러 비트들로 CPU의 상태를 표현

대표적인 플래그 비트:

| 플래그                | 의미                                    |
| ------------------ | ------------------------------------- |
| CF (Carry Flag)    | 부호 없는 수의 연산 결과가 비트의 범위를 넘을 경우 설정 됩니다. |
| ZF (Zero Flag)     | 연산의 결과가 0일 경우 설정 됩니다.                 |
| SF (Sign Flag)     | 연산의 결과가 음수일 경우 설정 됩니다.                |
| OF (Overflow Flag) | 부호 있는 수의 연산 결과가 비트 범위를 넘을 경우 설정 됩니다.  |

* 간단한 예로 a=3, b=5일 때, a에서 b를 빼는 연산을 하면, 연산의 결과가 음수이므로 SF가 설정된다.
* CPU는 SF를 통해 a가 b보다 작았음을 알 수 있게 된다.
* 실제 이러한 원리로 수의 대소를 비교하는 어셈블리 명령어가 있다.
* RFLAGS는 64비트이므로 최대 64개의 플래그를 사용할 수 있지만, 실제로는 오른쪽의 20여개의 비트만 사용한다.

**레지스터 호환**

* x86-64 아키텍처는 IA-32의 64비트 확장 아키텍처이며, 호환이 가능하다.
* IA-32에서 CPU의 레지스터들은 32비트 크기를 가진다.
* 명칭은 각각 eax, ebx, ecx, edx, esi, edi, esp, ebp였다.
* 호환성을 위해 위 레지스터들은 x86-64에서도 그대로 사용한다.
* rax, rbx, rcx, rdx, rsi, rdi, rsp, rbp가 이들의 확장 형태
* eax, ebx 등의 확장된 레지스터의 하위 32비트를 가리킨다.
  * 예를 들어 eax는 rax의 하위 32비트를 의미
* 과거 16비트 아키텍처인 IA-16과 호환을 위해 ax, bx, cx, dx, si, di, sp, bp는 eax, ebx, ecx, edc, esi, edi, esp, ebp의 하위 16비트를 가리킨다.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://krjaeh0.gitbook.io/j-log/programming/cs_basics/architecture/x8664architecture.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
