[Dreamhack] Computer Architecture
Background: Computer Architecture
서론
CPU가 사용하는 명령어와 관련된 설계를 명령어 집합구소(Instruction Set Architecture, ISA)라고 한다.
그 중 가장 널리 사용되는 ISA 중 하나가 x86-64 아키텍쳐이다.
컴퓨터 구조 💻
컴퓨터가 효율적으로 작동할 수 있도록 하드웨어 및 소프트웨어의 기능을 고안하고, 이들을 구성하는 방법이다.
컴퓨터의 기능 구조에 대한 설계, 명령어 집합구조, 마이크로 아키텍처, 기타 하드웨어 및 컴퓨팅 방법에 대한 설계 등이 포함된다.
컴퓨터의 기능 구조에 대한 설계 | 명령어 집합구조 | 마이크로 아키텍처 | 하드웨어 및 컴퓨터 방법론 |
효율적인 연산을 위한 기능을 설계하는 분야 폰 노이만 구조 하버드 구조 수정된 하버드 구조 |
CPU가 처리해야하는 명령어를 설계 x86, x86-64 ARM MIPS AVR |
CPU의 하드웨어적 설계. 정의된 명령어 집합을 효율적으로 처리할 수 있도록 함 캐시 설계 파이프라이닝 분기예측 비순차적 명령어 처리 |
직접 메모리 접근 |
x86-64 아키텍쳐: 레지스터
레지스터는 CPU가 데이터를 빠르게 저장하고 사용할 때 이용하는 보관소이다. 산술 연산에 필요한 데이터 저장이나 주소를 저장하고 참조하는 등의 용도로 사용된다.
x64 아키텍처에는 범용 레지스터, 세그먼트 레지스터, 명령어 포인터 레지스터, 플래그 레지스터가 존재한다
범용 레지스터( 디스어셈블 하다보면 보였던게 범용레지스터 구나!!!!)
이름(64bit) | 이름(32bit) | 용도 |
rax | eax | 함수의 반환 값 |
rcx | ecx | 반복문의 반복 횟수, 각종 연산의 시행 횟수 |
rsi | esi | 데이터를 옮길 때 원본을 가리키는 포인터 |
rdi | edi | 데이터를 옮길 때 목적지를 가리키는 포인터 |
rsp | esp | 사용중인 스택의 위치를 가리키는 포인터 |
rbp | ebp | 스택의 바닥을 가리키는 포인터 |
(디스어셈블 하며 자주 보고 기억에 남는 레지스터는 굵은 글씨로 표시했다 반가운마음에 ㅎㅎ)
자주봐서 눈에 익혀두면 디스어셈블 할 때도 도움이 될 것 같다.
세그먼트 레지스터
x64 아키텍처에는 cs, ss, ds, es, fs, gs 총 6개의 세그먼트 레지스터가 존재한다. 각 레지스터의 크기는 16bit이다.
현재 cs, ds, ss 레지스터는 코드 영역과 데이터, 스택 메모리 영역을 가리킬 때 사용되고 나머지는 운영체제가 용도를 결정한다.
명령어 포인터 레지스터
CPU가 어느 부분의 코드를 실행하지 가리킨다. x64 아키텍처의 명령어 레지스터는 rip이며 크기는 8bit이다.
플래그 레지스터(이건 처음 들어본다..)
프로세서의 현재 상태를 저장하고 있는 레지스터이다. x64아키텍처에선 RFLAGS라고 불리는 64bit 크기의 플래그 레지스터가 존재한다.
플래그 | 의미 |
CF | 부호 없는 수의 연산 결과가 비트의 범위를 넘을 경우 설정 된다 |
ZF | 연사의 결과가 0일 경우 설정 된다 |
SF | 연산의 결과가 음수일 경우 설정 된다 |
OF | 부호 있는 수의 연산 결과가 비트 범위를 넘을 경우 설정 된다 |
Quiz
rax = 0x123456789abcdef 일 때, al은??
rax는 64비트 레지스터이며 al은 rax의 하위 8비트를 나타낸다. 0x123456789abcdef 에서 가장 낮은 8비트는 오른쪽부터 2자리인 0xef 이다!! 2자리인 이유는 8비트는 16진수로 표현될 때 두 자리 수이기 때문!
rax = 0x0123456789abcdef 일 때, ah의 값은?
ah는 ax의 상위 8비트를 나타낸다. 따라서 ax는 rax의 하위 16비트를 나타낸다 즉 오른쪽에서부터 4자리! 0xcdef 그럼 ah는 0xcdef의 외쪽에서 2자리! 0xcd
rax = 0x0123456789abcdef 일 때, eax의 값은?
eax는 rax의 하위 32비트!! 0x123456789abcdef 에서 오른쪽부터 8자리! 0x89abcdef
rax = 0x0123456789abcdef 일 때, ax의 값은?
ax는 위에서 구했다~ rax의 하위 16비트 즉 오른쪽에서 4자리! 0xcdef
헷갈린다 복습 무조건 해야겠다