# 1. 어셈블리 언어 개요
## CPU 아키텍쳐
- CPU의 내부 동작 방식과 구성 요소를 정의하는 설계 개념
- CPU 아키텍쳐에 따라 명령어, 레지스터 구조 등이 다름
- **x86, arm**, mips, Power PC 등
### x86
- 32bit architecture
- 64bit 버전
- Windows, Linux, Mac
### arm
- 32bit architecture
- 64bit 버전
- 모바일 기기 및 임베디드 시스템
## 어셈블리어
### 어셈블리어
- ==기계어와 일대일 대응==이 되는 저급언어
### 기계어
- ==0과 1로 이루어진 컴퓨터==가 이해할 수 있는 언어
### 저급언어
- ==컴퓨터가 이해하기 쉬운== 언어
- 어셈블리어, 기계어
### 고급언어
- ==사람이 이해하기 쉬운== 언어
- C언어, 자바, 파이썬 등
---
고급언어 -> 컴파일러 -> 기계어
고급언어 <- 디컴파일러 <- 기계어 `(완벽 X)`
어셈블리어 -> 어셈블러 -> 기계어
어셈블리어 <- 디스어셈블러 <- 기계어 (일대일 대응)
## 어셈블리어를 공부하는 이유
- 리버싱
- 시스템해킹
- 프로그램 패치
- 디컴파일러 버그
-- 디컴파일을 정상적으로 하지 못하는 경우 **(함수나 switch문 인식 못하는 경우, 함수가 너무 큰 경우)**
-- 디컴파일러에 나온 코드와 다르게 동작하는 경우 **(디컴파일된 코드만 보면 변수에 0또는 1만 삽입될 수 있지만 어셈블리로 보면 -1도 올 수 있는 경우)**
- 가젯 탐색
- 쉘코드 작성