어셈블리 명령어를 배우기 위해 알아야 하는 기초 배경지식이다.
컴퓨터 구조와 명령어 집합 구조, 그리고 인텔 x86-64에 대한 대략적으로 이해해보자.
1. 컴퓨터 구조(Computer Architecture)
- 폰 노이만 구조
- 중앙처리장치(Central Processing Unit, CPU)
- 연산과 제어
- 산술논리장치(Arithmetic Logic Unit, ALU)
- 제어장치(Control Unit) - CPU 제어
- 레지스터(Register) - CPU에 필요한 데이터 저장
- 💥기억장치가 있는데 CPU 안에 레지스터가 왜 필요한가?
- 기억장치(Memory)
- 저장
- 주기억장치(Random-Access Memory, RAM) - 프로그램 실행과정에 필요한 데이터들 임시 저장
- 보조기억장치(HDD, SSD) - 운영 체제, 프로그램 등과 같은 데이터 장기간 보관
- 버스(Bus)
- 장치 간 데이터나 제어 신호 교환
- 데이터 버스(Data Bus) - 데이터 이동
- 주소 버스(Address Bus) - 주소 지정
- 제어 버스(Control Bus) - 읽기/쓰기 제어
- 랜선, 데이터 전송 소프트웨어, 프로토콜
2. 명령어 집합 구조(Instrunction Set Architecture, ISA)
- CPU가 해석하는 명령어의 집합
- IA-32, x86-64(x64), MIPS, AVR 등 존재
3. x86-64 아키텍처(amd64, Intel64, IA-32e, EM64T .. )
A. x86-64 아키텍처
- n 비트 아키텍처
- 'n' 은 CPU가 한번에 처리할 수 있는 데이터의 크기
- WORD : CPU가 이해할 수 있는 데이터의 단위
- WORD가 작으면, CPU가 제공할 수 있는 가상메모리의 크기가 작아 부족한 경우가 생길 수 있다.
B. 레지스터(Register)
- 레지스터 : CPU가 데이터를 빠르게 저장하고 사용할 때 이용하는 보관소
a) 범용 레지스터(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) | 스택의 바닥을 가리키는 포인터 |
b) 세그먼트 레지스터(Segment Register)
- cs, ds, ss 레지스터 : 코드 영역과 데이터, 스택 메모리 영역을 가리킬 때 사용
- es,fs, gs 레지스터 : 운영체제 별로 용도를 결정
- 각 레지스터의 크기는 16비트
c) 명령어 포인터 레지스터(Instruction Pointer Register, IP)
- CPU가 어느 부분의 코드를 실행할 지 가리키는 역할을 수행
- rip : 크기는 8바이트
d) 플래그 레지스터(Flag Register)
- 프로세서의 현재 상태를 저장하고 있는 레지스터
- RFLAGS : 크기는 64비트
- 깃발을 올리고, 내리는 행위처럼 -> 자신을 구성하는 여러 비트들로 CPU의 현재 상태 표현
- 아래 표는 자주 쓰이는 플래그
| 플래그 | 의미 |
| CF (Carry Flag) | 부호 없는 수의 연산 결과가 비트의 범위를 넘을 경우 설정 |
| ZF (Zero Flag) | 연산의 결과가 0일 경우 설정 |
| SF (Sign Flag) | 연산의 결과가 음수일 경우 설정 |
| OF (Overflow Flag) | 부호 있는 수의 연산 결과가 비트 범위를 넘을 경우 설정 |
e) 레지스터 호환
- x86-64 아키텍처 (64비트)
- rax, rbx, rcx, rdx, rsi, rdi, rsp, rbp
- IA-32 아키텍처 (확장된 위의 레지스터의 하위 32비트를 가리킴)
- eax, ebx, ecx, edx, esi, sdi, esp, sbp
- IA-16 아키텍처 (확장된 위의 레지스터의 하위 16비트를 가리킴)
- ax, bx, cx, dx, si, di, sp, bp