719 words
4 minutes
명령어 집합 구조에 대해 알아보자
TL;DR
ISA(Instruction Set Architecture)는 명령어의 집합으로, 각 마이크로프로세서마다 사용하는 ISA가 다르다. 대표적인 ISA에는 x86-64, ARM, AVR 등이 있으며 다양한 이유는 모든 컴퓨터가 요구하는 성능이 다르기 때문이다.
x86-64
고성능 프로세서를 설계하기 위해 사용된다. 하지만 많은 전력을 소모하며 발열도 상대적으로 심하다. 따라서 안정적으로 전력을 공급할 수 있는 Desktop, Laptop 등에 사용되며, 스마트폰이나 임베디드 기기와 같이 발열과 전력 소모가 적어야하는 기기에서는 사용하기 힘들다.
x86-64에서 64는 CPU가 한번에 64비트를 처리할 수 있다는 것이며 이처럼 한번에 처리할 수 있는 데이터의 크기를 WORD라고 부른다.
x86-64 아키텍쳐의 레지스터
- General Register
다목적으로 사용되는 레지스터. 종류가 나눠져있긴하나 개발자의 의도에 따라 다르게 사용될 수 있다.
이름 | 설명 |
---|---|
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) | 스택의 바닥을 가리키는 포인터 |
- Segment Register
cs, ss, ds, es, fs, gs 총 6가지 세그먼트 레지스터가 존재하며, 각 레지스터의 크기는 16비트이다.
cs, ds, ss 레지스터는 코드 영역과 데이터, 스택 메모리 영역을 가리킬 때 사용되고, 나머지 레지스터는 운영체제 별로 용도를 결정할 수 있도록 범용적인 용도로 제작된 세그먼트 레지스터이다.
- Instruction Pointer Register
CPU가 어느 부분의 코드를 실행할지 가리키는 레지스터. x64 아키텍처의 명령어 포인터 레지스터는 rip이며, 크기는 8바이트이다.
- Flag Register
프로세스의 현재 상태를 나타내기 위해서 사용하는 레지스터. 깃발을 올리고 내리듯 비트들로 CPU의 상태를 표현한다.
이름 | 설명 |
---|---|
CF(Carry Flag) | 부호 없는 수의 연산 결과가 비트의 범위를 넘을 경우 설정 됩니다. |
ZF(Zero Flag) | 연산의 결과가 0일 경우 설정 됩니다. |
SF(Sign Flag) | 연산의 결과가 음수일 경우 설정 됩니다. |
OF(Overflow Flag) | 부호 있는 수의 연산 결과가 비트 범위를 넘을 경우 설정 됩니다. |
명령어 집합 구조에 대해 알아보자
https://fodo.dev/posts/algorithm/instruction-set-architecture/