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 아키텍처마다 다름 ![image-20240909093421420](/images/어셈블리 기초/image-20240909093421420.png)

![image-20240909093429969](/images/어셈블리 기초/image-20240909093429969.png)

📜명령어 세트(Instruction Sets)

- 아키텍처 별로 다른 명령어와 사용방법이 존재하며 크게 데이터 이동, 산술/논리 연산, 제어흐름 명령어 존재 - 데이터 이동 : 메모리 <-> 메모리 , 메모리 <-> 레지스터, 레지스터 <-> 레지스터 - 산술/논리 연산 : 더하기, 빼기, 비트연산, 소수점 계산 등 - 제어흐름 : 분기, 호출, 반환 등 ![image-20240909093443520](/images/어셈블리 기초/image-20240909093443520.png)

📜어셈블리 언어 기본형태

- {instruction} destination, source (둘중 하나만 메모리 주소가 될 수 있음) ex) add a,b > a = a+b

📜주소 표기법

- 빅 엔디안(Big Endian) > 주로 유닉스 시스템인 RISC 프로세서 계열에서 사용하는 바이트 순서 > 메모리 시작 주소를 상위 바이트로부터 기록 > 네트워크 패킷에서도 이 방식을 사용

- 리틀 엔디안(Little Endian) > 주로 인텔 프로세서 계열에서 많이 사용되는 바이트 순서 > 메모리 시작 주소를 하위 바이트로부터 기록

EX) 0xabcd : 메모리에 abcd 순서로 기록됨 (빅 엔디안) 메모리에 dcba 순서로 기록됨 (리틀 엔디안)