1️⃣ Assembly 기초
📜프로그램과 메모리
- 프로세스 : 메모리에 로드된 프로그램
- 프로그램은 크게 코드, 데이터로 나누어 볼 수 있음
- 프로그램에서 사용하는 코드와 데이터는 메모리에 로드되며, 코드 실행 흐름에 따라 변화하는 값들은 스택 또는 힙에 쌓이게됨
- 운영체제는 프로세스들의 독립적인 공간을 보장함
- 다른 프로세스의 영역을 함부로 접근하는 것을 막는 매커니즘이 존재
- 프로세스와 메모리 관리는 운영체제에 의해서 이루어짐
📜스택(Stack)
- LIFO 구조 : Last In - First Out, 가장 처음에 들어간 데이터가 가장 나중에 옴
- 함수 호출 시 생성되는 지역 변수와 매개 변수가 저장되는 영역
- 높은 주소에서 낮은 주소로 신장
📜힙(Heap)
- 동적으로 메모리 할당 시 사용하는 영역
- 낮은 주소에서 높은 주소로 신장
📜데이터 타입(Data Type)
- 비트(bit) : 0 또는 1
- 바이트(byte) : 8비트
- 워드(word) : 16비트
- 더블 워드(dword) : 32비트 (ARM 아키텍처에서는 워드)
- 쿼드 워드(qword) : 64비트 (ARM 아키텍처에서는 더블워드)
- 키로 바이트(kb) : 1024비트
- 메가 바이트(mb) : 1024 키로 바이트
- 기가 바이트(gb) : 1024 메가 바이트
📜레지스터(Register)
- 빠른 연산을 위해 사용됨 (수행 문맥, 제어 정보, 데이터 임시 저장)
- 레지스터는 CPU에 내장된 저장 공간으로, CPU 아키텍처마다 다름 

📜명령어 세트(Instruction Sets)
- 아키텍처 별로 다른 명령어와 사용방법이 존재하며 크게 데이터 이동, 산술/논리 연산, 제어흐름 명령어 존재 - 데이터 이동 : 메모리 <-> 메모리 , 메모리 <-> 레지스터, 레지스터 <-> 레지스터 - 산술/논리 연산 : 더하기, 빼기, 비트연산, 소수점 계산 등 - 제어흐름 : 분기, 호출, 반환 등 
📜어셈블리 언어 기본형태
- {instruction} destination, source (둘중 하나만 메모리 주소가 될 수 있음) ex) add a,b > a = a+b
📜주소 표기법
- 빅 엔디안(Big Endian) > 주로 유닉스 시스템인 RISC 프로세서 계열에서 사용하는 바이트 순서 > 메모리 시작 주소를 상위 바이트로부터 기록 > 네트워크 패킷에서도 이 방식을 사용
- 리틀 엔디안(Little Endian) > 주로 인텔 프로세서 계열에서 많이 사용되는 바이트 순서 > 메모리 시작 주소를 하위 바이트로부터 기록
EX) 0xabcd : 메모리에 abcd 순서로 기록됨 (빅 엔디안) 메모리에 dcba 순서로 기록됨 (리틀 엔디안)